Deff_Dev

[내배캠 Unity4기] 정식 캠프 5주차 (1) 본문

부트캠프/내배캠 Unity 4기

[내배캠 Unity4기] 정식 캠프 5주차 (1)

Deff_a 2024. 5. 13. 23:15

오늘 공부한 내용

주말 동안에 개인프로젝트를 다 끝내서 오늘은 스탠다드 분반 주간 실습을 위주로 진행했다.

 

스탠다드 분반 주간 실습을 빨리 끝내고 챌린지 분반 실습을 시작하려 했지만 회전 부분에서 시간이 오래 걸렸다.

 

스탠다드 실습은 간단한 로켓 발사 실습이다.

 

w를 누르면 위로 올라가고 ad를 누르면 방향에 맞게 45도로 회전한다.

 

프로젝트 구성, 스켈레톤 코드는 주어지고 요구사항에 맞게 각자 추가하는 방식으로 진행됐다.

 

내가 처음부터 클래스를 설계하고 코드를 작성하는 프로젝트가 아니다보니 주어진 코드를 파악하는데 시간이 꽤 걸렸다. 

 

그리고 다른 요구사항은 어렵지 않았지만 로켓 회전을 구현하는 부분이 어려웠다.

 

회전 값 구하기

정규화된 방향 벡터를 받아온 뒤 Mathf.Atan2()를 이용하여 회전 값을 구하는 방식을 사용했다.

rotZ = Mathf.Atan2( direction.y, direction.x) * Mathf.Rad2Deg;

 

이런 식으로 코드를 작성하고 테스트를 해봤더니 문제가 발생했다.

왼쪽 회전(좌) 오른쪽 회전 (우)

원래 설계했던대로 진행이 된다면 왼쪽 회전할 때 rotZ는 45가 나와야하고 오른쪽 회전할 때, rotZ는 -45가 나와야 된다.

 

왜 이렇게 나왔을까 ? 답은 간단했다.

Mathf.Atan2()는 오브젝트가 오른쪽을 바라보고 있다는 가정하에 진행이 각도를 구하기 때문이다.

현재 로켓은 위를 바라보고 있기 때문에 이런 형태로 회전하게 된다.

 

그래서 로켓을 -90도 만큼 회전 시키면 로켓이 오른쪽을 바라보기 때문에 rotZ에 90을 빼는 방법으로 문제를 해결했다.

rotZ = Mathf.Atan2( direction.y, direction.x) * Mathf.Rad2Deg;
rotZ -= 90;

rotation = Quaternion.Euler(0, 0, rotZ);

 

점진적 이동

평소 Mathf.Lerp를 사용할 때 a 부터 b까지의 값이 도달하는 시간을 정해놓고 코루틴을 이용해 점진적으로 값이 도달하는 방식을 많이 사용했다.

 

하지만 이 문제에서 주어진 요구사항은 시간을 주어주지않고 ROTATIONSPEED만 주어줬다.

 

기존에 사용하던 방법과 살짝 달라지다보니 어떤식으로 코드를 작성해야할 지 고민했지만,

문제의 답은 되게 간단했다.

    private void FixedUpdate()
    {
        Quaternion currentRot = transform.rotation;
        transform.rotation = Quaternion.Slerp(currentRot, rotation, ROTATIONSPEED);
    }

 

 currentRot값이 ROTATIONSPEED만큼 계속 변하기 때문에 t값에 ROTATIONSPEED를 넣어주면 된다.


오늘 하루를 마치며

클라이언트 개발자가 될려면 수학적 지식이 정말 중요하다는 것을 깨달았고 앞으로도 게임 수학을 계속 공부해야겠다고 생각했다.

 

내일은 챌린지 문제를 마무리하는 것을 목표로 할 예정이다.

(챌린지는 벡터 내적이 나온다고 하는데... 참 무섭다 ㅎㅎ)