이 프로젝트의 내용은 해당 링크를 참조하였습니다.
0. Input Manager 확인
우선 키보드값이 설정되어있는지 확인하기 위해 Edit -> Project Settings -> Input Manager 창으로 이동한다.


Horizontal, Vertical이름을 가진 키를 가져와 코드를 짤 것이기 때문에 미리 확인해 보았다.
Negative Button, Positive Button이 Vertical은 down과 up, Horizontal은 left와 right로 설정해준다.
(프로그램을 설치하고 Input Manager를 건드리지 않은 경우 변화가 없을 것이다.
그리고 Alt Negative, Alt Positive는 대체 버튼이므로 해당 키를 눌러도 동일하게 작동한다.)
1. 플레이어 오브젝트 생성 및 필요한 컴포넌트 추가

플레이어 역할을 할 오브젝트를 생성한다. 필자는 구 형태의 오브젝트를 만들었다. (구의 색/질감 등을 바꾸고 싶다면 Material을 생성한 후 구에 넣어 주면 된다.)
해당 오브젝트에 유니티에서 자동으로 Mesh Renderer, Sphere Collider이 할당되는데, 여기에 RigidBody컴포넌트를 추가한다.
Mesh Render는 MeshFilter에서 정해진 Mesh를 그려준다. 즉, 풀어 말하면 Inspector창의 transform 컴포넌트의 정해진 위치에서 해당 object를 렌더링한다.
(transform의 scale에서 오브젝트의 크기를 정하고, position에서 위치를, rotation에서 회전각을 설정한다.)
collider는 물리적인 충돌을 처리하는 컴포넌트이다. 형태에 따라 sphere, capsule, box, mesh로 나뉜다.
(https://wergia.tistory.com/217) 설명 링크.
rigidbody는 오브젝트가 물리엔진의 영향을 받게 하는 컴포넌트이다. 그래서 중력 작용여부, 회전 마찰력 정도와 같이 물리적 설정을 적용할 수 있다. 이 게임의 플레이어는 중력의 영향을 받기 때문에 Use Gravity항목을 체크한다.
https://docs.unity3d.com/kr/2019.4/Manual/class-Rigidbody.html
위 사진처럼 피자는 플레이어 오브젝트와 움직임을 테스트할 평면 오브젝트를 만들었다.
(이 때 평면 오브젝트는 추후 없앨 예정이기 때문에 rigidbody를 추가할 필요는 없다.)
이 때 플레이어의 rigidbody를 없애면 중력의 영향을 받지 않기 때문에 공중에 떠 있게 되고,
플레이어의 collider을 없애면 평면과 오브젝트 사이의 충돌을 감지할 수 없기 때문에 중력의 힘으로 인해 밑으로 떨어지게 된다.
반대로 평면에 rigidbody를 추가하고 Use Gravity를 체크하면 플레이어와 평면 같이 떨어지게 된다.
(물론 rigidbody를 추가하고 중력 조건을 체크하지 않으면 플레이어가 평면 위에 존재한다.)
++ Mesh Filter는 에셋에서 Mesh(구, 원기둥, 큐브..등등)를 가져와 Mesh Renderer에 전달한다. 즉, Mesh Reference를 전달하기 때문에 Mesh filter가 없을 경우에는 전달받은 reference를 찾을 수 없어서 Mesh Renderer는 작업을 수행할 수 없다.
이 때, SkinnedMeshRender는 예외의 경우이다. Skinned Mesh Renderer 링크 참조
mesh filter의 자세한 설명은 [링크](https://docs.unity3d.com/kr/2021.2/Manual/class-MeshRenderer.html#mesh-renderer)를%EB%A5%BC) 참조하자.
그렇다면 에셋에서 왜 Mesh Filter라는 중간과정이 필요한 것일까? 그냥 바로 reference를 mesh renderer에 전달하면 안되는 것일까?
해당 링크 참조
Mesh Filter과 Mesh Renderer이 둘 다 존재해야 하는 이유?!
p2-study.tistory.com
3. 코드 작성
오브젝트를 원하는 대로 동작하게 하기 위해서는 스크립트를 오브젝트에 넣어주어야 한다.
스크립트의 내용은 다음과 같다.
public class PlayerBall : MonoBehaviour
{
Rigidbody rigid;
void Awake()
{
rigid = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
rigid.AddForce(new Vector3(h, 0, v), ForceMode.Impulse);
}
}
오브젝트를 물리적으로 동작하기 위해 rigidbody를 선언해야 하기 때문에 Start가 아닌 Awake함수를 사용한다.
(이 때 Start함수를 사용할 경우,
rigidbody에 힘을 가해 오브젝트를 움직이게 하므로 rigid 컴포넌트를 가져온다.
물리적인 것을 업데이트하므로 fixedupdate를 사용한다.
키보드를 누르는 즉시 작동하므로 getAxisRaw를 사용한다.
PlayerMove_gif올리기
'unity' 카테고리의 다른 글
| [유니티 스터디 1주차] 선형 보간 알고리즘 (0) | 2022.09.17 |
|---|---|
| Mesh Filter과 Mesh Renderer이 둘 다 존재해야 하는 이유 (0) | 2022.09.01 |
| 2. 유니티 기본 함수 (0) | 2022.07.18 |
| 1. 유니티 게임오브젝트, 컴포넌트 기본 개념 (0) | 2022.07.12 |
| 0. 유니티 엔진 기본 설명 (0) | 2022.07.02 |