게임 엔진/Unity

Unity 5일차 - 감독 스크립트와 사운드

FakeZero 2021. 7. 21. 05:00

  저번 시간에 오브젝트를 다룬 것에 이어 오늘은 UI를 다뤄 보도록 합시다. 정확히는 UI를 갱신하는 프로그램을 만져볼 껍니다. 이 시스템을 통해서 오늘 만들어볼 게임은 자동차를 달리게 하는 게임입니다.


0. 프레임 고정

  게임을 만들기 전에 한 가지 알려드리고 시작하고자 합니다. 저번 시간에 게임을 만들때 큰 문제가 하나 있었습니다. 바로 게임 엔진에서 보는 게임의 미리보기와 빌드한 게임의 속도가 같지 않다는 것이었습니다. 이것은 게임을 만들때 큰 피해가 됩니다. 그러니 이 속도를 맞추는 과정이 필요합니다.

  결론적으로 말하면 이런 현상이 일어나는 이유는 미리보기의 게임의 프레임과 빌드한 후의 게임의 프레임이 맞지 않아서 생기는 현상입니다. 따라서 스크립트를 통해 게임의 프레임을 고정해주는 작업이 필요합니다.

 

Application.targetFrameRate = 60;

  이 키워드 들이 게임의 프레임을 고정하는 키워드입니다. 위 프로그램은 60fps(프레임)으로 설정하도록 되어 있습니다. 숫자를 조정하면 더 높은 프레임으로 만들 수도 있습니다.

  프레임은 높을수록 게이머에게 자연스러운 움직임을 보여줍니다. 하지만 사람은 보통 60fps이상의 프레임은 인지하기 힘듭니다. 따라서 60프레임 정도로만 맞춰도 자연스러운 움직임을 보여줄 수 있습니다.

  참고로 실험결과 이 키워드를 쓴 후에 게임엔진의 미리보기 속도와 빌드한 후의 게임 속도가 같아졌습니다.

 

  그럼 이 키워드를 어떤 스크립트의 어디에 써야하는가가 궁금할 것 같습니다. 이 코드는 한 번만 실행되면 그 이후엔 그대로 유지되므로 게임 시작 후 가장 먼저 실행되는 스크립트에 작성되는 것이 좋습니다.


1. 계획하기

  이번에 만들 게임은 자동차를 움직여서 목표지점까지 보내는 게임을 만들것입니다. 게임이 시작되면 자동차와 깃발이 나오고 마우스로 자동차를 날리면 자동차가 움직여서 깃발까지 가는 게임을 만들껍니다. 깃발과 자동차 사이의 거리도 한 번 표시해봅시다.

  저번처럼 계획을 한 번 세워보죠.

 

1. 만들 게임: 자동차 게임
2. 필요한 리소스: 자동차, 깃발, 지면, 목표 지점까지의 거리 표시 UI, 자동차가 움직이는 소리
3. 게임이 구동될 플랫폼: PC
4. 필요한 기능: 자동차를 움직이는 기능, 목표지점 까지 거리를 표시하는 기능

5. 필요한 스크립트: 자동차를 움직이는 컨트롤러 스크립트, UI를 갱신할 수 있는 감독 스크립트


2. 리소스 준비하기

  이번에도 리소스를 준비해 왔습니다. 앞으로도 기본 리소스는 제공해드릴 예정입니다.

chapter4.zip
0.04MB

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


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

  이번에는 SwipeCar이란 이름으로 프로젝트를 만들었습니다. 나머지 설정은 4일차 강의와 똑같습니다. 기본적인 강의를 4일차까지 다 해두었으므로 이미 배운내용은 최소한으로만 언급할 것입니다. 기억이 안난다면 이전 강의로 돌아가서 복습해보세요.

  Assets창에 모든 파일들이 들어갔고 게임 해상도 설정까지 마쳤다면 완료된 것입니다.  이 씬을 세이브 하도록 합시다.


4. 오브젝트 배치

  먼저 바닥을 배치해보도록 합시다. ground 파일을 Scene 뷰에 끌고와서 이 오브젝트로 지면을 만들어주겠습니다.

  이렇게 배치했다면 성공입니다. 하지만 이래서는 지면이 되질 않습니다. 마우스로 변경하든 오른쪽의 Inspector 창에서 조정하든 해서 지면처럼 만들어주어야 합니다.

  방금 추가한 오브젝트를 선택하고 Inspector 창에서 Transform 항목의 Position을 0,-5,0, Scale을 18,1,1로 설정해두었습니다. 전에도 얘기했지만 이러한 요소는 게임을 망치지 않는 선에서 마음대로 바꿔보셔도 됩니다. 지금 푸른색 땅 오브젝트가 카메라의 범위 안에 들어왔으므로 게임을 실행하면 지면이 정상적으로 보일 것입니다.

  이번엔 자동차를 추가해 보았습니다. 위치는 -7, -3.7, 0 입니다. 이 좌표가 무엇을 의미하는지는 위 과정을 따라하셨다면 금방 알 수 있을 것입니다.

  같은 방법으로 깃발도 7.5, -3.5, 0 의 좌표에 설치하도록 합시다. 저번 강의에서 했던 것처럼 배경색도 바꿔봅시다. 전에는 자신이 원하는 색깔로 했지만 이번엔 지정된 색깔을 써보도록 하죠.

  배경색을 바꿀 때에 보면 색상을 바꾸는 창에 Hexadecimal이라는 항목이 있습니다. 이 항목은 말 뜻 그대로 색상을 16진법으로 나타낸 것입니다. 이번에는 DEDBD2(옅은 회색 오렌지) 색상을 이용했습니다. 이러한 16진법 색상 코드들은

 

https://www.colorhexa.com/

 

Color Hex - ColorHexa.com

Color hex encyclopedia providing information about any color.

www.colorhexa.com

  위 사이트들 같은 곳에서 자동으로 알려주는 것을 알 수 있습니다. 또한 Unity에서 색상을 변경할 때도 자동으로 바뀌게 됩니다.

  원래 색상은 빛의 3원색 원리에 따라 R(Red), G(Green), B(Blue), 그리고 명도와 채도를 조정하여 만듭니다. 그러나 색상 코드를 이용하면 이런 값들을 일일이 조정할 필요없이 한 번에 만들어 낼 수 있습니다.


5. 컨트롤러 스크립트 작성 및 적용

  오브젝트를 배치했으니 이제 해야할 것은 스크립트를 만들어 멈춰있는 오브젝트들이 움직이게 하는 것입니다.

  먼저 만들어볼 스크립트는 자동차 컨트롤러 스크립트로 왼쪽 클릭한 상태의 마우스를 움직인 만큼 자동차가 움직이게 할 것입니다. 하지만 무턱대고 모든 기능을 다 프로그램하려고 하면 어렵습니다. 그러니 우선 화면을 클릭하면 자동차가 움직이기 시작해서 서서히 멈추는 프로그램을 만들어봅시다.

  새로운 C# 스크립트를 만들어서 수정해봅시다. 저는 CarController이라는 이름으로 만들었습니다.

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

public class CarController : MonoBehaviour
{
    float speed = 0;

    void Start()
    {
        Application.targetFrameRate = 60;
    }

    void Update()
    {
        if(Input.GetMouseButtonDown(0)) //마우스 왼쪽 클릭
        {
            this.speed = 0.2f;  //처음 속도 설정
        }

        transform.Translate(this.speed, 0, 0); //현재 속도만큼 이동
        this.speed *= 0.98f; //현재 속도의 2%씩 속도 감속
    }
}

  이번에도 처음나오는 키워드만 정리하도록 하겠습니다.

Application.targetFrameRate = 60;

  0단계에서 소개한 프레임을 고정하는 키워드입니다. 스크립트가 실행되는 최초에만 한 번 실행되면 되므로 보이드 메서드가 아닌 스타트 메서드에 작성합니다.

transform.Translate(this.speed, 0, 0); //현재 속도만큼 이동

  Translate 키워드는 이전 강좌에서 썻던 Rotate와 다르게 이동을 담당하는 키워드입니다. 위 프로그램에서는 현재 속도 값 만큼 x좌표를 이동하도록 되어 있습니다.

  그리고 벡터에 대한 얘기도 조금 더 해봅시다. 저희의 목적은 자동차를 '오른쪽'으로 이동시키는 것입니다. 그러기 위해 이동하는 함수의 인자의 x값에 해당하는 인자에 +값을 대입해 주었습니다. 즉, Translate 메서드에서 x축의 +방향은 평면상의 오른쪽이란 얘기죠.

  여러가지 실험을 해보면 결과적으로 Translate 메서드의 좌표축이 어떻게 설정되어 있는지 알 수 있습니다. Translate 메서드는 좌표축이 다음과 같이 설정되어 있습니다.

  그런데 이 좌표축, 어디서 많이 본 것 같죠? Rotate 메서드도 똑같은 좌표축을 사용하기 때문입니다. 따라서 Unity에서 사용하는 좌표축은 기본적으로 위와 같이 설정되어있다고 볼 수 있습니다. 실제로 오브젝트의 위치를 움직일때도 이 기준으로 움직이는걸 이미 확인하셨을 껍니다.

 

  이제 CarController 스크립트를 Car 오브젝트에 적용시켜서 잘 움직이는지 확인해봅시다.

 

  클릭하면 자동차가 움직였다가 정지하면 정상적으로 적용이 된겁니다. 게임 속도도 이전보다 조금 느려진 것을 확인할 수 있었습니다.

  하지만 이대로라면 두 번만 클릭하면 게임이 클리어 되어 버리는 아주 단순한 게임이 되어버립니다. 그러니 기능을 추가해서 마우스를 드래그한 거리에 따라 자동차의 속도를 변화시켜 봅시다.

  이번 게임에선 마우스를 드래그한 거리를 이용해 자동차의 속도를 지정 하겠습니다. 코드는 다음과 같습니다.

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

public class CarController : MonoBehaviour
{
    float speed = 0;
    Vector2 startPos;

    void Start()
    {
        Application.targetFrameRate = 60;
    }

    void Update()
    {
        // 스와이프 길이를 구한다.
        if(Input.GetMouseButtonDown(0)) //마우스 왼쪽 클릭
        {
            // 마우스를 클릭한 좌표
            this.startPos = Input.mousePosition;
        }
        else if(Input.GetMouseButtonUp(0))
        {
            //마우스 버튼에서 손가락을 떼었을 때 좌표
            Vector2 endPos = Input.mousePosition;
            //변수에 마지막 마우스 x좌표에서 시작 마우스 x좌표값을 뺀 값을 저장(스와이프 길이)
            float swipeLength = (endPos.x - this.startPos.x);

            //스와이프 길이를 자동차의 속도로 지정
            this.speed = swipeLength / 1000.0f;
        }

        transform.Translate(this.speed, 0, 0); //현재 속도만큼 이동
        this.speed *= 0.98f; //현재 속도의 2%씩 속도 감속
    }
}

  처음나오는 키워드 설명들어갑니다.

Input.mousePosition;

  위 키워드는 현재 마우스 포인터의 좌표를 Vector2의 형태로 내보냅니다. 그래서 이 값을 이용해 마우스를 누르기 시작했을 때의 마우스 좌표와 마우스 버튼에서 손을 땠을 때의 좌표를 구했습니다.

Input.GetMouseButtonUp(0)

  Input.GetMouseButtonDown(0)와 완전히 반대 개념의 키워드입니다. Input.GetMouseButtonDown(0)은 눌렀을 때를 감지하고 Input.GetMouseButtonUp(0)은 뗐을 때를 감지합니다.

https://docs.unity3d.com/kr/530/ScriptReference/Input.GetMouseButtonUp.html

 

Unity - 스크립팅 API: Input.GetMouseButtonUp

You need to call this function from the Update function, since the state gets reset each frame. It will not return true until the user has pressed the mouse button and released it again. 버튼이 0이면 좌클릭, 1이면 우클릭, 2이면 중앙을 클

docs.unity3d.com

  위 링크에 설명이 되어있지만 일단 이 곳에도 인자에 대해서 정리를 해두겠습니다.

키워드 반환 되는 값
Input.GetMouseButtonUp(0) 마우스를 좌클릭했다가 뗐을 때, True값 반환
Input.GetMouseButtonUp(1) 마우스를 우클릭했다가 뗐을 때, True값 반환
Input.GetMouseButtonUp(2) 마우스휠을 클릭했다가 뗐을 때, True값 반환
this.speed = swipeLength / 1000.0f;

  추가로 속도를 정하는 코드에서는 스와이프 길이를 그대로 쓴 것이 아니라 스와이프 길이값에 1000을 나눴습니다.  1000을 나누지 않으면 속도가 굉장히 빨라집니다. 실제로 1000을 나누지 않고 실행해보면 알 수 있습니다. 그래서 어느정도 속도를 맞추기 위해 1000으로 나눴습니다. 이 값은 게임을 만들며 임의로 정해도 되는 값입니다. 원하는대로 정해보세요.

 

  이제 성공적으로 적용됬는지 게임에서 확인해봅시다.

 

 스와이프한 길이에 따라서 자동차의 속도가 달라지는 것을 볼 수 있었습니다.


6. UI 오브젝트 배치 그리고 감독 스크립트 작성 및 적용(UI 만들기)

  이제 UI를 만들어봅시다. UI(User Interface)란 게임의 상태나 진행 상황을 표시하는 것으로 게이머가 게임을 즐기기 편하도록 하는 것이 목적입니다.

  이번 강좌에서 만들 UI는 깃발과 자동차간의 거리를 알려주는 UI입니다.

 

  먼저 UI 오브젝트를 배치하겠습니다. 이번엔 텍스트가 필요하니 텍스트를 이용하도록 하겠습니다.

  이전에 빈 오브젝트를 만들었을 때 처럼 Hierarchy창의 빈 공간에 우클릭해서 UI의 Text를 클릭해서 UI 오브젝트를 만들어봅시다. 그렇게 하면 Canvas라는 오브젝트에 종속된 Text 오브젝트가 생성됩니다. 저는 오브젝트의 이름도 Distance로 바꿔주었습니다. 하지만 정작 오브젝트를 만들어도 오브젝트가 보이지 않을 껍니다. 그 이유는 Text 오브젝트의 크기가 매우 크기 때문입니다 Hierarchy 창에서 Distance 오브젝트를 더블 클릭해보면 해당 오브젝트가 잘보이도록 시점이 바뀌므로 바로 알 수 있습니다.

  이렇게 크기가 굉장히 크지만 게임을 실행해보면 왼쪽 아래에 작게 Text가 표시되는 것을 알 수 있습니다. UI 오브젝트의 크기는 Canvas 오브젝트 안에서 표시되는 대로 지정됩니다. Canvas 오브젝트를 더블 클릭하면 이 오브젝트가 일정 범위를 가지고 있는 것을 알 수 있는데 이 안에서 표시되는대로 게임 화면에 표시됩니다. 아직은 이해가 힘들 수 있으니 차차 실제로 해보며 이해해보도록 합시다.

 

  동시에 UI 오브젝트를 만듦과 동시에 새로 생겨난 오브젝트가 하나 더 존재합니다. EventSystem 오브젝트 입니다. 이 오브젝트는 사용자 입력과 UI 오브젝트를 중간에서 이어 주는 오브젝트로 UI를 사용할 때 반드시 필요합니다.  EventSystem을 사용하면 입력 할당이나 무효화 등 키와 마우스 설정을 변경할 수 있습니다.

 

  이제 UI 오브젝트의 위치와 크기를 지정해 봅시다. 자신이 만든 UI 오브젝트(저는 Distance 라고 이름을 정해두었으므로 앞으로 Distance 오브젝트라 부르도록 하겠습니다.)를 클릭하고 Inspector 창에서 조정해 봅시다.

  먼저 위치를 지정해 줍시다. Inspector 창에서 Rect Transform 항목에서 지정할 수 있습니다. 여기서 위치란 Canvas 오브젝트가 지정하고 있는 범위 안에서의 위치입니다. Pos X,Y,Z의 값에 모두 0을 대입하면 기존의 중앙 좌표인 (0,0,0)좌표가 아니라 Canvas 오브젝트가 지정하고 있는 범위(앞으로 UI 설계 화면 이라 부르겠습니다.)에서 중앙좌표로 이동하게 됩니다.

 

  이제 크기를 지정해줍니다. Width를 700, Height를 80으로 지정합니다.

 

  이제 표시되는 텍스트에 관한 설정을 해봅시다.

  텍스트에 관한 설정은 Text 항목에서 할 수 있습니다.

  Text의 Character 항목에서 Font Size를 64로 맞추겠습니다.

  Text의 Alignment 항목에서는 정렬 방향을 설정할 수 있습니다. 세로 방향과 가로 방향 모두 가운데 정렬로 설정했습니다. 이 과정이 끝나면 게임에선 다음과 같이 나타납니다.

  텍스트를 정상적으로 게임화면에 나오게 하는데 성공했습니다. 하지만 나오는 글씨가 New Text 일 뿐이라면 아무런 의미가 없습니다. 이제 이 New Text부분에 자동차와 깃발 사이의 거리를 표시할 수 있도록 스크립트를 작성하겠습니다.

  새로운 C# 스크립트를 만들어봅시다. 저는 GameDirector라는 이름으로 만들었습니다. 스크립트에 써야할 코드는 다음과 같습니다.

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

public class GameDirector : MonoBehaviour
{
    GameObject car;
    GameObject flag;
    GameObject distance;

    void Start()
    {
    	Application.targetFrameRate = 60;
        this.car = GameObject.Find("car");
        this.flag = GameObject.Find("flag");
        this.distance = GameObject.Find("Distance");
    }

    void Update()
    {
        float length = this.flag.transform.position.x - this.car.transform.position.x;
        this.distance.GetComponent<UnityEngine.UI.Text>().text = "목표 지점까지" + length.ToString("F2") + "m";
    }
}

  갑자기 처음보는 키워드들이 잔뜩 등장했습니다. 이는 감독 스크립트가 움직이고 있는 오브젝트의 스크립트와는 다른 특성을 가지기 때문입니다. 하나하나 알아가 보도록 하겠습니다.

using UnityEngine.UI;

  UI 설정을 할 수 있도록 하는 라이브러리를 불러옵니다.

GameObject car;
GameObject flag;
GameObject distance;

  GameObject 변수를 이용해서 자동차와 깃발, 그리고 거리를 표시하는 UI 오브젝트가 들어갈 변수를 만들어 주었습니다. 하지만 이렇게 하면 아직 비어있는 변수 입니다. 이곳에 게임의 어떤 오브젝트를 집어넣을지 정해주어야 합니다.

Application.targetFrameRate = 60;
this.car = GameObject.Find("car");
this.flag = GameObject.Find("flag");
this.distance = GameObject.Find("Distance");

  위 코드를 통해 각 변수에 오브젝트를 지정해 줍니다. 인자에 들어가 있는 문자열의 이름으로 된 Hierarchy창의 오브젝트를 찾고 오브젝트의 위치 등의 현 상태의 정보를 변수에 집어넣는 코드입니다. 이 정보들을 이용해 UI를 변화시키겠습니다. 이 과정은 최초 1회만 하면 되므로 Start 메서드에 작성했습니다.

  또한 프레임을 고정하는 코드도 이쪽으로 옮겼습니다. 그 이유는 감독 스크립트는 게임이 시작되자 마자 실행되기 때문에 가장 먼저 고정할 프레임을 지정해 줄 수 있기 때문입니다. 프레임을 고정하는 코드를 GameDirector 스크립트로 옮겼으니 해당 코드를 CarController 스크립트에서 지워도 됩니다.

 

(CarController 스크립트도 게임이 시작될때 같이 실행되긴 합니다. 그러나 이번 강의에서는 같은 코드를 다른 곳에서 쓸 때 더 좋은 효과를 가지고 올 수 도 있다는 것을 설명하기 위해 이렇게 했습니다. 결론적으로 프레임을 고정하는 코드는 어느 스크립트든 한곳에만 쓰면 됩니다. 이번 게임의 경우 사용된 스크립트가 한번에 전부 실행되는 게임이지만 그렇지 않은 게임들도 많습니다. 이런 경우에 게임의 설정에 관여하는 코드는 가장 먼저 실행되는 스크립트에 작성되어야 합니다.)

 

float length = this.flag.transform.position.x - this.car.transform.position.x;

  length라는 실수형 변수를 만들었습니다. 이 변수가 자동차와 깃발 사이의 거리값을 저장합니다.

  자동차와 깃발 사이의 거리를 구하기 위해서는 자동차와 깃발의 현상태 x좌표 값을 불러올 필요가 있습니다. 아까 저장한 flag와 car의 GameObject 변수에서 위치값을 가지고와야 합니다.

  저번 시간에 transform이라는 키워드에 대해서 설명한 적이 있습니다. 위치와 관련된 값을 가지고 있는 '컴포넌트'입니다. 저번 시간에는 오브젝트의 위치값 중 회전과 관련된 값을 사용했습니다. 이번에는 위치값을 사용합니다. position이 바로 그 의미입니다. 그중에서도 x값을 가지고 오는 겁니다.

  깃발과 자동차 사이의 거리를 구하려면 깃발의 x값에서 자동차의 x값을 빼야합니다. 그렇기 때문에 위와 같은 코드가 나왔습니다.

this.distance.GetComponent<Text>().text = "목표 지점까지" + length.ToString("F2") + "m";

  이 코드는 말 그대로 UI의 텍스트를 바꾸는 역할을 합니다. distance 변수의 Text 컴포넌트에서 text 값을 변경하면 됩니다.

  문자열은 맞는데 중간에 명백히 혼자 뭔가 다른 녀석이 있습니다. length.ToString("F2")입니다. 이녀석은 숫자를 문자열(string)로 변환하는 역할을 합니다. length변수는 실수형 변수 입니다. 때문에 자료형을 바꿔줄 필요가 있습니다. 그 역할을 하는 것이 ToString 메서드입니다. 말 그대로 어떤 자료형을 문자열로 바꿔주는 메서드입니다. 중요한 것은 그 뒤에있는 ("F2")에 대해서 입니다. 이 문자는 서식지정자라고 합니다. 당연히 필요한 자료형에 따라 이 부분도 달라집니다. 아래 표는 자주 쓸 것 같은 서식 지정자 2개를 정리한 것입니다.

서식 지정자 설명
정수형 D|자릿수| 정수를 표시할 때 사용한다. 지정한 자릿수를 채우지 않으면 왼쪽에 0이 삽입된다. (456).ToString("D5") -> 00456
고정 소수점형 F|자릿수| 소수를 표시할 때 소수점 이하 자릿수를 조정한다. (12.3456).ToString("F3") -> 12.345

  이 외에도 백분율이나, 16진수 등 다양한 서식 지정자가 존재합니다.

 

  이제 만든 감독 스크립트를 감독 오브젝트를 만들어서 적용합시다.

  새로 빈 오브젝트를 만듭시다. 저는 이름을 GameDirector이라고 지어 주었습니다. 빈 오브젝트는 게임에 영향을 줄 수 있지만 실체는 없어서 감독 오브젝트로 안성맞춤입니다. 이제 만들어둔 GameDirector 스크립트를 GameDirector 오브젝트에 적용 시킵시다. 이름이 같아서 둘의 이름이 같아야 하는건가 싶을 수 있지만 이 둘의 이름이 같은것에는 알아보기 쉽게 하려는 의도 말고는 다른의도는 들어 있지 않습니다. 하지만 프로그램이 복잡해지면 복잡해질수록 어디에 뭐가 적용됬는지 알기 위해서는 이름을 직관적으로 잘 정하는 것도 중요합니다.


8. 사운드 이펙트 넣기

  아무래도 게임할 때 아무런 소리도 안나면 밋밋하니 소리를 집어넣어 봅시다. 자동차가 달려가는 소리입니다. 소리를 이용하기 위해서는 오브젝트에 새로운 컴포넌트를 추가해야합니다.

  소리를 내는 오브젝트는 자동차이므로 자동차 오브젝트를 선택하고 진행합니다.

  이렇게 AudioSource 컴포넌트를 사용할 준비가 되었습니다. 이제 사용할 효과음을 지정해주고 움직일때 효과음을 플레이 하도록 스크립트를 수정하면 됩니다.

  새로 생긴 Audio Source 컴포넌트의 AudioClip 항목에서 에셋창에 추가해두었던 car_se 효과음을 가지고 옵니다. 그리고 게임이 시작하자마자 효과음이 나오지 않도록 Play On Awake 설정을 해제하겠습니다.

 

  이제 스크립트를 조정합시다. 조정해야하는 스크립트는 CarController 스크립트 입니다. 코드를 다음과 같이 변경합니다.

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

public class CarController : MonoBehaviour
{
    float speed = 0;
    Vector2 startPos;

    void Start()
    {

    }

    void Update()
    {
        // 스와이프 길이를 구한다.
        if(Input.GetMouseButtonDown(0)) //마우스 왼쪽 클릭
        {
            // 마우스를 클릭한 좌표
            this.startPos = Input.mousePosition;
        }
        else if(Input.GetMouseButtonUp(0))
        {
            //마우스 버튼에서 손가락을 떼었을 때 좌표
            Vector2 endPos = Input.mousePosition;
            //변수에 마지막 마우스 x좌표에서 시작 마우스 x좌표값을 뺀 값을 저장(스와이프 길이)
            float swipeLength = (endPos.x - this.startPos.x);

            //스와이프 길이를 자동차의 속도로 지정
            this.speed = swipeLength / 1000.0f;

            //효과음을 재생
            GetComponent<AudioSource>().Play();
        }

        transform.Translate(this.speed, 0, 0); //현재 속도만큼 이동
        this.speed *= 0.98f; //현재 속도의 2%씩 속도 감속
    }
}

  34번째 줄에 효과음을 재생하는 코드를 새로 작성했습니다.

GetComponent<AudioSource>().Play();

  방식은 단순합니다. 스크립트가 적용되어 있는 오브젝트의 AudioSource 컴포넌트에서 Play메서드를 실행하는 것 뿐입니다. else if(Input.GetMouseButtonUp(0))의 블록 안에 작성했으므로 마우스 버튼에서 손가락을 뗄때, 즉, 자동차가 달려갈 때 효과음이 재생되게 됩니다.


9. 실행해보고 빌드해서 실행해보기

  이제 모든 스크립트가 완성되었으니 게임을 실행해 볼 차례입니다.

 

  모든 것이 정상적으로 작동하고 있습니다. 이제 빌드해서 만들어진 게임을 실행해봅시다. 유니티의 미리보기와 같다면 성공적으로 게임이 만들어진 것입니다.


  이제야 뭔가 게임다운 무언가를 만들 수 있게 되었다는 생각이 들기 시작한 것 같습니다. 앞으로 강좌를 진행하면 진행할 수록 더 게임다운 게임을 만들 수 있게 될 것입니다.

  동시에 한가지 느끼는 것이 생겼을 것입니다. 바로 개발 속도입니다. 이걸 읽고 계시는 분들마다 속도의 차이는 있겠지만 프로그램의 모든 요소를 이해하고 게임이 완성될 때까지 이전 강의보다 명백히 많은 시간이 걸렸음을 알 수 있을 것입니다. 당연한 일입니다. 게임이 고급화 되었으니 개발 시간이 늘어나는 것은 아주 자연스러운 일입니다. 때문에 게임 회사에서는 다른 사람과 협력하고 연단위의 많은 시간을 들여 게임을 만들게 됩니다.

 

  이야기가 살짝 어긋났군요. 말하고 싶은 것은 다음 강좌부터 게임을 만들때는 강좌를 두 파트로 나눠서 진행하게 됩니다. 한번에 많은 양을 전부 처리하기에는 읽고 계시는 여러분도 체력적으로 힘들 것 같기 때문이죠.

 

  오늘 강좌 읽느라 정말 수고 많으셨습니다. 다음 강좌에서 뵙도록 하겠습니다.