반응형
definelife.tistory.com/search/%EC%82%BC%EA%B0%81
위의 삼각함수가 게임에서 어떻게 활용되는지 사례를 통해 알아본다.
1. 플레이어의 이동
void PlayerMove(float _angle)
{
// Space Key 눌릴때
if (Input.GetKey(KeyCode.Space))
{
// Mathf.cos, sin -> Radian 0~2pi. Degree 0~360
// Degree to Radian : * Mathf.Deg2Rad
Vector2 direction = new Vector2(Mathf.Cos(_angle * Mathf.Deg2Rad), Mathf.Sin(_angle * Mathf.Deg2Rad));
// 이동하기
transform.Translate(moveSpeed * direction * Time.deltaTime);
// Time.deltaTime -> 프래임 간의 사이 차이를 곱한다.
// 컴퓨터의 성능과 무관하게 동일한 속도로 이동 할 수 있다.
}
}
유니티의 기능적 접근보다는 수학 이론으로 접근해보자. 본 함수에서는 각도(Degree)를 입력 받아서 vector를 생성해서 적용한다. 이 때 벡터의 x성분과 y성분에 삼각함수 (n*Con@, n*sin@)가 적용된다. 다만 Unity 의 Vector2에는 Radian 값이 입력으로 사용되므로 Mathf.Deg2Rad를 곱해준다. 결국 스페이스바 키가 눌리면 playerController가 _angle의 방향으로 이동한다.
2. 원운동으로 응용하기
// 원운동
// iteration : 0~360 1씩 증가
// Degree to radian
// circleScale : 원의 크기
//
int iteration = 0;
Vector2 direction = new Vector2(Mathf.Cos(iteration * Mathf.Deg2Rad), Mathf.Sin(iteration * Mathf.Deg2Rad));
transform.Translate(direction * (circleScale * Time.deltaTime));
iteration++;
if (iteration > 360) iteration -= 360;
iteration 변수가 0~360으로 계속 증가, 반복한다. 이를 direction에 반영하면서 원운동이 일어난다.
3. 총알 발사하기
int fireAngle = 0;
while (true)
{
GameObject tempObject = Instantiate(bulletObject, bulletContainer, true);
// bulletContainer 안에 bulletObject를 생성
Vector2 direction = new Vector2(Mathf.Cos(fireAngle*Mathf.Deg2Rad),Mathf.Sin(fireAngle*Mathf.Deg2Rad));
// 총알 오브젝트 오른쪽을 Direction 방향으로 설정
tempObject.transform.right = direction;
// 총알 오브젝트의 위치는 플레이에의 위치로 설정
tempObject.transform.position = transform.position;
// 0.1초 기다림
yield return new WaitForSeconds(0.1f);
fireAngle += angleInterval;
// 발사한 각도를 설정한 값에 따라서 증가, 반복
if (fireAngle > 360) fireAngle -= 360;// 0~360
}
4. 총알 발사의 응용(한번에 여러 방향으로 발사)
while (true)
{
// 한번에 미사일을 만들어준다
// 4초간 대기
// 총알이 발사되는 각도 결정. startAngle ~ endAngle
for (int fireAngle = startAngle; fireAngle < endAngle; fireAngle += angleInterval)
{
GameObject tempObject = Instantiate(bulletObject, bulletContainer, true);
Vector2 direction = new Vector2(Mathf.Cos(fireAngle*Mathf.Deg2Rad),Mathf.Sin(fireAngle*Mathf.Deg2Rad));
tempObject.transform.right = direction;
tempObject.transform.position = transform.position;
}
yield return new WaitForSeconds(4f); // 4초 기다
}
반응형
'프로그래밍 이야기 > GameDev' 카테고리의 다른 글
[게임이론] 백터의 내적 (0) | 2020.12.24 |
---|---|
[게임이론] Vector의 활용 (0) | 2020.12.21 |
[게임이론] Vector (0) | 2020.12.15 |
[게임이론] 삼각함수 (0) | 2020.12.10 |
[C#] File - BinaryFormatter (0) | 2020.12.08 |