[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 1]

※ 주의 

이 글은 아마추어가 개인적으로 생각하여 작성하는 것으로, 이곳에 나오는 내용을 맹신하지 않는것을 당부드립니다.

 

 

메뉴

 

1. 움직임 적용.

- Horizontal을 이용한 움직임.

 

2. 중력 적용.

- 점프에 의한 중력.

- 낙하에 의한 중력.

 

3. 충돌 적용. (레이 캐스트로 충돌체크.)

- 점프로 인한 위쪽블록과의 충돌.

- 낙하로 인한 블록과의 충돌.

- 오른쪽, 혹은 왼쪽으로 움직일때에 벽과 충돌.

 

4. 점프

- 점프로 인한 충돌체크 및 중력적용.

 

5. 좌,우 충돌체크.

 

 

 

 

1. 움직임

 

처음은 플레이어의 움직임을 구현해야 한다.

플레이어는 좌, 우로만 움직일 것이다.

 

메뉴탭에Edit - Project Settings - Input - Axes 에는 키 입력에 대한 여러가지 정보가 들어있는데,

그 중 Horizontal은 x값 / 좌, 우(←,→) 키 입력에 대한 정보가 들어있다.

 

이 정보를 받아서 현재 입력 받은 키가 무엇이며, 어떤 방향인지 정보를 가져와 플레이어 움직임에 적용할 것이다.

 

※ 다른 키 입력 정보

- Vertical : y값 / 위, 아래(↑,↓)에 대한 정보.

- Jump : Spacebar(스페이스바)

 

Horizontal을 가져오는 방법은 

Input.GetAxis("Horizontal");을 통해 가져올수 있다.

 

이 값은 반환하는 값이 있는데, 눌리는 키에 방향에따라 다른 값을 반환한다.

 

왼쪽 키(←)    : 0 ~ -1

오른쪽 키(→) : 0 ~ 1

입력 X          : 0

을 반환한다.

 

움직이려는 방향(벡터)을 알아내었다면 어떤 속력으로 움직일지 정해야 한다.

float Speed 변수를 하나 만들어주어 어떤 속력으로 움직일지 임의로 정하면 된다.

 

그리고 마지막으로 프레임당 호출 횟수를 고려하여 Time.deltatime을 곱해 시간을 보정해준다.

 

 

 

더보기
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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Player : MonoBehaviour {
 
    // 공개
    public float Speed;             // 좌, 우로 움직이는 스피드.
 
    // 비공개
    private Vector2 Pos;            // 플레이어가 실직적으로 움직일 좌, 우 벡터를 저장할 변수.
 
    private float H;                // Horizontal.
 
    // 각종 값 초기화.
    void Init()
    {
        Pos = Vector2.zero;
        H   = 0;
    }
 
    void Start()
    {
        Init();
    }
 
    void Update()
    {
        H = Input.GetAxis("Horizontal");
        Move();
    }
 
    // 좌, 우 움직임.
    void Move()
    {
        Pos.Set(H * Speed, Pos.y);
        transform.Translate(Pos * Time.deltaTime);
    }
}
cs

 

 

 

플레이어에 대한 인스펙터 정보

 

 

 

결과.

 

 

 

다음은 중력적용을 시켜보도록 하자.

[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

 

유니티란?

Unity3D 특징


1. 멀티 플랫폼을 지원한다.


PC, 스마트 폰, XBox, 플스 등 여러가지 기기들이 있고, 그에 맞는 제작 엔진이나

툴을 통하여 게임을 제작하여야 한다.


하지만, 유니티는 다양한 플랫폼을 지원해 주기 때문에 제작 엔진의 선택을 고민할 필요가 없다.



유니티가 지원해주는 플랫폼은 이렇다.


[출처: 유니티코리아 홈페이지.]



2. 개발환경 구축을 위한 비용이 저렴하다.


유니티는 언리얼, 크라이텍과 같은 엔진에 못지않는 성능을 보여주지만

가격대비 성능이 아주 뛰어난 편이다.



3. 사용방법이 쉽다.


누구나 쉽게 게임을 제작할 수 있게 한다는 목표에 맞게,

진입장벽이 매우낮고, 시간 투자 대비 높은 결과물을 얻을 수 있다.

어느정도 개발 지식을 가지고 있다면, 1주일 이내로 간단한 게임 제작이 가능하다.



4. Asset Store


모든 기능을 자신이 구현할 필요없이, 에셋 스토어를 통해 유니티 개발자들이 제작 판매하는,

리소스 패키지를 설치하여 필요한 기능을 구현할 수 있다.


반대로, 리소스를 패키지 파일로 제작하여 에셋 스토어에서 판매할 수도 있다.

prev 1 ··· 19 20 21 22 23 24 25 ··· 29 next