본문 바로가기
게임 프로그래밍/유니티 활용

[유니티 활용] Character Controller 로 캐릭터 이동과 점프

by 레오란다 2023. 1. 11.
반응형

이번 글에서는 캐릭터 움직임에 사용되는 컴포넌트인 Character Controller 를 이용해 캐릭터를 움직이고 점프하는 방법에 대해 알아보도록 하겠습니다.

 

이 글은 Character Controller 의 사용법 설명에 집중하기 위해 지난 글의 내용을 수정하여 작성하도록 하겠습니다. 

 

 

[유니티 활용] 캐릭터 애니메이션과 이벤트 - 발자국 소리

이번 글은 이전에 작성한 포스팅에서 이어집니다. [유니티 활용] 마우스 클릭한 곳으로 부드럽게 바라보며 캐릭터 이동시키기 이번 글에서는 디아블로와 같은 게임처럼 화면상에 마우스 클릭한

ugames.tistory.com


 

Player 객체에 Character Controller 추가

Hierarchy 창에서 Player 객체를 선택하고 Inspector 창에서 [Add Component > Physics > Character Controller] 를 추가한 후 다음과 같이 설정합니다.

 

Character Controller 설정
Character Controller

Center / Radius / Height 는 Character Controller 를 추가하면 생기는 Capsule Collider 의 크기와 위치를 캐릭터에 맞게 조정하는 옵션입니다.

 

 

 Player 스크립트 변경

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{   
   Vector3 dir; 

   Animator anim;
   CharacterController cc;

   public AudioClip footstep;
   public float speed;   

   // Start is called before the first frame update
   void Start()
   {
      anim = GetComponent<Animator>();
      cc = GetComponent<CharacterController>();
   }

   // Update is called once per frame
   void Update()
   {
      // 캐릭터가 지면에 있는 경우
      if (cc.isGrounded)
      {         
         var h = Input.GetAxis("Horizontal");
         var v = Input.GetAxis("Vertical");

         dir = new Vector3(h, 0, v) * speed;

         if (dir != Vector3.zero)
         {
            // 진행 방향으로 캐릭터 회전
            transform.rotation = Quaternion.Euler(0, Mathf.Atan2(h, v) * Mathf.Rad2Deg, 0);
            anim.SetBool("IsMove", true);
         }
         else
            anim.SetBool("IsMove", false);

         // Space 바 누르면 점프
         if (Input.GetKeyDown(KeyCode.Space))
            dir.y = 7.5f;
      }

      dir.y += Physics.gravity.y * Time.deltaTime;
      cc.Move(dir * Time.deltaTime);
   }

   void FootStep()
   {
      AudioSource.PlayClipAtPoint(footstep, Camera.main.transform.position);
   }
}

 

Input.GetAxis("Horizontal") 은 x 축에 해당하는 값을 넘겨줍니다. 유니티에서는 기본적으로 키보드의 a, d, ←, → 키에 맵핑되어 있습니다.

 

Input.GetAxis("Vertical") 은 z 축에 해당하는 값을 넘겨줍니다. 유니티에서는 기본적으로 키보드의 w, s, ↑, 키에 맵핑되어 있습니다.


 

실행 결과

실행 화면

 

이 방식은 캐릭터의 이동과 관련된 여러 설정을 사용할 수 있기 때문에 편리합니다. 우선 isGrounded 속성은 캐릭터가 땅에 있는지 아닌지를 판별해 주기 때문에 따로 만들어 사용할 필요가 없습니다. 단, 주의할 점은 Min Move Distance 가 0 이 아니면 제대로 동작하지 않을 수 있습니다.

 

Slope Limit / Step Offset / Skin Width 등의 속성은 캐릭터가 주변 지형에 어떻게 반응하여 움직일 수 있는지 설정합니다. 이 속성은 Navigation 시스템을 사용할 때도 유용합니다.

 

또, 입력 방식으로 사용한 GetAxis 는 가상 조이스틱의 입력 방식과 동일하기 때문에 조이스틱과의 연동에도 쉽게 사용할 수 있습니다.

 

반응형

댓글