Menu
CoddyTech

바라보는 방향으로 이동하기

Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 60개 중 42번째.

카메라가 플레이어를 비스듬한 각도에서 바라볼 때, 화면에 보이는 방향대로 화살표 키를 누르면 플레이어가 움직여야 합니다. 위쪽 키를 누르면 카메라에서 멀어지고, 오른쪽 키를 누르면 카메라 기준 오른쪽으로 이동합니다. 월드 축이 이렇게 작동하는 것은 카메라가 +z 방향을 바라볼 때뿐입니다. 따라서 카메라 자체의 방향인 cam.forward와 cam.right를 사용해 이동을 구성하세요.

먼저 이 방향들을 정리해야 합니다. 카메라가 플레이어를 내려다보면 forward 방향은 땅을 향하므로, 땅을 따라가는 성분만 남기려면 y를 0으로 설정하세요. 남은 방향 벡터의 길이는 1보다 짧습니다. 카메라가 30도 아래로 기울어져 있으면 약 0.87이므로, 플레이어가 더 느리게 걷게 됩니다. 따라서 정규화하세요. 이 보행 스크립트는 레벨의 한쪽 모서리를 내려다보는 메인 카메라를 따라갑니다.

Transform cam = Camera.main.transform;

Vector3 forward = cam.forward;
forward.y = 0f;
forward.Normalize();
Vector3 right = cam.right;
right.y = 0f;
right.Normalize();

Vector3 move = forward * Input.GetAxisRaw("Vertical") + right * Input.GetAxisRaw("Horizontal");
if (move.magnitude > 1f) move.Normalize();   // 대각선 이동이 더 빠르지 않도록
controller.Move(move * speed * Time.deltaTime);

Camera.main은 MainCamera 태그가 지정된 카메라입니다. 두 방향은 매 프레임 읽어 오므로 카메라가 회전해도 조작 방향이 계속 올바르게 유지됩니다. 위쪽과 오른쪽을 함께 누르면 서로 직각인 단위 벡터 두 개가 더해져 길이가 약 1.41이 되므로, 이동 벡터의 길이가 1보다 클 때 정규화합니다.

challenge icon

챌린지

중급

화살표 키를 누르면 회전하는 카메라를 기준으로 플레이어가 걷도록 하세요.

  1. Update()에서 cam.forward와 cam.right를 복사하고, y를 0으로 설정한 다음 정규화하세요.
  2. dir은 forward에 원시 "Vertical" 축 값을 곱한 값에 right에 "Horizontal"을 곱한 값을 더한 값이며, 길이가 1보다 크면 정규화하세요.
  3. dir != Vector3.zero일 때 transform.rotation = Quaternion.LookRotation(dir);를 설정하세요. dir * speed로 move를 만드세요.

‘플레이’를 누르세요. 카메라가 어느 방향을 보든 위쪽 키를 누르면 카메라에서 멀어지는 방향으로 걷습니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

public class Mover : MonoBehaviour
{
    public float speed = 4f;
    public float gravity = -15f;
    public Transform cam;

    CharacterController controller;
    float verticalSpeed;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (controller.isGrounded && verticalSpeed < 0f)
        {
            verticalSpeed = -2f;
        }
        verticalSpeed += gravity * Time.deltaTime;

        // 월드 좌표축을 따라 이동함: cam을 기준으로 이동하고 이동하는 방향을 바라보도록 변경
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}

실제 게임 만들기의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드