[Unity3D] Character Controller를 이용한 캐릭터 움직임.

 

Character Controller을 이용해 구현할 움직임은,

 

1. 오른쪽, 왼쪽, 위, 아래 움직임

2. 캐릭터 점프

3. 경사면 이동

 

위 3가지를 구현해볼 예정이다.

 

결과를 보자면 이렇다.

 

 

 

 

1. 큐브를 하나 만든뒤 Add Component를 통해 캐릭터 컨트롤러를 추가한다.

 

 

 

 

캐릭터 컨트롤러의 목록을 살펴보도록 하자.

 

Slope Limit - 콜라이더가 표시된 값 이하의 기울기만을 오르도록 한다. 

=> 한 마디로 캐릭터가 경사면과 만났을때 움직일수 있는 각도(기울기)를 말한다. 현재는 45라고 되어있는데, 45도 이하의 경사면을 만났을때 움직일수 있다.

 

Step Offset - 표시된 값보다 지면에 가까운 경우에만 캐릭터가 계단에 오른다.

 

Skin Width - 두 콜라이더가 skin Width와 동일한 깊이에서 서로 관통한다. skin Wdith가 커지면 지터가 줄어든다.

skin width가 낮으면 캐릭터가 움직일 수 없게 되는 경우가 있다. Radius가 10%일 때 이 값을 설정하는것이 좋다.


동영상을 보면 이해가 될 것이다.

 

 

Min Move Distance - 캐릭터가 표시된 값 미만으로 움직이려 해도 움직이지 않는다.

지터를 줄이는데 사용한다. 대부분 이 값은 0으로 둔다.

 

 

Center - 콜라이더의 센터의 x,y,z위치를 조절한다.

Radius - 콜라이더의 반경을 설정한다. 기본적인 폭 조절이라 생각하면 된다.

Height - 콜라이더의 높이. 이 값을 조절하면 위, 아래 방향으로 y축을따라 콜라이더가 확대 및 축소 된다.

 

 

 스크립트를 하나 작성하여 만든 큐브에 넣도록 하자.

그리고 스크립트를 작성한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Player2 : MonoBehaviour {
 
    public float speed;      // 캐릭터 움직임 스피드.
    public float jumpSpeedF; // 캐릭터 점프 힘.
    public float gravity;    // 캐릭터에게 작용하는 중력.
 
    private CharacterController controller; // 현재 캐릭터가 가지고있는 캐릭터 컨트롤러 콜라이더.
    private Vector3 MoveDir;                // 캐릭터의 움직이는 방향.
    
    void Start()
    {
        speed     = 6.0f;
        jumpSpeed = 8.0f;
        gravity   = 20.0f;
 
        MoveDir = Vector3.zero;
        controller = GetComponent<CharacterController>();
    }
 
    void Update()
    {
        // 현재 캐릭터가 땅에 있는가?
        if (controller.isGrounded)
        {
            // 위, 아래 움직임 셋팅. 
            MoveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
 
            // 벡터를 로컬 좌표계 기준에서 월드 좌표계 기준으로 변환한다.
            MoveDir = transform.TransformDirection(MoveDir);
 
            // 스피드 증가.
            MoveDir *= speed;
 
            // 캐릭터 점프
            if (Input.GetButton("Jump"))
                MoveDir.y = jumpSpeed;
 
        }
 
        // 캐릭터에 중력 적용.
        MoveDir.y -= gravity * Time.deltaTime;
 
        // 캐릭터 움직임.
        controller.Move(MoveDir * Time.deltaTime);
    }
}
 
cs