앞선 Transform과 Vector에 이어서 Rotation으로 Player를 회전시켜보려고 한다.
Transform 컴포넌트의 Rotation y값을 변화시켜서 우측으로 회전하도록 만들어보자.
먼저,
회전을 위해 transform.rotation을 쳐보면 rotation은 Vector3가 아니라 Quaternion타입이라는 걸 알 수 있다.
ㄴ 즉, x, y, z에 직접적으로 값을 넣어서 설정하는 방식이 아니라는 것!
그렇다면, x, y, z에 값을 넣어서 Rotation을 구현하려면?
ㄴ 이렇게 Vector3타입으로 x,y,z를 각각 몇 도씩 회전시킬 것인지 넣어주면 된다.
ㄴ 이 코드는 현재 Update()가 실행될 때 _yAngle값이 계속 올라가도록 설정해두었다.
어차피 y축만 회전시킬건데 y축 값만 써주면 되지 않을까? 생각할 수 있지만,
Unity의 transform.eulerAngles 문서를 살펴보면 통으로 써야 한다고 작성되어 있다. 오류를 발생시킬 수 있기 때문이다..ㄴ 뿐만 아니라, 각도의 정확한 값을 읽거나 설정할 수 있으며, 직접적으로 연산작업을 할 수 없다.. (360도를 넘어가면 오류가 생길 수 있기 때문)
즉, transform.eulerAngles는 절대 회전값을 설정하여 사용해야하기 때문에 게임 오브젝트를 유연하게 회전시키기 위해서 Unity에서는 transform.Rotate()으로 +- delta값을 특정 x,y,z축으로 회전시킨 값을 적용할 수 있도록 하고 있다.
게임 중에 유저가 NPC를 클릭하면 Player가 NPC를 향해 달려오도록 하려면 Player가 NPC를 바라보도록 회전시켜야 한다.
이를 구현해주는 것이 Quaternion이다.
ㄴ Quaternion을 살펴보면 특이하게도 x,y,z,w까지 총 4개의 축을 사용하고 있다. w축까지 사용하는 이유는 '짐벌락'때문이다. (링크참고)
깊이 이해하자면 복소수라는 개념을 알아야 하는데, 간단하게 이해하자면 Vector3를 이용하면 문제가 발생하기 때문에 게임 엔진에서 회전을 구현하려면 결국 Quaternion을 사용해야 한다!라는 개념을 기억하자.
: 특정 축을 특정 값으로 회전 시키기
특정 방향을 바라보도록 구현
ㄴ 해당 키에 따라서 캐릭터가 바라보는 방향을 바꿔줌.
단, 이 방식은 player가 부드러운 움직임이 아닌 경직된 변화로 동서남북을 바라보게 된다.
게임에서는 player가 부드럽게 회전하여 원하는 방향을 바라보도록 하는 것이 좋다.
이를 실행해주는 함수가 바로 Quaternion.Slerp()이다. ㄴ 회전한 방향으로 이동까지 구현하려면 이동 방향을 모두 Vector3.forward로 해주면 된다. (바라보는 방향에서 앞으로 가라!)
ㄴ Slerp()로 회전을 구현했기 때문에 부드러운 회전을 하는 중에 이동이 진행되면 완벽하게 동서남북 4방향이 아닌 약간씩 다른 각도로 이동할 수 있다. 이러한 오류를 수정하려면 이동 코드는 회전과 연관되지 않도록, 아예 transform.position값에 연산을 해주도록 바꿔줄 수도 있다.
📋정리
- transform.eulerAngles : 절대 각도값을 입력하는 방식 (= Quaternion.Euler())
- transform.Rotate() : 특정 축을 기준으로 얼마만큼 회전할 것인지 설정하는 방식
- Quaternion : 회전관련 메서드를 가진 구조체 Quaternion을 활용해서 다양한 회전 기능 구현 가능
📄 참고자료
[인프런] c#과 유니티로 만드는 MMORPG 게임 개발 시리즈_Rotation
transform.eulerAngles
transform.Rotate()
Quaternion
transform.rotation
Quaternion.Euler()
Quaternion.LookRotation()
Quaternion.Slerp