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

2024. 12. 9. 06:38Unity

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

2D 게임 개발에서 캐릭터 컨트롤러는 플레이어 캐릭터의 이동과 점프, 상호작용 등의 동작을 구현하는 핵심 요소입니다.
Unity의 다양한 도구와 기능을 활용하면 효율적으로 캐릭터를 제어할 수 있습니다.

이번 포스팅에서는 2D 캐릭터 컨트롤러를 단계적으로 구현하는 방법을 알아봅니다.


1. 캐릭터 컨트롤러란?

캐릭터 컨트롤러는 플레이어의 입력을 받아 캐릭터를 이동시키고, 물리 엔진과 상호작용하며 애니메이션을 실행하는 시스템입니다.
2D 게임에서는 주로 다음 기능을 포함합니다:

  • 이동: 좌우 이동 및 속도 조절.
  • 점프: 플레이어가 점프할 수 있는 기능.
  • 애니메이션: 움직임에 따라 적절한 애니메이션 재생.

2. 프로젝트 설정

1) Unity 프로젝트 생성

  • Unity에서 2D Template으로 새 프로젝트를 생성합니다.

2) 필요한 Asset 추가

  • 캐릭터 스프라이트와 배경 이미지를 프로젝트에 추가합니다.

3) 캐릭터 오브젝트 생성

  1. 빈 GameObject를 생성하고 이름을 Player로 설정합니다.
  2. Player 오브젝트에 Sprite Renderer를 추가하고 캐릭터 스프라이트를 설정합니다.
  3. Rigidbody 2DBox Collider 2D를 추가하여 물리적 충돌 및 중력 효과를 적용합니다.

3. 기본 이동 구현

1) 스크립트 작성

Player 오브젝트에 아래 스크립트를 연결하여 기본 이동 기능을 구현합니다.

using UnityEngine;

public class CharacterController2D : MonoBehaviour
{
    public float moveSpeed = 5f; // 이동 속도

    private Rigidbody2D rb;
    private Vector2 movement;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // 입력 감지
        movement.x = Input.GetAxis("Horizontal");
    }

    void FixedUpdate()
    {
        // 물리 기반 이동 처리
        rb.velocity = new Vector2(movement.x * moveSpeed, rb.velocity.y);
    }
}

2) 주요 코드 설명

  • Input.GetAxis("Horizontal"): 키보드 입력을 감지하여 좌우 방향으로 이동.
  • Rigidbody2D.velocity: Rigidbody의 속도를 설정하여 물리적으로 이동.

4. 점프 기능 추가

1) 점프 변수 추가

public float jumpForce = 10f; // 점프 힘
private bool isGrounded = false; // 캐릭터가 땅에 있는지 확인

2) 점프 로직 구현

void Update()
{
    movement.x = Input.GetAxis("Horizontal");

    // 점프 입력 감지
    if (Input.GetButtonDown("Jump") && isGrounded)
    {
        rb.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);
        isGrounded = false;
    }
}

void OnCollisionEnter2D(Collision2D collision)
{
    // 땅과 충돌 감지
    if (collision.contacts[0].normal.y > 0.5f)
    {
        isGrounded = true;
    }
}

3) 점프 동작 추가 설명

  • AddForce: Rigidbody에 힘을 가해 점프를 실행.
  • OnCollisionEnter2D: 충돌을 감지하여 캐릭터가 땅에 닿았는지 확인.

5. 애니메이션 연동

1) Animator 설정

  1. Player 오브젝트에 Animator 컴포넌트를 추가합니다.
  2. Animator Controller를 생성하고 캐릭터의 애니메이션 클립을 설정합니다.
    • Idle: 대기 애니메이션.
    • Run: 이동 애니메이션.
    • Jump: 점프 애니메이션.

2) 파라미터 추가

Animator Controller에서 다음 파라미터를 추가합니다:

  • Speed: 이동 속도에 따라 애니메이션 전환.
  • IsJumping: 점프 상태를 나타내는 불리언 값.

3) 스크립트에서 애니메이션 제어

private Animator animator;

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

void Update()
{
    movement.x = Input.GetAxis("Horizontal");

    // 애니메이션 파라미터 설정
    animator.SetFloat("Speed", Mathf.Abs(movement.x));
    animator.SetBool("IsJumping", !isGrounded);

    if (Input.GetButtonDown("Jump") && isGrounded)
    {
        rb.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);
        isGrounded = false;
    }
}

 


6. 추가 기능 구현

1) 대쉬(Dash) 기능

public float dashSpeed = 10f;
private bool isDashing = false;

void Update()
{
    if (Input.GetKeyDown(KeyCode.LeftShift) && !isDashing)
    {
        StartCoroutine(Dash());
    }
}

private IEnumerator Dash()
{
    isDashing = true;
    rb.velocity = new Vector2(transform.localScale.x * dashSpeed, 0f);
    yield return new WaitForSeconds(0.2f); // 대쉬 지속 시간
    isDashing = false;
}

2) 벽 점프(Wall Jump)

벽과의 충돌을 감지하고 반대 방향으로 점프하는 기능을 추가할 수 있습니다.


7. 요약

Unity에서 2D 캐릭터 컨트롤러는 입력, 물리 연산, 애니메이션 제어를 결합하여 플레이어 캐릭터의 다양한 동작을 구현합니다.

  • Rigidbody2D와 Collider를 활용해 물리적 움직임을 처리.
  • Input 시스템을 통해 사용자 입력을 감지.
  • Animator를 활용해 시각적인 생동감 추가.