1 minute read

캐릭터 컨트롤러 (Character Controller) 정리

구조

Unity의 캐릭터 컨트롤러(Character Controller)는 3D 게임에서 플레이어 캐릭터의 움직임을 처리하는 컴포넌트입니다. 주로 물리 엔진과의 충돌 처리를 간단하게 하기 위해 사용됩니다. 캐릭터 컨트롤러는 다음과 같은 주요 요소로 구성됩니다:

  1. Collider
    • 구조: 캐릭터 컨트롤러는 캡슐 모양의 콜라이더를 가지고 있습니다. 이 콜라이더는 캐릭터의 충돌 영역을 정의합니다.
    • 역할: 다른 게임 오브젝트와의 충돌을 감지합니다.
  2. RigidBody
    • 구조: 캐릭터 컨트롤러는 일반적으로 Rigidbody 컴포넌트를 사용하지 않습니다.
    • 역할: 물리 엔진을 통한 힘 적용 및 충돌 반응 대신, 직접적인 이동 제어를 통해 캐릭터를 움직입니다.
  3. Movement
    • 구조: CharacterController 클래스는 캐릭터의 이동 및 충돌 처리를 위한 여러 메서드를 제공합니다.
    • 역할: 이동, 점프, 슬라이딩 등 다양한 캐릭터 동작을 처리합니다.

사용법

캐릭터 컨트롤러를 사용하려면 다음 단계를 따릅니다:

  1. 캐릭터 컨트롤러 추가
    • 방법: 게임 오브젝트에 CharacterController 컴포넌트를 추가합니다.
      [RequireComponent(typeof(CharacterController))]
      public class PlayerController : MonoBehaviour
      {
          private CharacterController controller;
          public float speed = 6.0f;
          public float jumpHeight = 1.0f;
          public float gravity = -9.81f;
          private Vector3 velocity;
          private bool isGrounded;
      
          void Start()
          {
              controller = GetComponent<CharacterController>();
          }
      
          void Update()
          {
              isGrounded = controller.isGrounded;
              if (isGrounded && velocity.y < 0)
              {
                  velocity.y = 0f;
              }
      
              float moveX = Input.GetAxis("Horizontal");
              float moveZ = Input.GetAxis("Vertical");
      
              Vector3 move = transform.right * moveX + transform.forward * moveZ;
              controller.Move(move * speed * Time.deltaTime);
      
              if (Input.GetButtonDown("Jump") && isGrounded)
              {
                  velocity.y += Mathf.Sqrt(jumpHeight * -2f * gravity);
              }
      
              velocity.y += gravity * Time.deltaTime;
              controller.Move(velocity * Time.deltaTime);
          }
      }
      
  2. 캐릭터 이동
    • 방법: CharacterController.Move 메서드를 사용하여 캐릭터를 이동시킵니다.
      Vector3 move = transform.right * moveX + transform.forward * moveZ;
      controller.Move(move * speed * Time.deltaTime);
      
  3. 점프 및 중력 처리
    • 방법: CharacterController.isGrounded 속성을 사용하여 캐릭터가 지면에 있는지 확인하고, 중력 및 점프 로직을 구현합니다.
      if (Input.GetButtonDown("Jump") && isGrounded)
      {
          velocity.y += Mathf.Sqrt(jumpHeight * -2f * gravity);
      }
      
      velocity.y += gravity * Time.deltaTime;
      controller.Move(velocity * Time.deltaTime);
      

예제 코드 설명

위 코드 예제에서는 PlayerController라는 클래스를 정의하고, 캐릭터 컨트롤러를 사용하여 플레이어 캐릭터의 이동, 점프 및 중력 처리를 구현했습니다. 주요 기능은 다음과 같습니다:

  1. 시작 시 초기화:
    • Start 메서드에서 CharacterController 컴포넌트를 초기화합니다.
  2. 업데이트 시 이동 및 점프 처리:
    • Update 메서드에서 캐릭터의 이동, 점프, 중력 처리를 수행합니다.
    • Input.GetAxis를 사용하여 플레이어의 입력을 받아 이동 벡터를 계산합니다.
    • controller.Move를 사용하여 캐릭터를 이동시킵니다.
    • 점프 입력을 받아 캐릭터가 점프하도록 합니다.
    • 중력 값을 갱신하여 캐릭터에 적용합니다.