TIL(Today I Learned)

Unity 팀 프로젝트 : 카메라 회전과 기울임 기능 추가하기 - TIL#24

Najdorf 2024. 1. 25. 23:47
728x90

오늘의 개발 상황 요약

 

 

오늘은 카메라 기능(회전, 기울임 등) 구현에 중점을 두고 개발에 착수했다.

위 사진은 게임 시작 전 탑 다운 뷰로 수직으로

정육각형을 수직으로 바라보는 모습이다.

 

 

게임 시작을 하는 동시에 카메라가

처음에 설정한 40도로 기울어지며

기울어진 평면을 따라 일정하게 육각형 주위를 돌아

마치 육각형이 도는 듯한 연출을 보여준다.

 

영상을 보면 기울어진 각도, 회전 속도, 회전 방향 등을 구현해놓은 것을 볼 수 있다.

 

 

private 변수 직렬화 '[SerializeField]'를 이용해

Inspector 내에서 자유롭게 수정하며 테스트 할 수 있게 했다.

 

Tilt Angle은 기울어짐 정도, 단위는 degree이고 범위는 1에서 90이다.

Rotation Speed는 회전 속도이고, 범위는 0에서 10이다.

Is Clockwise는 참일 때 시계방향이고, 거짓일 때 반시계방향이다.

 

 

 

추가로 게임 오버 시 Best Record가 기록되는 부분과

최종 레벨의 Sprite Image를 좌측에 표시해주는 기능도 추가했다.


구현에 있어 어려웠던 점

 

 

사실 카메라의 회전과 기울임 정도를 자유자재로 구현하는 데 있어서

굉장히 고민을 많이 했다.

 

처음에 CameraManager.cs 스크립트를 작성할 때

단순히 수직방향으로 바라보는 MainCamera의

Transform 컴포넌트 -> Rotate 변수만 다루려고 했으나,

 

이후 기울임을 구현하는데 있어서 확실한 문제가 생기고야 말았다.

카메라가 비추는 곳이 더 이상 중앙이 아니게 된 것이다.

 

그래서 작성했던 스크립트를 모두 지우고

전체 로직을 새로 짜야만 했다.

 

내가 구상했던 방법은 카메라가 가상의 구의 표면만을

일정하게 따라가며 시선은 원점을 바라보고 일정한 주기로

공전 운동을 하는 모델이었다.

 

(복잡해 보일 수는 있지만 단순한 삼각함수를 이용한 구면 좌표계 계산이다.)

 

연직선상으로부터 tiltAngle(노트에서는 θ)만큼 기울어진

반지름의 길이가 10인 구의 표면을 따라 운동하는

MainCamera의 궤적을 구상하고 이를 구했다.

(노트에서 α는 공전 궤적의 각도이다. rotationAngle)

 

이에 따라 수식으로 MainCamera의 3차원 좌표를 나타내면,

이렇게 정리된다.

 

 

C# 스크립트 상으론 위 코드의 UpdatePositions 메서드를 참고하면 된다.

 

수식을 코드 상으로 구현하면서 새로 알게 된 사실이 있었다.

분명 수식을 정확히 입력했는데도 카메라가 예상치 못한 움직임을 보여

원인을 파악했는데, 다름아닌 내가 각도의 입력값으로

Radian이 아닌 Degree 단위로 입력했기 때문이었다.

 

해결은 위 코드에서 보여지는 것처럼

C# Mathf에는 Deg2Rad라는 프로퍼티를 제공을 해주는데,

단순히 Degree 단위의 각도에 이것을 곱해주면 Radian 단위가 된다.

 

 

MainCamera의 시선 방향 처리도 상당한 고민을 거쳤다.

 

계속 Rotate.Lookat 메서드를 사용해서 원점을 바라보게도 해봤지만,

정작 카메라의 시선은 원점이 아닌 Vector.up 방향으로 보고 있었기에

원하는 시선 처리가 이루어지지 않았다.

 

해결은 새로운 Vector3 변수 headDirection을 만드는 것이었다.

언제든 MainCamera를 기준으로 공전축인 z를 향하는 벡터를 만든 것이다.

 

그리고 이것을 Rotate.Lookat 메서드가 아닌

Quaternion.LookRotation의 두 번째 인자에 할당해주니

깔끔하게 내가 원하는 시선 처리가 구현이 되었다.

 


느낀 점

 

오늘은 Unity 개발을 하면서

처음으로 수식 계산을 위해 노트를 꺼내본 날이었다.

원전공이 물리학(...)이라서 오랜만에 과제를 하는 느낌도 났다.

 

분명 생각을 하고 이를 코드로 옮겨서

완벽한 결과를 얻을 때까진 상당한 구글링과 고민이 필요했지만,

원하는대로 기능 구현이 끝마쳐졌을 때

얻었던 성취감은 대단했다.

 

이제 점점 Unity와 C# 스크립트를 다루는데

제법 익숙해졌다는 생각이 들게 되었다.

 

Delegate나 event 같은 기능들은

개념으로는 이해하고 있지만

아직까지는 어떤 적절한 때에 사용을 해야하는지

감을 못 잡는 것 같긴 하다.

 

그리고 협업 중인 다른 팀원들도

스크럼할 때마다 대단한 진전을 보여주셔서

 

이렇게 같이 프로젝트를 진행하면

뭐든 못 만들 게임은 없겠다는 굉장한 자신감또한 들게 되었다.

728x90