이번 글에서는 캐릭터 움직임에 사용되는 컴포넌트인 Character Controller 를 이용해 캐릭터를 움직이고 점프하는 방법에 대해 알아보도록 하겠습니다.
이 글은 Character Controller 의 사용법 설명에 집중하기 위해 지난 글의 내용을 수정하여 작성하도록 하겠습니다.
▶ Player 객체에 Character Controller 추가
Hierarchy 창에서 Player 객체를 선택하고 Inspector 창에서 [Add Component > Physics > 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 는 가상 조이스틱의 입력 방식과 동일하기 때문에 조이스틱과의 연동에도 쉽게 사용할 수 있습니다.
'게임 프로그래밍 > 유니티 활용' 카테고리의 다른 글
[유니티 활용] StateMachine 을 활용한 3D 몬스터 AI 구현 (5) | 2023.01.12 |
---|---|
[유니티 활용] NavMeshAgent 사용법 (Simple Monster AI) (26) | 2023.01.11 |
[유니티 활용] 캐릭터 애니메이션과 이벤트 - 발자국 소리 (21) | 2023.01.09 |
[유니티 활용] 마우스 클릭한 곳으로 부드럽게 바라보며 캐릭터 이동시키기 (16) | 2023.01.08 |
[유니티 활용] 3D 캐릭터를 UI 로 표시하는 방법 (10) | 2023.01.06 |
댓글