private void Rotate(float inputX)
{
Quaternion from = transform.localRotation;
float angle = Mathf.Atan2(0, inputX) * Mathf.Rad2Deg;
Quaternion to = Quaternion.Euler(0, 0, angle - 90);
transform.localRotation = Quaternion.Slerp(from, to, ROTATIONSPEED);
}
위의 코드는 영상처럼 회전을할 때 부드럽게 회전할 수 있도록 `Quaternion.Slerp`를 활용한 것이다.
하나씩 살펴보겠다.
Quaternion from = transform.localRotation;
`transform.rotation`은 월드 좌표계라서 로컬 좌표계인 `transform.localRotation`을 사용했다.
이유는 로켓의 방향대로 앞으로 나아가야하기 때문이다.
`from`은 시작 회전을 담는다.
float angle = Mathf.Atan2(0, inputX) * Mathf.Rad2Deg;
`Atan2`는 라디안값이므로 `Mathf.Rad2Deg`로 디그리 변환(pi -> 180)
`inputX`는 -1,1값을 가지므로 180,0도의 값을 가진다.
입력된 x의 방향대로 회전 각도를 계산하는 것이다.
Quaternion to = Quaternion.Euler(0, 0, angle - 90);
기본은 90도 방향을 보고 있어서 90을 빼줘야한다.
`to`는 목표 회전을 담는다.
transform.localRotation = Quaternion.Slerp(from, to, ROTATIONSPEED);
`Slerp` : 부드럽게 회전(회전 경로를 곡선으로 처리하여 일정한 속도로 회전하게 만든다)
세 번째 파라미터값은 보간 파라미터 0~1사이의 값을 가짐
값이 0이면 결과는 from
값이 1이면 결과는 to
값이 0~1사이면 두 쿼터니언 사이를 부드럽게 보간
0 < ROTATIONSPEED < 1 -> 부드럽게 보간
반응형
'스파르타 게임개발종합반(Unity) > TIL - 본캠프 매일 공부 기록' 카테고리의 다른 글
2024.05.21 TIL - UnityAction, UnityEvent, delegate, event 차이 (0) | 2024.05.22 |
---|---|
2024.05.20 TIL - 내적계산으로 시야각 계산, Physics2D.CircleCastAll, Vector2.Dot (0) | 2024.05.20 |
2024.05.16 TIL - 객체지향프로그래밍 특강 정리 (0) | 2024.05.16 |
2024.05.14 TIL - Queue를 활용한 오브젝트 풀(ObjectPool) (0) | 2024.05.14 |
2024.05.13 TIL - 2D 정렬, 앞일 땐 앞이고, 뒤일 땐 뒤에 있기 (0) | 2024.05.13 |
댓글