Unity 3D 캐릭터 컨트롤러 구현

2024. 12. 12. 22:57Unity

Unity 3D 캐릭터 컨트롤러 구현하기

3D 게임에서 캐릭터 컨트롤러는 플레이어가 캐릭터를 움직이고 조작하는 핵심 메커니즘입니다.
Unity는 Character Controller 컴포넌트와 스크립트를 사용하여 쉽게 3D 캐릭터 컨트롤러를 구현할 수 있습니다.

이번 포스팅에서는 기본적인 이동, 회전, 점프 기능을 포함한 3D 캐릭터 컨트롤러를 만들어보겠습니다.


1. 캐릭터 컨트롤러 개요

Unity에서 캐릭터 컨트롤러는 물리 기반 이동과 달리, 직접적인 위치 이동을 제공합니다.

  • Character Controller 컴포넌트: 이동 충돌 처리를 돕는 전용 컴포넌트.
  • Rigidbody는 필요하지 않으며, Move() 메서드를 사용하여 이동을 처리합니다.

2. 캐릭터 준비

1) 3D 캐릭터 모델 가져오기

  1. 3D 모델을 프로젝트에 임포트합니다.
  2. 씬에 배치하고 모델에 이름을 Player로 설정합니다.

2) Character Controller 추가

  1. Player 오브젝트를 선택합니다.
  2. Inspector > Add Component > Character Controller를 추가합니다.
  3. Height, Radius, Center 속성을 캐릭터 크기에 맞게 조정합니다.

3. 캐릭터 이동 스크립트 작성

1) 스크립트 생성

  1. Assets 폴더에서 PlayerMovement라는 스크립트를 생성합니다.
  2. 아래 코드를 추가합니다.

2) 기본 이동 코드

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public CharacterController controller;
    public float speed = 6f; // 이동 속도
    public float gravity = -9.81f; // 중력
    public float jumpHeight = 1.5f; // 점프 높이

    private Vector3 velocity; // 현재 속도
    private bool isGrounded; // 바닥에 닿았는지 확인

    void Update()
    {
        // 1. 바닥 체크
        isGrounded = controller.isGrounded;
        if (isGrounded && velocity.y < 0)
        {
            velocity.y = -2f; // 바닥에 붙도록 설정
        }

        // 2. 이동 처리
        float moveX = Input.GetAxis("Horizontal");
        float moveZ = Input.GetAxis("Vertical");

        Vector3 move = transform.right * moveX + transform.forward * moveZ;
        controller.Move(move * speed * Time.deltaTime);

        // 3. 점프 처리
        if (Input.GetButtonDown("Jump") && isGrounded)
        {
            velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
        }

        // 4. 중력 적용
        velocity.y += gravity * Time.deltaTime;
        controller.Move(velocity * Time.deltaTime);
    }
}

 


4. 카메라 회전 구현

1) 마우스를 이용한 카메라 회전

PlayerMain Camera의 구조를 다음과 같이 설정합니다:

  • Player (루트 오브젝트)
    • Main Camera (자식 오브젝트)

2) 카메라 스크립트 추가

  1. MouseLook 스크립트를 생성합니다.
  2. 아래 코드를 추가합니다.
using UnityEngine;

public class MouseLook : MonoBehaviour
{
    public float mouseSensitivity = 100f;
    public Transform playerBody;

    private float xRotation = 0f;

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked; // 마우스 커서를 고정
    }

    void Update()
    {
        // 마우스 입력
        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

        // 카메라 회전 제한
        xRotation -= mouseY;
        xRotation = Mathf.Clamp(xRotation, -90f, 90f);

        transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
        playerBody.Rotate(Vector3.up * mouseX);
    }
}

3) 설정 연결

  1. Main Camera에 MouseLook 스크립트를 추가합니다.
  2. Player Body 필드에 Player 오브젝트를 드래그하여 연결합니다.

5. 점프 및 중력 조정

캐릭터가 점프하거나 공중에서 중력을 받아야 자연스러운 움직임이 구현됩니다.

  • 중력: Unity의 기본 중력 값을 활용하며, Character Controller가 물리 처리를 보완합니다.
  • 점프 높이는 Mathf.Sqrt()를 이용해 중력과의 관계를 계산합니다.

6. 지형 충돌 처리

1) 충돌 감지

Character Controller는 자체적으로 충돌을 감지하며, isGrounded로 캐릭터가 바닥에 닿았는지 확인합니다.

2) 다양한 지형 처리

  • 바닥 경사면 처리: Slope Limit 속성을 조정합니다.
  • 충돌 민감도 조정: Step Offset 속성을 통해 계단을 자연스럽게 오를 수 있습니다.

7. 캐릭터 컨트롤러 확장

1) 달리기 기능 추가

public float sprintSpeed = 10f;

void Update()
{
    float currentSpeed = Input.GetKey(KeyCode.LeftShift) ? sprintSpeed : speed;

    Vector3 move = transform.right * moveX + transform.forward * moveZ;
    controller.Move(move * currentSpeed * Time.deltaTime);
}

2) 대시 기능

public float dashDistance = 5f;

void Dash()
{
    Vector3 dashDirection = transform.forward;
    controller.Move(dashDirection * dashDistance);
}

3) 애니메이션 연동

캐릭터의 상태(이동, 점프, 대기)에 따라 애니메이션을 재생합니다.

Animator animator;

void Start()
{
    animator = GetComponent<Animator>();
}

void Update()
{
    animator.SetFloat("Speed", move.magnitude);
    animator.SetBool("IsGrounded", isGrounded);
}

 


8. 요약

Unity의 3D 캐릭터 컨트롤러는 간단하면서도 확장 가능성이 높은 구조를 가지고 있습니다.

  • Character Controller를 통해 이동, 점프, 충돌 처리를 손쉽게 구현.
  • 마우스 입력으로 캐릭터와 카메라 회전 제어.
  • 추가적인 기능(달리기, 대시, 애니메이션)으로 컨트롤러 확장 가능.