본문 바로가기
프로그래밍 이야기/GameDev

[게임이론] 삼각함수의 활용

by Mulder5 2020. 12. 15.
반응형

definelife.tistory.com/search/%EC%82%BC%EA%B0%81

 

#define LIFE ZERO

인생 대 전환을 위한 기록, 프로그래밍과 IT 지식 소개

definelife.tistory.com

위의 삼각함수가 게임에서 어떻게 활용되는지 사례를 통해 알아본다.

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의 방향으로 이동한다. 

입력값 180

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