Menu
CoddyTech

CharacterController.Move

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

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는 아무 동작도 하지 않으므로, 컨트롤러가 옆으로만 움직이다가 멈추면 바닥에 서 있어도 grounded가 아니라고 보고합니다. 이 배달원 캐릭터는 방향키로 걷고 모든 이동에서 조금씩 아래로 눌러 줍니다.

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로 움직여 벽에서 멈추게 하세요.

  1. Update()에서 x축의 Input.GetAxisRaw("Horizontal")과 z축의 Input.GetAxisRaw("Vertical")에 speed를 곱해 Vector3 move를 만드세요.
  2. move.y = -fallSpeed;로 설정하고 controller.Move(move * Time.deltaTime);를 호출하세요.
  3. 그런 다음 controller.isGrounded가 참이면 rend.material.color를 Color.green으로 설정하고, 그렇지 않으면 Color.red로 설정하세요.

‘플레이’를 누르고 벽에 부딪힌 다음 왼쪽 가장자리 밖으로 걸어가세요. 탐험가는 빨간색으로 떨어지고 초록색으로 착지합니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

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에 따라 탐험가의 색을 지정합니다
    }
}

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

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