'Unity3D/Project'에 해당되는 글 36건
- 2017.03.02 [Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 4]
- 2017.03.02 [Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 3] 1
- 2017.03.02 [Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 2]
- 2017.02.28 [Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 1]
- 2017.02.25 [Unity3D] Character Controller를 이용한 캐릭터 움직임.
- 2017.02.25 유니티란?
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 4]
※ 주의
이 글은 아마추어가 개인적으로 생각하여 작성하는 것으로, 이곳에 나오는 내용을 맹신하지 않는것을 당부드립니다.
메뉴
1. 움직임 적용.
- Horizontal을 이용한 움직임.
2. 중력 적용.
- 점프에 의한 중력.
- 낙하에 의한 중력.
3. 충돌 적용. (레이 캐스트로 충돌체크.)
- 점프로 인한 위쪽블록과의 충돌.
- 낙하로 인한 블록과의 충돌.
- 오른쪽, 혹은 왼쪽으로 움직일때에 벽과 충돌.
4. 점프
- 점프로 인한 충돌체크 및 중력적용.
5. 좌,우 충돌체크.
4. 점프
이번에 구현해야 할 것은 3가지다.
1. 점프.
2. 플레이어가 점프 했을 때 점프경로에 블럭이 있고 충돌하게 된다면 떨어지게 하는 것.
3. 점프경로에 블럭이 없고 중력에 의해 떨어지는 것.
플레이어 인스펙터 정보
이것은 그렇게 어렵지 않기 때문에 바로 소스코드를 보도록 하자.
다음은 좌,우 이동에 대한 충돌체크를 해보도록 하자.
'Unity3D > Project' 카테고리의 다른 글
[Unity3D] RPG게임 카메라 - 줌 인/아웃, 카메라 회전. [Part 1] (0) | 2017.03.06 |
---|---|
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 5] (0) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 3] (1) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 2] (0) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 1] (0) | 2017.02.28 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 3]
※ 주의
이 글은 아마추어가 개인적으로 생각하여 작성하는 것으로, 이곳에 나오는 내용을 맹신하지 않는것을 당부드립니다.
메뉴
1. 움직임 적용.
- Horizontal을 이용한 움직임.
2. 중력 적용.
- 점프에 의한 중력.
- 낙하에 의한 중력.
3. 충돌 적용. (레이 캐스트로 충돌체크.)
- 점프로 인한 위쪽블록과의 충돌.
- 낙하로 인한 블록과의 충돌.
- 오른쪽, 혹은 왼쪽으로 움직일때에 벽과 충돌.
4. 점프
- 점프로 인한 충돌체크 및 중력적용.
5. 좌,우 충돌체크.
3. 레이 캐스트 충돌체크
이번엔 충돌을 적용시켜 보도록 하자.
Ray를 플레이어의 아래쪽으로 쏴서 땅에 맞는다면 플레이어는 땅에 존재하는 것이므로,
중력을 적용하지 않으면 된다.
반대로 Ray를 쐈을 때 아무것도 맞지 않는다면 플레이어의 발 밑에 발판이 존재하지 않는다는 말이므로,
중력을 적용하면 된다.
Ray를 이용하여 충돌여부를 미리 체크하므로써 효율적인 연산을 수행할 수 있다.
Ray를 맞은 객체가 땅이라고 판별하기 위해서는 한 가지 작업이 필요하다.
Layer에 Ground라는 요소를 추가하여 설정하면 된다.
설정이 끝난 뒤 Ray에 맞으면 그 객체가 땅인지 아닌지 판별할 수 있게 된다.
아무 객체를 선택한 후, 인스펙터창 우측 상단에 Layer를 클릭하여 Ground를 추가 한 후
발판 객체들을 선택하여 Layer를 Ground로 설정 하도록 하자.
1.
2.
3.
※ Radius변수 설명에 대해서는 밑을 참고.
※
isGround == true : 현재 플레이어가 땅에 존재함.
isGround == false : 현재 플레이어가 땅에 존재하지 않음.
RaycastHit Hit;
Hit 변수에는 Ray에 맞은 객체에 대한 정보가 들어있다.
현재 사용한 레이캐스트의 인자들을 살펴보면,
Physics.Raycast(Ray가 발사되는 위치,
Ray가 발사되는 방향,
Ray를 맞을 객체에 대한 정보를 저장할 변수,
Ray의 길이 );
이렇게 되어있다.
Ray에 맞은 객체에 대한 정보가 Hit에 존재하기 때문에 Hit.transform.gameObject.laye의 경로로
그 객체의 레이어를 체크한다.
체크된 레이어가 8번 레이어(Ground)라면
플레이어의 위치를 발판 위에 올려놔야 되는데,
플레이어의 x값에 대해서는 변환할 필요가 없기 때문에,
y값만 바꿔주면 된다.
보통 어떤 객체의 기준점은 객체의 정 가운데 있다.
그림으로 살펴보면 이렇다.
그래서 Ray가 발판에 닿았을 때 플레이어의 위치를 발판의 위치로 대입해 버리면
밑에의 그림과 같은 상황이 일어난다.
transform.position = 객체.position;
그렇기 때문에 밑에 그림과 같이 계산해야 한다.
플레이어의 위치를 발판 위에 올려다 놓고.
플레이어에게 작용하는 y의 벡터 값을 0으로 줘버린다.
그리고 isGround의 값을 true로 줌으로써 현재 자신은 땅에 존재한다고 명시해준다.
다음 Ray를 쐈을 때 Ray가 발판에 닿았고 또 위의 구문을 수행하기전에
의 구문에 의해서 밑의 구문을 수행하지 않고 함수를 종료해 버린다.
결과.
※파란색 선이 Ray이다.
Ray를 쏴서 충돌을 체크하는데, Ray가 나오지 않는 부분은 충돌이 될까?
※ Ray가 닿지 않는 부분은 충돌이 되지 않는것을 볼 수 있다.
당연히 충돌이 되지 않는다.
그러면 어떻게 해야할까? 플레이어의 크기 만큼 Ray를 쏴주면 된다.
Ray를 플레이어의 크기만큼 쏴주기 위해 새로운 변수를 선언한다.
Vector2 Radius;
자료형을 벡터로 선언한 이유는 이렇다.
벡터는 2가지 정보를 가지고 있다.
바로 x값과 y값인데, 플레이어의 x만큼의 반지름과 y만큼의 반지름 크기가 필요하다.
그럼 float형으로 x값과 y값 따로 선언해 주면 되지 않냐고 묻는다면, 그렇게 해도 아무 문제도 없다.
아무튼 원래 Ray를 쏘았던 위치에서 플레이어의 반지름을 더해주거나 빼주면 플레이어의 크기만큼 Ray를
발사할 수 있다.
다음은 점프를 구현해 보도록 하자.
'Unity3D > Project' 카테고리의 다른 글
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 5] (0) | 2017.03.02 |
---|---|
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 4] (0) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 2] (0) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 1] (0) | 2017.02.28 |
[Unity3D] Character Controller를 이용한 캐릭터 움직임. (0) | 2017.02.25 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 2]
※ 주의
이 글은 아마추어가 개인적으로 생각하여 작성하는 것으로, 이곳에 나오는 내용을 맹신하지 않는것을 당부드립니다.
메뉴
1. 움직임 적용.
- Horizontal을 이용한 움직임.
2. 중력 적용.
- 점프에 의한 중력.
- 낙하에 의한 중력.
3. 충돌 적용. (레이 캐스트로 충돌체크.)
- 점프로 인한 위쪽블록과의 충돌.
- 낙하로 인한 블록과의 충돌.
- 오른쪽, 혹은 왼쪽으로 움직일때에 벽과 충돌.
4. 점프
- 점프로 인한 충돌체크 및 중력적용.
5. 좌,우 충돌체크.
2. 중력적용
다음으로 해야할 것은 플레이어에게 중력을 적용 해야한다.
여기서 한 가지 생각해야할 것이 있는데, '언제 어떤 상황에서 중력을 적용할것 인가?' 이다.
궁금히 생각해 보도록 하자.
플레이어가 땅에 가만히 있는데도 중력이 적용된다면 굉장한 연산 낭비가 아닌가?
그렇다면 2가지 경우에만 중력을 적용시키면 된다.
첫 번째, 플레이어가 점프 후 떨어질 때.
두 번째, 좌,우 이동 중 높은곳에서 낮은 곳으로 떨어졌을 때.
이 중 첫 번째에 경우 점프가 구현되어있지 않았기 때문에 두 번째에 경우를 우선하여 적용 하도록 하자.
우선적으로 중력만 적용시켜보자.
중력만 적용시키는것은 매우 간단한 일이다.
플레이어에게 가할 중력 값을 만들고, y값에 중력값을 게속하여 가중시키면 된다.
플레이어 인스펙터창 정보.
결과
중력은 적용되었지만, 블록에 충돌하지 않고 지나가는것이 보일 것이다.
위에서 말했던 첫 번째, 두 번째 경우에만 중력을 적용 시키기 위해서는 레이 캐스트를 사용하여
충돌체크 부터 해야 한다.
다음은 충돌을 적용시켜 보도록 하자.
'Unity3D > Project' 카테고리의 다른 글
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 4] (0) | 2017.03.02 |
---|---|
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 3] (1) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 1] (0) | 2017.02.28 |
[Unity3D] Character Controller를 이용한 캐릭터 움직임. (0) | 2017.02.25 |
유니티란? (0) | 2017.02.25 |
[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 > Project' 카테고리의 다른 글
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 4] (0) | 2017.03.02 |
---|---|
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 3] (1) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 2] (0) | 2017.03.02 |
[Unity3D] Character Controller를 이용한 캐릭터 움직임. (0) | 2017.02.25 |
유니티란? (0) | 2017.02.25 |
[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 > Project' 카테고리의 다른 글
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 4] (0) | 2017.03.02 |
---|---|
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 3] (1) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 2] (0) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 1] (0) | 2017.02.28 |
유니티란? (0) | 2017.02.25 |
유니티란?
Unity3D 특징
1. 멀티 플랫폼을 지원한다.
PC, 스마트 폰, XBox, 플스 등 여러가지 기기들이 있고, 그에 맞는 제작 엔진이나
툴을 통하여 게임을 제작하여야 한다.
하지만, 유니티는 다양한 플랫폼을 지원해 주기 때문에 제작 엔진의 선택을 고민할 필요가 없다.
유니티가 지원해주는 플랫폼은 이렇다.
[출처: 유니티코리아 홈페이지.]
2. 개발환경 구축을 위한 비용이 저렴하다.
유니티는 언리얼, 크라이텍과 같은 엔진에 못지않는 성능을 보여주지만
가격대비 성능이 아주 뛰어난 편이다.
3. 사용방법이 쉽다.
누구나 쉽게 게임을 제작할 수 있게 한다는 목표에 맞게,
진입장벽이 매우낮고, 시간 투자 대비 높은 결과물을 얻을 수 있다.
어느정도 개발 지식을 가지고 있다면, 1주일 이내로 간단한 게임 제작이 가능하다.
4. Asset Store
모든 기능을 자신이 구현할 필요없이, 에셋 스토어를 통해 유니티 개발자들이 제작 판매하는,
리소스 패키지를 설치하여 필요한 기능을 구현할 수 있다.
반대로, 리소스를 패키지 파일로 제작하여 에셋 스토어에서 판매할 수도 있다.
'Unity3D > Project' 카테고리의 다른 글
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 4] (0) | 2017.03.02 |
---|---|
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 3] (1) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 2] (0) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 1] (0) | 2017.02.28 |
[Unity3D] Character Controller를 이용한 캐릭터 움직임. (0) | 2017.02.25 |