Unity 3D 캐릭터 컨트롤러 구현
2024. 12. 12. 22:57ㆍUnity
Unity 3D 캐릭터 컨트롤러 구현하기
3D 게임에서 캐릭터 컨트롤러는 플레이어가 캐릭터를 움직이고 조작하는 핵심 메커니즘입니다.
Unity는 Character Controller 컴포넌트와 스크립트를 사용하여 쉽게 3D 캐릭터 컨트롤러를 구현할 수 있습니다.
이번 포스팅에서는 기본적인 이동, 회전, 점프 기능을 포함한 3D 캐릭터 컨트롤러를 만들어보겠습니다.
1. 캐릭터 컨트롤러 개요
Unity에서 캐릭터 컨트롤러는 물리 기반 이동과 달리, 직접적인 위치 이동을 제공합니다.
- Character Controller 컴포넌트: 이동 충돌 처리를 돕는 전용 컴포넌트.
- Rigidbody는 필요하지 않으며, Move() 메서드를 사용하여 이동을 처리합니다.
2. 캐릭터 준비
1) 3D 캐릭터 모델 가져오기
- 3D 모델을 프로젝트에 임포트합니다.
- 씬에 배치하고 모델에 이름을 Player로 설정합니다.
2) Character Controller 추가
- Player 오브젝트를 선택합니다.
- Inspector > Add Component > Character Controller를 추가합니다.
- Height, Radius, Center 속성을 캐릭터 크기에 맞게 조정합니다.
3. 캐릭터 이동 스크립트 작성
1) 스크립트 생성
- Assets 폴더에서 PlayerMovement라는 스크립트를 생성합니다.
- 아래 코드를 추가합니다.
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) 마우스를 이용한 카메라 회전
Player와 Main Camera의 구조를 다음과 같이 설정합니다:
- Player (루트 오브젝트)
- Main Camera (자식 오브젝트)
2) 카메라 스크립트 추가
- MouseLook 스크립트를 생성합니다.
- 아래 코드를 추가합니다.
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) 설정 연결
- Main Camera에 MouseLook 스크립트를 추가합니다.
- 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를 통해 이동, 점프, 충돌 처리를 손쉽게 구현.
- 마우스 입력으로 캐릭터와 카메라 회전 제어.
- 추가적인 기능(달리기, 대시, 애니메이션)으로 컨트롤러 확장 가능.
'Unity' 카테고리의 다른 글
Unity Animator 컨트롤러 및 애니메이션 트리 (0) | 2024.12.15 |
---|---|
Unity 카메라 이동 및 시점 변경 (1인칭, 3인칭) (1) | 2024.12.14 |
Unity 3D 모델 가져오기 및 셰이더 (0) | 2024.12.10 |
Unity 게임 오버 및 점수 시스템 (0) | 2024.12.09 |
Unity 2D 캐릭터 컨트롤러 구현 (0) | 2024.12.09 |