저번 포스팅에 이어서, 3주차때 진행한 내용을 포스팅하겠습니다.
이번에 제작한 것은 위에서 아래로 내려다보는 탑다운 뷰 게임입니다. 로컬에서 2명이 동시에 플레이할 수 있죠.
플레이어는 맵의 끝과 끝에서 시작되고, 중간의 장애물들을 파괴하면서 서로를 잡아야 합니다.
먼저 유니티 프로젝트를 3D로 시작해 줍니다.
기본 배치로 하이라키 탭에서 3D Object > Plane 으로 땅을 깔아 줍시다.
그 후에 3D Object > Capsule 로 주인공의 몸체를 만듭니다.
또한 주인공의 앞뒤를 구분하기 위해 간단하게 선글라스를 씌워 주겠습니다.
주인공 캡슐의 이름을 Player로 바꿔주시고, Player를 우클릭, 3D Object > Cube 로 자식 오브젝트로 넣어주겠습니다.
이제 적당히 크기와 위치를 조정해 주시면 이런 구성이 될겁니다.
색깔이 없으니 허전하네요. Project 빈 공간에서 우클릭, Create > Material 을 두 개 추가해서 바닥과 선글라스의 색깔을 넣어주겠습니다.
각각 Plane Color, Glass Color라고 설정해 주시고 속성(inspector)탭에서 Albedo 값으로 색을 지정하겠습니다.
색깔 설정이 완료된 Material을 오브젝트로 드래그 앤 드롭해주면 색깔 설정까지 완료됩니다.
이제는 플레이어가 물리적인 힘을 받을 수 있도록 Rigidbody 컴포넌트를 추가해야겠네요.
Player에서 Add Component > Rigidbody 추가.
또한 플레이어가 보고있는 방향을 기준으로 앞뒤로만 움직이게 할 것이고, 움직임을 직접 값으로 넘겨줄 것이기 때문에
Player의 Rigidbody > Constraints > Freeze Rotation 에서 x, y, z값 모두 체크해 주겠습니다.
이제 플레이어가 움직일 수 있도록 스크립트를 추가해 줍니다.
Project 탭에서 우클릭 Create > C# Script 선택해서 이름을 PlayerController 라고 지정합시다.
코드는 다음과 같습니다.
public class PlayerController : MonoBehaviour {
public Rigidbody myRigidbody;
public float rotationSpeed = 180f;
public float moveSpeed = 12f;
void Start () {
}
void Update () {
float inputRotation = Input.GetAxis ("Horizontal");
float inputSpeed = Input.GetAxis ("Vertical");
transform.Rotate (0, rotationSpeed * inputRotation * Time.deltaTime, 0);
Vector3 moveDistance = transform.forward * moveSpeed * inputSpeed * Time.deltaTime;
myRigidbody.MovePosition (myRigidbody.position + moveDistance);
}
}
여기서 핵심적인 부분은, rotationSpeed 라는 회전 속도와 moveSpeed 라는 움직이는 속도를 플레이어에게 어떻게 적용시키느냐입니다.
Update() 문 안의 코드들은 1초에 대략 30번~ 60번 실행됩니다. 이것을 흔히 게임에서 '프레임'이라고 하죠.
플레이어가 원하는대로 부드럽게 움직이려면 이 프레임 단위로 수행되는 단위가 극히 짧아야 합니다.
예를 들어서, moveSpeed가 12f라는 뜻은 1초에 12f만큼 가겠다는 뜻입니다. 그러나 만약
Vector3 moveDistance = transform.forward * moveSpeed * inputSpeed;
이런 식으로 코드를 작성하게 되면 1프레임마다 12f씩 튕겨나가는 주인공을 보시게 될겁니다.
그것을 방지하기 위해서 Time.deltaTime 이라는 녀석을 곱해주는 것이죠.
즉, 이 녀석을 곱함으로써 프레임이 다른 환경에서도 원하는 움직임을 똑같이 맞춰주는 것이다! 라고 생각하시면 되겠네요. 자세한 설명은 지금은 넘어가도록 하겠습니다.
transform.Rotate (0, rotationSpeed * inputRotation * Time.deltaTime, 0);
이 회전속도를 제어하는 코드도 역시 마찬가지입니다.
모든 3D 오브젝트는 x, y, z의 축을 가지고 있는데 저희가 만들 게임은 y축으로만 회전할것이기 때문에 x와 z값에는 0이 들어갑니다.
아참, inputRotation 과 inputSpeed 는 각각 "Horizontal" 과 "Vertical" 로 설정되어 있는데,
이것은 십자 방향키를 입력했을 때 "좌우" 와 "위아래"를 뜻합니다.
이 스크립트를 저장한 뒤에, Player의 inspector 탭에서 Add Component > PlayerController 를 검색해 넣어줍시다.
아래와 같이 스크립트에서 myRigidbody 에 Rigidbody 컴포넌트를 붙여주면 실행 완료입니다.
노트북 사양이 딸려서 약간 끊기네요.
자 그럼 오늘은 여기까지입니다.
'코딩을 배우자 > C#으로' 카테고리의 다른 글
[Unity] 탑다운 뷰 슈팅게임 만들기 (3) (0) | 2017.12.03 |
---|---|
[Unity] 탑다운 뷰 슈팅게임 만들기 (2) (0) | 2017.12.03 |