Menu
CoddyTech

CharacterController.Move

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

CharacterController는 걷는 캐릭터를 위한 Unity 컴포넌트입니다. 스크립트에서 controller.Move(motion)을 호출할 때만 움직이는 캡슐입니다. motion은 이번 프레임에 이동할 거리이므로, 속도에 Time.deltaTime을 곱한 값입니다. Move는 캡슐이 벽을 통과하지 않고 벽을 따라 미끄러지게 하며, Slope Limit(45도)까지의 경사면을 올라가고 Step Offset(0.3 units)까지의 턱을 올라섭니다. Rigidbody가 아니므로 힘도, 중력도, 튕김도 없으며, 아무것도 이 캡슐을 밀지 않습니다. Move가 지정한 위치로 정확히 이동하므로 정밀한 게임 조작에 적합합니다.

중력을 추가하는 것도, 바닥을 찾는 것도 직접 해야 합니다. 마지막 Move가 아래쪽에 있는 무언가와 닿으면 isGrounded가 true가 되므로, 아래쪽 성분이 없는 이동으로는 바닥을 찾을 수 없습니다. 컨트롤러의 Min Move Distance(0.001)보다 짧은 Move는 아무 동작도 하지 않으므로, 옆으로만 움직인 컨트롤러는 가만히 서는 즉시 땅에 닿아 있지 않다고 보고합니다. 이 배달원은 방향키로 걷고 모든 이동에서 조금씩 아래로 누릅니다.

public class Courier : MonoBehaviour
{
    public float speed = 6f;
    CharacterController controller;

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

    void Update()
    {
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = -2f;   // 바닥을 감지할 수 있도록 항상 아래로 누른다
        controller.Move(move * Time.deltaTime);
        if (!controller.isGrounded)
        {
            Debug.Log("Off the ground");
        }
    }
}

캡슐은 접촉하는 대상에서 Skin Width(0.08)만큼 떨어져 있으므로, y = 0인 바닥 위에 있는 높이 2 units의 컨트롤러는 y = 1이 아니라 y = 1.08에 놓입니다. 또한 Move는 물리 엔진이 마지막으로 컨트롤러를 확인한 위치에서 시작하므로, 컨트롤러에 설정한 transform.position은 다음 Move에서 되돌려질 수 있습니다. 순간 이동시키려면 controller.enabled = false로 설정하고, 위치를 옮긴 다음 다시 활성화하세요.

challenge icon

챌린지

중급

탐험가는 뒤쪽에 벽이 있고 왼쪽에 낭떠러지가 있는 돌 플랫폼 위에 서 있습니다. CharacterController가 있는 Player에 Explorer.cs를 작성하세요. Inspector에서 speed(4)와 fallSpeed(3)를 설정하고, Start()는 이미 컨트롤러와 탐험가의 Renderer를 찾습니다.

  • raw axes로 읽은 화살표 키(또는 WASD)를 사용해 초당 speed 단위로 탐험가를 이동하세요. 왼쪽과 오른쪽은 x축을 따라, 위쪽과 아래쪽은 z축을 따라 이동합니다. 벽이 탐험가를 막아야 합니다.
  • 이동할 때마다 초당 fallSpeed 단위로 아래로도 이동하므로, 탐험가는 플랫폼 위에 머물다가 가장자리에서 떨어집니다.
  • 컨트롤러가 grounded 상태일 때 탐험가는 Color.green이고, 그렇지 않을 때는 Color.red입니다.

Play를 누르고, 벽 쪽으로 걸어간 다음 가장자리에서 떨어져 보세요. 그런 다음 Check를 누르세요.

직접 해보기

using UnityEngine;

public class Explorer : MonoBehaviour
{
    public float speed = 4f;
    public float fallSpeed = 3f;

    CharacterController controller;
    Renderer rend;

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

    void Update()
    {
        // controller.Move로 이동한 다음 isGrounded에 따라 탐험가의 색을 지정합니다
    }
}
quiz icon실력 점검

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

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