[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 5]
Unity3D/Project 2017. 3. 2. 20:04
※ 주의
이 글은 아마추어가 개인적으로 생각하여 작성하는 것으로, 이곳에 나오는 내용을 맹신하지 않는것을 당부드립니다.
메뉴
1. 움직임 적용.
- Horizontal을 이용한 움직임.
2. 중력 적용.
- 점프에 의한 중력.
- 낙하에 의한 중력.
3. 충돌 적용. (레이 캐스트로 충돌체크.)
- 점프로 인한 위쪽블록과의 충돌.
- 낙하로 인한 블록과의 충돌.
- 오른쪽, 혹은 왼쪽으로 움직일때에 벽과 충돌.
4. 점프
- 점프로 인한 충돌체크 및 중력적용.
5. 좌,우 충돌체크.
4. 좌,우 충돌체크.
별로 어려운건 없다.
기존에 만들어두었던 RayCastFire함수를 이용하면 된다.
하지만 몇 가지 추가하거나 바꿔줄 필요는 있다.
현재 x방향으로 레이캐스트를 3개를 쏘고있다.
그리고 이제 할 좌,우 충돌에 대해서도 마찬가지로 3개의 레이캐스트를 쏠 것이다.
for문을 하나 더 만들어서 함수를 호출해버리면 아무래도 프로그램에 부담이걸려 돌아오는 반응에 공백이 생길수
있으므로, for문을 RayCastFire함수 안으로 넣으려고 한다.
그리고 전체적인 구성을 조금 바꿀 것이다.
결과
더보기
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
// 공개
public float Speed; // 좌, 우로 움직이는 스피드.
public float JumpSpeed; // 점프 할때에 힘.
public float Gravity; // 작용하는 중력.
// 디버그
public float RayTime; // 그려준 레이 지속시간.
public bool isDrawX; // 좌,우 쏘는 레이캐스트 보기.
public bool isDrawY; // 위,아래로 쏘는 레이캐스트 보기.
public Color ColorX; // 레이의 색깔.
public Color ColorY; // 레이의 색깔.
// 비공개
private Vector2 Pos; // 플레이어가 실직적으로 움직일 좌, 우 벡터.
private Vector2 Dir; // 점프 및 낙하 여부의 벡터.
private Vector2 Radius; // 플레이어의 x,y의 반지름.
private float H; // Horizontal.
private bool isGround; // 현재 땅이냐? true 땅이 아니냐? false
// 각종 값 초기화.
void Init()
{
ColorX = Color.blue;
ColorY = Color.red;
Pos = Vector2.zero;
Dir = Vector2.down;
Radius = new Vector2(transform.localScale.x * 0.5f, transform.localScale.y * 0.5f);
H = 0;
isGround = false;
}
void Start()
{
Init();
}
void Update()
{
H = Input.GetAxis("Horizontal");
if (Input.GetButtonDown("Jump") && isGround)
{
Pos.y = JumpSpeed;
Dir = Vector2.up;
}
CollisionCheck();
Move();
}
// 좌, 우 움직임.
void Move()
{
Pos.Set(H * Speed, Pos.y);
transform.Translate(Pos * Time.deltaTime);
}
// 충돌 체크를 위한 레이 캐스트.
void CollisionCheck()
{
RayCastFire(Dir, Radius.y + 0.1f, Color.blue); // 위,아래
RayCastFire(DirX(), Radius.x + 0.1f, Color.yellow); // 좌, 우.
}
// 플레이어 방향 벡터를 결정해 준다. (좌, 우)
Vector2 DirX()
{
if (H < 0)
return Vector2.left;
else if (H > 0)
return Vector2.right;
return Vector2.zero;
}
// 레이캐스트를 발사한다.
void RayCastFire(Vector2 _Dir, float _length, Color _color )
{
if (_Dir == Vector2.zero)
return;
RaycastHit Hit;
for (int i = -1; i < 2; i++)
{
Vector2 MyPos = transform.position;
// 레이 발사위치를 정하는 구문.
if (_Dir == Vector2.right || _Dir == Vector2.left)
MyPos = new Vector2(MyPos.x, MyPos.y + (Radius.y * i)); // 좌,우 충돌 레이.
else
MyPos = new Vector2(MyPos.x + (Radius.x * i), MyPos.y); // 위,아래 충돌 레이.
// 레이를 그려주는 함수.
DrawRay(MyPos, _Dir, _length, _color);
if (Physics.Raycast(MyPos, _Dir, out Hit, _length))
{
// Ray를 발사 했는데 땅에 맞았음.
if (Hit.transform.gameObject.layer == 8)
{
if (_Dir == Vector2.right || _Dir == Vector2.left)
{
H = 0;
return;
}
// 플레이어가 땅에 있으면 함수 종료.
if (isGround)
return;
Transform Target = Hit.transform;
if (_Dir == Vector2.down)
{
// 충돌한 블럭의 위에 정착.
transform.position = new Vector2(transform.position.x, Target.position.y + (Target.localScale.y * 0.5f) + _length);
Pos.y = 0; // 중력이 작용했던 값에 대해 0으로 초기화.
isGround = true; // 이제 땅에 있다고 표시.
return;
}
// 충돌한 블럭 밑으로 이동.
transform.position = new Vector2(transform.position.x, Target.position.y - (Target.localScale.y * 0.5f) - _length);
Pos.y = 0;
break;
}
}
}
if (_Dir == Vector2.right || _Dir == Vector2.left)
return;
// Ray를 발사 했는데 땅에 맞지 않았음.
isGround = false;
Pos.y -= Gravity * Time.deltaTime;
if (Pos.y <= 0)
Dir = Vector2.down;
}
// 레이를 그려준다.
void DrawRay(Vector2 _MyPos, Vector2 _Dir, float _length, Color _color)
{
if (_Dir == Vector2.left || _Dir == Vector2.right)
{
if (isDrawX)
Debug.DrawRay(_MyPos, _Dir * _length, ColorX, RayTime);
}
else
{
if (isDrawY)
Debug.DrawRay(_MyPos, _Dir * _length, ColorY, RayTime);
}
}
}
|
cs |
'Unity3D > Project' 카테고리의 다른 글
[Unity3D] RPG게임 카메라 - 줌 인/아웃, 카메라 회전. [Part 2] (0) | 2017.03.07 |
---|---|
[Unity3D] RPG게임 카메라 - 줌 인/아웃, 카메라 회전. [Part 1] (0) | 2017.03.06 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 4] (0) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 3] (1) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 2] (0) | 2017.03.02 |