본문 바로가기
게임 프로그래밍/게임개발 중급

게임개발 중급(24) - 3D 게임 만들기(4)

by jyppro 2023. 5. 14.

3D 게임 만들기(4)

저번시간에는 아이템 생성, 방향키로 플레이어 이동하기 및 아이템 획득처리, 점수UI 처리를 하였습니다. 이번에는 UI를 사용한 플레이어의 움직임과 더불어 다양한 방식의 움직임에 대해 알아보겠습니다.

 

UI를 사용한 플레이어 움직임

이번에 해볼 것은 키보드입력을 통한 움직임이 아닌 UI를 클릭하거나 스마트폰에서 게임을 빌드했다면, 터치를 통해서 이동을 조작하는 방식을 해볼 것입니다. 우선 에셋스토어에서 UI로 사용할 이미지를 찾아서 사용할 것입니다. 저는 "Simple Button Set 01" 이란 이름의 무료 에셋을 다운받았습니다.

에셋-사진
심플 버튼 셋

 

에셋 스토어에서 다운받은 것을 유니티에서 사용하려면, 유니티에 들어가서 Package Manager -> Packages에 MyAssets로 들어가시면 구매한 에셋들이 전부 뜹니다. 그곳에서 해당 에셋을 클릭한 뒤 다운로드를 받고 임포트해주면 프로젝트에 사용할 수 있게 됩니다.

패키지-매니저
패키지 매니저 창

 

에셋 임포트가 완료되었다면 이제 UI를 만들겠습니다. 우선 왼쪽 오른쪽으로 움직이도록 해주는 UI를 만들어주기 위해 버튼을 사용해 만들고 화살표 이미지를 사용합니다. 색깔 구분을 위해 파란색으로 칠해줍니다.

 

화살표-UI
왼쪽 오른쪽 UI

 

이제 만든 UI에 기능을 넣어줄 차례입니다. 기능을 넣어주는 것은 그리 어렵지 않습니다.

PlayerController에 해당 기능을 만들어주기 위해 사용할 버튼을 정의해줍니다.

    GameObject RButton;
    GameObject LButton;

 

그리고, 해당 버튼이 하는 기능을 작성해 줍니다.

public void LButtonDown()
{
    transform.Translate(-0.3f, 0, 0);
}
public void RButtonDown()
{
    transform.Translate(0.3f, 0, 0);
}

 

UI로 생성한 버튼의 컴포넌트를 살펴보면, Button 컴포넌트가 존재하는 데, 밑으로 조금 내리면 OnClick()이 있습니다. 해당 버튼의 +를 눌러 추가해줍니다. 그곳에서 우리는 Player가 가지고 있는 PlayerController에서 위에 작성한 함수를 가져와야 합니다. 하이어라키에 존재하는 플레이어 오브젝트를 None에 드래그 앤 드롭해서 연결해준 뒤에 No Function에 드롭다운 바를 내려 해당 버튼의 기능을 하는 함수를 찾아 클릭해줍니다.

 

버튼-컴포넌트
온클릭 활성화

이렇게 연결을 마치면, 게임을 실행하고 버튼을 클릭했을 때 해당 기능을 실행하는 모습을 볼 수 있습니다.

 

 

다양한 방식의 움직임

UI를 통한 움직임 외에도 오브젝트를 움직이는 코드는 다양한 방식으로 작성될 수 있습니다.

처음에 작성했던 방향키를 이용한 움직임은 키입력을 받아와 key 변수로 방향을 조정하고, 변수로 선언된 일정수치의 힘만큼 rigidbody에 힘을 가하는 방식으로 작동합니다. 이 경우엔 키를 계속 누르고 있을 경우 점점 가속도가 붙으며 자연스러운 움직임을 구현할 수 있습니다.

이번에 작성한 UI를 사용한 움직임에는 Transform.Translate()를 사용해 해당 오브젝트의 Transform을 직접 좌표로 움직이는 방식으로 작동합니다. 이 경우엔 해당좌표로 고정적인 움직임을 보이기 때문에 부드럽진 않지만, 정확한 위치로 움직일 수 있습니다.

 

지금 사용해볼 방식은 방향키가 아닌 다른 키를 지정하여 움직이는 것인데, 이때 움직임을 구현하기 위해 사용하는 코드가 달라집니다.

//F키, B키로 움직이기
        if(Input.GetKey(KeyCode.F)) // 앞
        {
            key = 1;
            transform.Translate(0f,0f,forwardForce*key*Time.deltaTime);
        }
        else if(Input.GetKey(KeyCode.B)) // 뒤
        {
            key = -1;
            transform.Translate(0f,0f,forwardForce*key*Time.deltaTime);
        }

F와 B키를 사용해 앞, 뒤로 움직이는 코드를 작성해 보았습니다. Transform.Translate()를 UI에서 처럼 사용하지만, Time.deltaTime을 사용합니다. Time.deltaTime은 실시간 움직임에서 많이 사용되고, 프레임단위를 나타냅니다.

 

<NEXT>

다음에는 오늘했던 UI를 사용한 움직임으로 사용했던 Transform.Translate() 코드를 수정해 자연스럽게 움직이도록 바꿔주고, 상하좌우 4방향으로 만들어 보겠습니다. 그리고 게이지 UI를 만들어 아이템을 먹으면 게이지가 줄어들도록 하는 시스템을 추가하는 것을 해보도록 하겠습니다. 감사합니다.