체크리스트
카메라는 플레이어의 오른쪽, 뒤쪽, 위쪽에 위치
이동을 할 때 플레이어가 움직이는 방향으로 회전
(임시로 Input.GetKeyDown 사용)
- 키를 눌렀을 때 해당 방향으로 유니티에서 2칸씩 이동하도록 구현
private float moveAmount = 2f; void Update() { Move(); } public void Move() { if (Input.GetKeyDown(KeyCode.W)) { transform.Translate(0, 0, moveAmount); } else if (Input.GetKeyDown(KeyCode.A)) { transform.Translate(-moveAmount, 0, 0); } else if (Input.GetKeyDown(KeyCode.S)) { transform.Translate(0, 0, -moveAmount); } else if (Input.GetKeyDown(KeyCode.D)) { transform.Translate(moveAmount, 0, 0); } }
- 움직이는 방향으로 플레이어가 회전하도록 구현
private float moveAmount = 2f; void Update() { Move(); } public void Move() { // 회전 방향을 주고 그 방향으로 직진 if (Input.GetKeyDown(KeyCode.W)) { transform.rotation = Quaternion.Euler(0, 0, 0); transform.Translate(0, 0, moveAmount); } else if (Input.GetKeyDown(KeyCode.A)) { transform.rotation = Quaternion.Euler(0, -90, 0); transform.Translate(0, 0, moveAmount); } else if (Input.GetKeyDown(KeyCode.S)) { transform.rotation = Quaternion.Euler(0, 180, 0); transform.Translate(0, 0, moveAmount); } else if (Input.GetKeyDown(KeyCode.D)) { transform.rotation = Quaternion.Euler(0, 90, 0); transform.Translate(0, 0, moveAmount); } }
-> 이렇게 했을 때 회전이 플레이어의 중심이 아니라 플레이어의 앞에 축을 두고 회전하는 느낌이 있었음.
- 함수를 따로 만들어 이동과 회전을 구현
private float moveAmount = 2f; public float moveSpeed = 5f; // 이동 속도 public float rotationSpeed = 2f; private bool isMoving = false; void Update() { Move(); } public void Move() { if (!isMoving) { // W 키가 눌렸을 때 if (Input.GetKeyDown(KeyCode.W)) { //transform.rotation = Quaternion.Euler(0, 0, 0); //transform.Translate(0, 0, moveAmount); StartCoroutine(MovePlayer(Vector3.forward, Quaternion.Euler(0, 0, 0))); } else if (Input.GetKeyDown(KeyCode.A)) { //transform.rotation = Quaternion.Euler(0, -90, 0); //transform.Translate(0, 0, moveAmount); StartCoroutine(MovePlayer(Vector3.left, Quaternion.Euler(0, -90, 0))); } else if (Input.GetKeyDown(KeyCode.S)) { //transform.rotation = Quaternion.Euler(0, 180, 0); //transform.Translate(0, 0, moveAmount); StartCoroutine(MovePlayer(Vector3.back, Quaternion.Euler(0, 180, 0))); } else if (Input.GetKeyDown(KeyCode.D)) { //transform.rotation = Quaternion.Euler(0, 90, 0); //transform.Translate(0, 0, moveAmount); StartCoroutine(MovePlayer(Vector3.right, Quaternion.Euler(0, 90, 0))); } } } private IEnumerator MovePlayer(Vector3 direction, Quaternion targetRotation) { isMoving = true; Vector3 startPosition = transform.position; Vector3 endPosition = startPosition + direction * moveAmount; Quaternion startRotation = transform.rotation; float elapsedTime = 0f; while (elapsedTime < 1f) { float lerpFactor = elapsedTime / 1f; transform.position = Vector3.Lerp(startPosition, endPosition, lerpFactor); transform.rotation = Quaternion.Slerp(startRotation, targetRotation, lerpFactor); elapsedTime += Time.deltaTime * moveSpeed; yield return null; } transform.position = endPosition; transform.rotation = targetRotation; isMoving = false; }
+ Vector3.Lerp를 사용하여 이동을 시작지점에서 목표지점까지 자연스럽게 움직이도록 해줌
+ Quaternion.Slerp를 사용하여 회전이 부드럽게 움직이도록 해줌.
- 회전의 기준점을 잡아주기 위해 transform.RotateAround()를 사용하였으나 회전에 문제가 생겨서 사용하지 않음.
- 현재 회전하며 이동할 때 2칸씩이 아니라 1칸씩 움직이는 경우가 있음.