저번 포스팅에 이어서, 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 컴포넌트를 붙여주면 실행 완료입니다.




노트북 사양이 딸려서 약간 끊기네요.


자 그럼 오늘은 여기까지입니다. 

+ Recent posts