유니티 RPG - 3. 캐릭터 회전
Intro
-
이번포스팅에서는 캐릭터가 움직이는 방향에따라 회전할 수 있도록 만들어보겠습니다.
- 회전시키는 방법에는 여러가지가 있습니다.
- 직각으로 회전 : 좌우 회전이 90도로 휙휙 바뀝니다.
- 자연스러운 회전 : 좌우 회전이 자연스럽게 바뀝니다.
- 저는 자연스럽게 회전할 수 있도록 만들어보겠습니다.
캐릭터 회전
- Unity에서 오브젝트를 회전시키는 방법은 여러가지가 있습니다. 그 중 저는 Quaternion(쿼터니언)을 사용했습니다.
- Quaternion은 3차원 회전을 표현하는데 사용되는 4차원 벡터로,
- Quaternion의 메서드 LookRotation 메서드를 사용했습니다.
- Quaternion.LookRotation() 메서드는 벡터를 매개변수로 넣어주면 오브젝트가 지정된 방향을 가리키는 쿼터니언을 생성합니다.
- 따라서 Quaternion 형태의 변수(newRotation)를 하나 만들어, moveVec(방향벡터)를 가리키는 쿼터니언을 저장하고
- rigidBody의 rotation을 이용하여 캐릭터를 회전시킵니다.
- 이때 Slerp 메서드를 사용하여 부드러운 회전을 만들어줍니다.
Lerp VS SLerp
Lerp와 Slerp는 Quaternion의 메서드로, “선형보간법” 이라는것을 통해 오브젝트를 회전시키는 방법입니다.
public static Quaternion Lerp(Quaternion a, Quaternion b, float t);
public static Quaternion Slerp(Quaternion a, Quaternion b, float t);
- Lerp 와 Slerp의 차이점은 선형보간법의 방식 차이인데, 요컨대 Slerp가 좀 더 부드럽게 회전한다는것이다.
코드
// 플레이어 회전로직
void Turn()
{
// 캐릭터가 정지했을 때
if (moveVec == Vector3.zero)
return;
Quaternion newRotation = Quaternion.LookRotation(moveVec);
rigid.rotation = Quaternion.Slerp(rigid.rotation, newRotation, playerInfo.rotateSpeed * Time.deltaTime);
}
-
회전속도를 담는 rateSpeed 라는 변수를 추가하여
-
rigid.rotation에서 newRotation까지 playerInfo.rotateSpeed * Time.deltaTime 만큼 보간하여 새로운 회전값을 생성
-
따라서 Turn() 함수를 Update() 함수에서 호출시켜 rigid의 rotation을 회전시킵니다.
댓글남기기