https://dnddkqja21.tistory.com/44
3rd Person Camera - Chaper 03. Rotate Camera (3인칭 카메라 - 챕터03. 카메라 회전)
https://dnddkqja21.tistory.com/43 3rd Person Camera - Chaper 02. Follow Camera (3인칭 카메라 챕터2. 플레이어 추적 카메라) https://dnddkqja21.tistory.com/42 1st, 3rd Person Camera - Chapter 01. Game Camera View. (1인칭 카메라, 3인칭
dnddkqja21.tistory.com
지난 시간에는 카메라 회전을 구현해보았습니다.
하지만 아직 보완해야할 문제점이 있습니다.
함께 확인해볼까요??
영상으로 확인해보면 조금 이상한 점을 발견하실 수 있는데요.
wasd키를 이용하여 이동 시 정면을 바라볼 때는 아무런 이상이 없지만 카메라 회전 후 좌, 우 또는 뒤를 바라볼 시
바라보는 방향이 플레이어의 앞이 아니라는 점입니다.
사진의 씬 탭을 보면 카메라는 우측을 바라보고 있습니다. 하지만 W키를 눌러 이동 시 플레이어는 월드 기준 북쪽으로
이동하게 되죠.
이제 게임탭을 보면 카메라가 보는 방향으로 움직이기를 원하지만 플레이어는 화면 상에서 좌측으로 이동하게 됩니다.
우리의 이동 코드는 카메라가 어딜 바라보든 항상 월드 기준으로 (W : 북, A : 서, S : 남, D : 우) 이동하게 되어 있습니다.
우리가 원하는 결과는 카메라가 바라보는 방향을 기준으로 이동을 해야 합니다.
이제 코드를 수정해봅시다!
//Vector3 newDir = new Vector3(h, 0, v).normalized * moveSpeed * Time.deltaTime;
//transform.Translate(newDir, Space.World);
Update() 함수에서 이동을 처리하는 부분을 주석처리 해줍니다.
if (h != 0 || v != 0)
{
float thetaEuler = Mathf.Acos(v / new Vector2(h, v).magnitude) * (180 / Mathf.PI)
* Mathf.Sign(h);
Vector3 moveAngle = Vector3.up * (cameraArm.transform.rotation.eulerAngles.y + thetaEuler);
transform.rotation = Quaternion.Euler(moveAngle);
transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed);
}
이후 그 자리에 위의 코드를 추가해주세요.
위 코드는 사용자의 입력 값(h 및 v)과 게임 개체 카메라(cameraArm)의 현재 방향을 기반으로 회전 각도(thetaEuler)를 계산합니다. 이 각도는 수직 입력 값의 아크코사인(Mathf.Acos)을 수평 및 수직 입력 값(new Vector2(h, v).magnitude)을 결합하여 생성된 벡터의 크기로 나눈 다음 결과를 변환하여 계산됩니다. 라디안에서 도까지의 각도(180 / Mathf.PI). 마지막으로 각도에 수평 입력 값의 부호(Mathf.Sign(h))를 곱하여 시계 방향으로 회전할지 반시계 방향으로 회전할지 결정합니다.
회전 각도를 계산한 후 코드는 계산된 회전 각도와 카메라의 현재 방향을 기반으로 게임 개체가 이동해야 하는 방향을 나타내는 새 벡터(moveAngle)를 생성합니다. 이 벡터는 게임 개체(Vector3.up)의 "위" 방향을 취하고 카메라의 현재 y축 회전(cameraArm.transform.rotation.eulerAngles.y)을 계산된 회전 각도(thetaEuler)에 추가하여 생성됩니다.
이제 저장 후 에디터를 실행해봅시다.
wasd 키를 순서대로 눌러 확인해본 결과 카메라가 바라보는 방향을 기준으로 이동하는 것을 확인하실 수 있습니다.
오늘도 고생하셨습니다 :D
다음 시간에는 카메라 줌인 줌아웃을 구현해보겠습니다.