Menu
CoddyTech

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

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

카메라가 비스듬한 각도에서 플레이어를 바라볼 때, 화살표 키를 누르면 화면에 보이는 방향대로 플레이어가 움직여야 합니다. 위쪽 키를 누르면 카메라에서 멀어지고, 오른쪽 키를 누르면 카메라 기준 오른쪽으로 이동합니다. 월드 축이 이런 방향과 일치하는 것은 카메라가 +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

챌린지

중급

카메라가 플레이어 주위를 천천히 회전하므로(CameraRig.cs, 준비됨) 화면에서 월드의 축도 계속 돌아갑니다. 중력이 이미 작성되어 있는 Mover.cs에서 방향키로 카메라를 기준으로 플레이어를 이동하게 만드세요. Inspector에서 speed(4)와 카메라의 Transform인 cam을 설정합니다.

  • 위쪽 방향키를 누르면 지면을 따라 카메라에서 멀어지고, 아래쪽 방향키를 누르면 카메라 쪽으로 이동합니다. 오른쪽과 왼쪽 방향키를 누르면 카메라 기준 오른쪽과 왼쪽으로 이동합니다. 카메라가 플레이어를 내려다보더라도 대각선 이동을 포함해 모든 방향으로 초당 speed 단위만큼 이동합니다.
  • 이동하는 동안 플레이어는 이동 방향을 바라보도록 회전합니다. 멈추면 그 방향을 계속 바라봅니다.

Play를 누르고 카메라가 회전하는 동안 주변을 이동한 다음 Check를 누르세요.

직접 해보기

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);
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

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