eulerAngles
회전은 transform.rotation 외에 eulerAngles을 사용하는 방법이 있다.
transform.eulerAngles = new Vector3(0.0f, 0.0f, 0.0f);
오일러 앵글은 몇 도로 회전할 것인지 Vector3를 통해 절대 값(absolute value)을 그대로 넣어준다.
여기에서 absolute value라고 했는데 무슨 의미인지 아래 코드를 보자.
_yAngle += Time.deltaTime * 100.0f;
transform.eulerAngles = new Vector3(0.0f, _yAngle, 0.0f);
오일러 앵글은
transform.eulerAngles = new Vector3(0.0f, Time.deltaTime * 100.0f , 0.0f);
이렇게 정확한 값 하나가 아니라 연산중인 값을 안에 넣을 수 없다.
유니티 공식 문서를 보면 앵글을 absolute value로만 사용하라고 나와있는데,
이것은 절대 각도에 덧셈을 하지 말라는 의미이다.
왜냐하면 360도 넘어가게 될 경우 오작동을 일으킬 수도 있으니까 하지 말라고 나온다.
Rotate
위의 방법 외에 회전에 대한 대안이 있다.
transform.Rotate(new Vector3(0.0f, Time.deltaTime * 100, 0.0f));
만약 절대값을 입력하고 싶다면 오일러 앵글에 입력하고,
그것이 아니라면 Rotate를 사용하자.
Quaternion - rotation
이제 회전을 배웠으니 원하는 특정 방향으로 캐릭터를 회전시켜서 바라보게 하고 싶다.
우리가 굳이 수학적인 계산을 할 필요 없이 이미 유니티에 구현되어 있다.
Quaternion qt = transform.rotation // Rotate가 아니라 rotation
주의할 점은 transform.rotation이 Vector3 타입이 아니라 Quaternion 타입이란 것이다.
만약 Vector3를 이용하면 짐벌록 문제가 발생하기 때문에 쿼터니언 타입을 사용한다.
Quaternion - Euler
Quaternion.Euler()
쿼터니언 타입 안에 있는 오일러 함수는 직접 x y z를 입력하거나, Vector3를 이용해서 x y z를 입력하면
쿼터니언으로 변환해준다.
마치 물체의 이동에서 로컬 좌표와 월드 좌표를 왔다갔다 할 수 있는 것처럼
쿼터니언과 오일러를 왔다갔다 할 수 있는 함수이다.
그래서
transform.rotation = Quaternion.Euler(new Vector3(0.0f, 90.0f, 0.0f ))
오일러를 사용하는 rotation에도 문제 없이 작동한다.
Quaternion - LookRotation
쿼터니언 안에는 또 LookRotation이란 함수가 있다.
이 함수는 임의의 쿼터니언으로 만들어주는데, 우리가 원하는 방향을 쳐다보게 로테이션을 만들어준다.
Quaternion.LookRotation(Vector3.forward);
로컬 좌표 기준이 아니라 월드 좌표 기준으로 동작한다.
Quaternion - Slerp
위의 LookRotation은 바라보는 방향으로 회전하지만, 너무 정확히 한 방향으로 경직되게 회전한다.
쿼터니언 안의 Slerp 함수 설명을 보면
쿼터니언 a, b, float를 입력해서
현재 지점 a와 최종 목적지 b 에서 몇프로 확률로 어느 방향을 보게 할 것인지 0에서 1사이를 입력한다.
여기에서 0은 a와 가깝다는 의미이고 1은 b와 가깝다는 의미이다.
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.forward), 0.5f);
이것을 조합해서 바라보는 방향으로 움직이게 할 수 있다.
if(Input.GetKey(KeyCode.W))
{
transform.rotation = Quaternion.Slerp(transform.rotaion, Quaternion.LookRotation(vector3.forward), 0.2f);
transform.position += Vector3.forward * Time.detaTime;
}
바라보는 방향으로 물체를 움직일 때는 translate로 바로 조작하기보다 position을 사용하는 것이 더 좋다.
그러면 바라보는 방향과 상관없이 무조건 해당 월드 좌표를 기준으로 절대 좌표로 이동할 수 있다.
정리
절대값을 입력하고 싶다면 오일러 앵글에 입력하고,
그것이 아니라 연산 과정을 바로 넣고싶다면 Rotate를 사용한다.
transform.Rotate(new Vector3(0.0f, Time.deltaTime * 100.0f, 0.0f));
rotation은 Quaternion을 사용한다.
transform.rotation = Quaternion.Euler(new Vector3(0.0f, _yAngle, 0.0f));
레퍼런스
https://www.inflearn.com/course/mmorpg-%EC%9C%A0%EB%8B%88%ED%8B%B0/dashboard