게임 엔진/Unity

Unity 6일차 - 화살표 피하기 게임-1 (플레이어 캐릭터, 화살표 떨어뜨리기)

FakeZero 2021. 7. 24. 03:16

     오늘은 똥피하ㄱ...아니 화살표 피하기 게임을 만들어 봅시다. 그리고 오늘부턴 개발 과정이 길어짐에 따라 강좌를 두 번에 거쳐 하나의 게임을 만들도록 하겠습니다.


1. 계획하기

  이번에 만들 게임은 아주 간단합니다. 화살표를 랜덤으로 떨어뜨리며 플레이어가 그걸 피하면 됩니다. 흔한 피하기 게임을 만들어 볼껍니다.

 

1. 만들 게임: 화살표 피하기 게임

2. 필요한 리소스: 플레이어, 화살표, 배경화면, HP 게이지

3. 게임이 구동될 플랫폼: PC

4. 필요한 기능: 플레이어를 움직이는 기능, 화살표가 랜덤으로 떨어지는 기능, HP가 닳는 기능

5. 필요한 스크립트: 플레이어 컨트롤러 스크립트, 화살표 컨트롤러 스크립트, 화살표를 생산하는 스크립트, HP를 관리할 감독 스크립트


2. 리소스 준비하기

chapter5.zip
0.17MB

(본 파일은 <유니티 교과서>의 출판사, [길벗]에서 제공한 것임을 밝히며 2차 수정 및 배포를 금지합니다.)


3. 프로젝트 생성 및 사전 설정

  이제는 익숙할테니 별 말 없이 지나가겠습니다. 에셋 창에 받은 리소스들을 불러오도록 합시다. 프로젝트 이름은 CatEscape로 해두었습니다.

  현재 상태를 잘 저장해줍시다.


4. 오브젝트 배치

  Player 이미지를 Scene 뷰에 배치하고 Inspector 창에서 위치 좌표(Position)를 (0, -3.6, 0)으로 설정합니다.

  배경도 추가하겠습니다. 이번에는 언제나 쓰던 카메라 오브젝트에 기본으로 내장된 배경기능이 아닌 배경 오브젝트를 사용하도록 하겠습니다. background 이미지를 Scene 뷰에 배치하고 위치(Position)을 (0, 0, 0), 스케일(Scale)을 (4.5, 2, 1)로 설정합니다.

 

  이제 두 오브젝트를 배치했으니 어떤 오브젝트가 앞에 올지 결정해야 합니다. 만약 배경 오브젝트가 플레이어 오브젝트보다 앞으로 온다면 플레이어 캐릭터가 보이지 않을테니까요. 이 개념을 레이어라고 부릅니다.

  레이어를 조종하는 방법은 간단합니다.

  오브젝트를 클릭하고 Inspector 창에서 Order in Layer의 값을 바꿔주면 됩니다. 0부터 설정할 수 있으며 숫자가 작을 수록 오브젝트가 뒤로가고 숫자가 클수록 오브젝트가 앞으로 옵니다. 우린 배경 레이어가 뒤로 가고 플레이어 레이어가 앞으로 와야 하므로 배경 오브젝트의 레이어를 0, 플레이어 오브젝트의 레이어를 1로 설정해 줍시다.


5. 플레이어 컨트롤러 스크립트 작성

  이제 플레이어가 움직일 수 있도록 스크립트를 작성하겠습니다. 이번 강좌에서 드디어 키보드를 써서 플레이어 캐릭터를 움직입니다. 잘 따라와 주세요.

  일단 새로운 C# 스크립트를 만듭시다. 저는 PlayerController이라는 이름으로 만들었습니다. 코드는 아래와 같습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    void Start()
    {
        
    }

    void Update()
    {
        //왼쪽 화살표가 눌렸을 때
        if(Input.GetKeyDown(KeyCode.LeftArrow))
        {
            transform.Translate(-3, 0, 0);
        }

        //오른쪽 화살표가 눌렸을 때
        else if(Input.GetKeyDown(KeyCode.RightArrow))
        {
            transform.Translate(3, 0, 0);
        }
    }
}

  오늘도 어김없이 새로 보이는 것들만 합니다.

if(Input.GetKeyDown(KeyCode.LeftArrow))

else if(Input.GetKeyDown(KeyCode.RightArrow))

Input.GetKeyDown 키워드는 이전에 썼던 마우스를 클릭하는 것을 감지하는 키워드와 비슷하게 키보드 자판을 누르는 것을 감지해서 키가 눌리는 순간 TRUE값을 한 번 반환하는 키워드 입니다. 다만 어떤 키를 눌렀는지 지정해주는 것이 중요한데 그것은 옆에 보이는 것처럼 KeyCode라는 것을 이용합니다. 키보드 자판을 지정할 수 있도록 만들어진 장치 입니다. 지금은 키보드의 왼쪽 화살표와, 오른쪽 화살표를 누르게 되어있지만 원하면 마음대로 바꿀 수 있습니다. KeyCode에 대한 정확한 정보는 아래 링크에서 확인하시면 됩니다.

https://docs.unity3d.com/kr/2019.4/ScriptReference/KeyCode.html

 

KeyCode - Unity 스크립팅 API

Key codes returned by Event.keyCode. These map directly to a physical key on the keyboard.

docs.unity3d.com

  이제 스크립트를 플레이어 오브젝트에 적용시키고 작동시켜 보세요.


6. Physics를 사용하지 않고 화살표 떨어뜨리기

  이번엔 화살표가 떨어지게 만들어 보겠습니다. 원래 이런 작업들은 게임 엔진이 구현해 놓은 물리엔진을 이용해 더 쉽고 빠르게 작업할 수 있습니다. 다만 물리엔진을 사용하게 되면 직접적인 움직임을 제어하기가 어렵습니다. 이번 강좌에서는 물리엔진을 사용하지 않고 화살표를 떨어뜨려보겠습니다.

 

  화살표를 만들기로 했으면 화살표를 Scene 뷰에 배치하고 위치를 (0, 3.2, 0)에 배치해줍시다. 그리고 레이어도 1로 바꿔주도록 합시다.

  이제 또다시 스크립트를 만듭시다. 이번엔 ArrowController 이라는 이름으로 지었습니다. 코드는 아래와 같습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ArrowController : MonoBehaviour
{
    void Start()
    {
        
    }

    void Update()
    {
        // 프레임마다 등속으로 낙하시킨다.
        transform.Translate(0, -0.1f, 0);

        //화면 밖으로 나오면 오브젝트를 소멸시킨다.
        if(transform.position.y < -5.0f)
        {
            Destroy(gameObject);
        }
    }
}

  이 코드에서는

Destroy(gameObject);

  이거말고는 볼 것이 없겠군요. 화살표가 화면 밖을 나가서 계속 떨어져서 오브젝트가 점점 쌓이게 되면 컴퓨터의 CPU가 버티지 못할 껍니다. 따라서 화면 밖을 나가는 오브젝트는 소멸시켜서 지워주어야 합니다. Destroy라는 키워드가 그 일을 하고 gameObject는 이 스크립트가 적용되어있는 오브젝트를 말합니다.

 

  저번시간에도 gameobject라는 단어를 쓴 적이 있습니다. 하지만 저번 시간에 쓴 키워드는 GameObject이고 이번 시간에 쓴 키워드는 gameObject입니다. 대문자 하나 차이입니다만 코딩에서 대문자의 유무는 매우 중요하므로 잘 구분하시길 바랍니다.

 

  이제 게임을 구동해서 확인해보도록 합시다. 참고로 우리는 프레임을 고정하는 코드를 짜지 않았으므로 미리보기에서는 매우 빠른 속도로 화살표가 지나갈 것입니다. 다음시간에 UI를 만들며 같이 만들 생각이니 혹시 먼저 빌드 해보고 싶으신 분들은 참고 바랍니다.

 

(위 영상은 임시로 화살표 컨트롤러 스크립트에 프레임을 60프레임으로 고정하는 코드를 짜둔 상태입니다.)


  오늘은 일단 여기까지 하도록 하겠습니다. 충돌에 대한 판정과 UI등의 프로그램은 다음 기회에 짜도록 하겠습니다. 수고하셨습니다.