레트로의 유니티 게임 프로그래밍 에센스 (2024)

All 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147

P:01

레트로의

유니리

⑶수0#

이제민 지을

사8 한빛믾,단이

느느느느느느

게임 프로311밍

에센스

으#의5 0|으쁜 애류퉈레 4가지 게임 제작까지

P:02

개발한경과몌제파일

개발환경

유니티2019.1 이후버전과의호환

이 책의 모든 예제와 그림은 유니티 2019.1 버전으로 제작했습니다.

예제 파일

향후 유니티 버전에서 호환성 문제가 발생하는 경우 깃허브 예제 폴더의 안내 문서에 해결 방법

을 추가하겠습니다.

프로젝트의 코드는 특정 버전의 유니티 기능에 의존하지 않도록 구성했습니다. 따라서 유니티

2019.1 이후 버전에서도 예제가 호환됩니다.

필요한 예제 파일과 프로젝트. 게임 완성본. 전체 예시 코드 등을 묶은 예제 압축 파일을 인터

넷으로 제공하고 있습니다.

이 책의 모든 예제는유니티 2019.1을 기준으로 만들었습니다.

모든 예제는 맥05와 윈도우 환경에서 정상 동작을 테스트했습니다.

맥08를 기준으로 설명하지만 윈도우 환경과 차이점은 없습니다. 다른 점이 있을 때는 윈도

우를 함께 설명합니다.

이 책에서 소개하는 예제 중 일부는 미리 준비한 프로젝트를 사용합니다.

‘ 깃허브 : 9휴그1)13.0001/1니트즈시오!/1)0)17-우!'에09"드556006

’ 한빛미디어 : 사'180에.00.1유/31’0/10151

예제 압축 파일 다운로드

깃허브와 한빛미디어 홈페이지에서 예제 압축 파일을 다운로드할 수 있습니다. 분실 방지와 원

활한 갱신을 위해 예제 압축 파일은 다운로드 링크로 제공됩니다.

P:03

1)0’17’(’으09?0오01;09-&550000

시작(준비) 프로젝트 완성된 프로젝트

17장 예제 플더

안내 문서

각 장의 폴더에는 최대 두 개 폴더가 존재합니다.

라이선스와 크레딧

이 책의 5부 유니런에서는 유니티 재팬에서 제작한 유니티짱 에셋을 사용합니다. 유니티짱 캐

릭 터와 에셋의 모든 권한은 @ 00117 76사'111010응!68 3자XI11/1*1?게 있습니다. 이 책에서 사용

만약 어떤 장의 완성본을 미리 보고 싶다면 0006 폴더 내부에 있는 유니티 프로젝트 폴더를

열면 됩니다.

- 시작 프로젝트 : 장을 시작하면서 사용할 유니티 프로젝트(예 : 201-01316)

- 0009 : 장을 마쳤을 때의 결과물이 저장된 폴더

예제 압죽 파일 사용 방법

다운로드한 예제 압축 파일의 압축을 풀면 안내 문서 파일과 각 장에 대한 폴더가 생성됩니다

(예제 프로젝트를 사용하지 않는 장은 폴더가 없습니다).

P:04

개발 환경과 예제 파일

‘ 110바이130.00171

문의 사항

예제 파일의 다운로드와 오류 등의 문제는 저자의 메일이나 블로그로 문의해주세요.

하는 유니티짱 에셋은 유니티짱 라이선스 2.0에 따라 제공됩니다. 유니티 짱에 관한 자세한 정

보는 다음 주소에서 확인할 수 있습니다.

이 책의 6부 ‘좀비 서바이버‘의 레벨 디자인에는 1오!106)'와 ②"비구118가 제작한30 모델이

사용되었습니다. 이들은 훌륭한 아트 에셋을 만들어 퍼블릭 도메인(0(20)으로 배포하고 있습

니다. 이들의 에셋은 아티스트를 구하기 힘든 초보 개발자나 독립 개발자에게 많은 도움을 주

고 있습니다.

‘ 메일 : 1^|611110@0111100^0001

’ 블로그 : 1)60110.0001

‘ |《6006오 : 스6006유0|

’ 011316011115 :(111316지03.000*1

P:05

이 책의 구성

이 책은 총 7부로 구성되어 있습니다.

1무 : 유니티 준비하기

유니티들 준비하고. 유니티 동작 원리와 인터페이스를 배웁니다.

2부 : 0# 프로그래밍

욍초보자 입장에서 으# 프로그래밍과 객체지향을 배웁니다.

3부: 탄막슈팅게임-닷지

30 탄알 피하기 게임을 만듭니다.

키보드 조작으로 공을 굴리는 작은 예제에서 시작하여 탄알. 1)1,게임 매니저를 만들고 최종

빌드까지 게임 완성에 필요한 모든 부분을 진행합니다. 또한주기적으로 탄알 생성을 반복하는

방법. 점수를 저장하는 방법을 배웁니다.

유니니 개발 환경을 준비하고 맛보기 프로젝트를 만듭니다. 게임 오브젝트와 컴포넌트의 원리

와 농 사을 이해합니다. 게임 엔진의 구조와 개발 방식을 이해합니다.

코딩 원리와 객체지향을 즉시 이해할수 있는 그림 예시로 설명합니다. ^# 스크립트를 직접 작

싱하면서 필요한 대부분의 으# 문법을 익힙니다.

1부에서 살펴본 유니티의 동작 원리가 으#의 객체지향과 어떻게 맞물리고. 스크립트가 어떻게

게임 오브젝트와 컴포넌트를 통제할 수 있는지 이해합니다.

1 부와 2부는 유니티와 코딩을 당장 이해하는 데 가장 삐르고 필수적인 핵심을 빠르게 배읍니

다. 실습 프로젝트를 진행하는 3부. 5부. 6부는 장르별로 게임을 하나씩 완성하면서 실습을 통

해 이론을 이해합니다. 실습 프로젝트에서는 기존 지식으로 해결할 수 없는 문제를 새로운 방

법으로 돌파하는 방식으로 진행합니다. 4부는 비전공자 입장에서 게임 개발에 필요한 수학적

기반은 배웁니다. 7부는 멀티플레이 게임 구현을 배우고. 부록에서는 모바일 빌드에 대해 알아

봅니다.

P:06

4부 : 공간

공간. 속도. 회전을 통제하기 위한 선형대수를 배웁니다.

벡터 수학. 지역 공간과 전역 공간. 회전에 사용되는 쿼터니언을 배우게 됩니다.

5부 : 20 러너 게임 - 유니런

발관이 무한 랜덤 생성되는 20 러너 게임을 개발합니다.

6부 : 탑다운 슈터 게임 - 좀비 서바이버

몰려오는 인공지능 좀비들을 총으로 쏘는 탑 다운 슈터 게임을 제작합니다.

플레이어의 입력을 받아 힘과 속도를 제어하는 방법을 배웁니다. 입력 매니저와 시간 간격 같

은 기초 개념이 꼭 필요한 이유를 현실 사례로 설명합니다.

으# 인터페이스, 이벤트. 람다 표현식을 사용하여 플레이어와 인공지능 적의 대미지 처리 코드

를 간결하게 줄이는 방법을 배우게 됩니다. 후처리를 사용하여 영상미를 구현합니다.

비전공자와 선형대수를 따로 공부할 여유가 없는 개발자를 위해 복잡한 증명 과정은 직관적이

고 간결한 그림으로 대체했습니다. 또한 수학적 지식을 이론이 아닌 실제 코드를 통해 사용법

위주로 빠르게 이해합니다.

20 애니메이션을 만드는 방법. 캐릭터의 상황에 따라 적절한 애니메이션을 재생하는 방법을

배웁니다. 오브젝트 풀링을 구현하여 배경과 장애물을 무한 반복 배치하는 방법을 배웁니다.

또한 디자인 패턴 중 하나인 싱글턴을 직접 구현하고 사용합니다.

1으와 애니메이션 마스크를 구현합니다. 점수와 인공지능 적 소환 시스템과 인게임 니I를 만듭

니다. 유니티의 내비게이션 시스템을 사용하여 인공지능을 구현하며. 레이캐스트로 정확한 탄

알충돌을구현합니다.

이이 책의 구성

P:07

7부 : 네트워크 엽동 게임 - 좀비 서바이버 멀티플레이어

싱글플레이어 전용 좀비 게임을 멀티플레이어 협력 게임으로 포팅합니다.

부록

유니티 게임은 안드로이드와 405로 빌드하는 방법을 배웁니다.

소?I와 상관없이 모든 종류의 네트워크 게임에 공통적으로 필요한 이론을 배웁니다. 포톤을 사

용해 로비와 매치메이킹 시스템. 플레이어 사이의 동기화를 구현합니다. 동기화 절차와 클라이

언트와 호스트. 로컬과 리모트. 조작 권한을 배웁니다.

P:08

구현할게임소개

이 책에서는총-1가지 게임을 구현합니다.

탄막 슈팅 게임-닷지 유느슈

20 러너 게임 - 유니런 유유으

바닥의 생성 간격과 높이. 바닥 위의

장애물 수가 랜덤하므로 세밀한 컨트

롤이 중요합니다.

바닥은 끊임없이 회전하며 탄알은 항

상 플레이어를 향해 날아옵니다.

랜덤한 높이로 무한 생성되는 바닥을

점프하면서 앞으로 달려가는 러니 게

임입니다.

사방에서 무수히 날아오는 탄알을 피

하며 가능한 한 오랫동안 버티는 게임

입니다.

최고 기록이 저장되므로 게임을 다시

실행해도 최고 기록이 유지됩니다.

화면 아래로 떨어지거나 장애물에 닿

지 않고 오래 버텨야 합니다. 캐릭터

의 상태에 따라 여러 애니메이션이 재

생됩니다.

P:09

탑 다운 슈터 게임 - 좀비 서바이버 유소유

스1=1그 협동 게임 - 좀비 서바이버 멀티플레이어 수'스%

플레이어는 기관총으로 사방에서 나

타나는 시 좀비들을죽여야 합니다.

싱글플레이어 전용으로 설계된 게임

을 멀티플레이어로 전환하는 여러 기

법을 이해합니다.

클라우드 서버를 이용한 4인 매치메

이킹을 지원합니다.

좀비 서바이버 게임을 포톤을 사용한

멀티플레이어 게임으로 포팅합니다.

아이템이 랜덤 위치에 생성되므로 플

레이어는 한곳에 머무르지 말고 끊임

없이 이동해야 합니다. 후처리 효과를

사용하여 멋진 영상미를보여줍니다.

끊임없이 나타나는 좀비들로부터 최대

한 오래 살아남는 답 다운 슈터 게임입

니다.

P:10

이 잭의 모태 사이트 소711

’ 유튜브 흐6하0 : \\\\아677011(나)6.0001/0/니601)00타/

01*1(“유(0:1—1: 89 03*41401100

이 책의 모태인 소문난 명강의「두이⑴의 유니티 프로그래밍 에센스^는 저자가 유튜브 채널

『이⑴와온라인 강의 사이트에 공개한 유니티 프로그래밍 강의 시리즈입니다.

동아리 구성원에게 도움을 주고자 유튜브에 업로드한 강좌가 이제는 많은 구독자를 보유한 인

기 강좌로 자리 잡게 되었습니다. 1-6(10 유튜브에는「프로그래밍 기초 시리즈」. 비디오 하나로

개발 시작부터 프로그램 완성까지 다루는「한방에 개발하기 시리즈」. 이외에 다양한 장르의 게

임 개발이나 머신러닝 튜토리얼이 업로드됩니다.

1101(6

560내

2019

후헤가르메

으5즈 IV

91^그^거

도03호다

6*11퍼으’, 81=0*1 느'!:“히 (4*4그:71&&40

8**1-느)—으…배 도귀아1=8X(800 그88(8%10느히

P:11

I

3 &4X0*0? 111 브 96

- — %9,500

책과 동영상 강좌 모두를 효율적으로 활용해 개발자로 빠르게 성장하시길 기원합니다.

도6하0의 유니티 (0이하 0#)게임 프로그래밍 에

따라서 이미 온라인 강좌로 유니티 개발 방법을 학습하셨더라도 요약되고 정돈된 개발 정보를

제공하는 이 책이 도움이 될 겁니다. 그 반대로 이 책을 보셨더라도 저자가 제공하는 동영상 강

좌가도움이 될 겁니다.

이 책의 모태는 1-611-0 강좌지만 기존 비디오의 텍스트 버전이 아닌. 새로운 내용과 새로운 예제

로 책을 썼습니다. 동영상 강좌와 정돈된 책은 정보를 제공하는 방법이 다르므로 서로 상호보

완적입니다.

또한 온라인 강의 플랫폼 유데미에 제공한 유료 강좌는 유데미에서 전 기간 가장 많이 팔린 한

국어 강의 1 위 자리를 지키고 있습니다. 유데미와 인프런의 유료 강의는 즉흥적인 개발보다는

순서대로 학습할 수 있는 커리큘럼을 담고 있습니다.

우 유데미 [-61^0 : \\쌔/⑴/\\/니어6이V으0이/에''0“비기휴'/

’ 인프런 1-01^0 : \\/\\유/\\/\\/\\/』0(108(71。가71/00』80/유니티-게임-프로그래밍-에센스

센스

으히;'‘19수 8나’| 그?! "그 1.1따 :;'..’|으

아‘1느후유’ # 호#‘V 후 흐'’‘‘

P:12

목차

추천의글 004

베타리더의 알 006

자은이의알. 008

감사의 글 010

이책의 특징 011

이 책이 다루는 범위 012

개발 안경과 예제 파일 014

이 책의 구성 017

구헌할 게잉 소개 020

이 책의 모태 사이트 소개 022

033

034

1.2 개발 환경구성 036

1.3 젓프로젝트 생성하기 047

1.4 마치며 062

063

064

2.2 레이아웃변경하기 067

2.3 메인창 072

2.4 툴바와씬편집 081

2.5 게임오브젝트편집하기 087

2.6 씬가즈모 091

2.7 씬플레이버튼 093

2.8 유니티클라우드버튼 094

2.9 마치며 094

097

098

3.2 컴포넌트 패턴 : 조립하는 게임 사상 106

1 부

유니티 준비하기

1장 유니티준비하기

1.1 유니티엔진은 무엇인가

2장 유니티 인터페이스둘러보기

2.1 기존프로젝트열기

3장 유니티엔진이동작하는 원리

3.1 상속과재사용

P:13

3.3 유니티 에디터에서의 컴포넌트 112

3.4 메시자오수 브로드카뉴스팅 114

3.5 마치며 119

2

무 123

으 124 # 프로그래밍

4.2 함수

(메서드

)개념잡기 127

4.3 첫스크립트 작성하기 135

4.4 코딩기본규칙 143

4.5 변수연습하기 145

4.6 메서드연습하기 150

4.7 제어문 158

4.8 배열 171

4.9 마치며 176

179

180

5.2 0#글래스만들기

- 183

5.3 참조타입 193

5.4 변수로컴포넌트사용하기 205

5.5 마치며 212

3

느 219

220

6.2 카메라설정하기 232

6.3 플레이어제작 235

6.4 플레이어스크립트생성

- 240

6.5 사용자 입럭감지 242

6.6 플레이어사망처리 247

탄막 슈팅 게임 :

닷지

6

장 닷지 :플레이어제작

6.1 씬구성하기 4장 0# 프로그래밍시작하기

4.1 변수 개념 잡기

5

장 게임오브젝트 제어하기

5.1 클래스와오브젝트

P:14

목차

6.7 듀;8오6000((’01161’ 스크립트 개선하기 253

6.8 입릭 매니저 263

6.9 마치며 270

271

272

7.2 탄알스크립트준비 279

7.3 탄알의충돌처리 282

7.4 탄알 생성기준비 290

7.5 탄알 상성기스크립트만들기 291

7.6 마치며 307

309

310

8.2 바닥회전 311

8.3 게임01제작 318

8.4 게임매니저제작 330

8.5 빌드하기 - 350

8.6 마치며 352

355

356

9.2 유니티0#벡터 372

9.3 쿼터니언 377

9.4 마치며’ 383

385

386

10.2 오브젝트의아동과 회전 401

4부

공간

10장 공간과움직임

10.1 유니티 공간

7장 닷지 :탄알 제작

7.1 탄알 게임오브젝트 준비

9장 방향,크기.회전

9.1 벡터수학

8장 닷지 : 게임 매니저와 01,촤종 완성

8.1 프로젝트정리

P:15

10.3 벡터연산으로펑행아동구언하기 410

10.4 마치며 412

5부 419

420

11.2 시작지점만들기 422

11.3 캐릭터스프라이트편집 424

11.4 20 캐릭터 게임 오브젝트 준비 427

11.5 캐릭터애니메이션준비하기 432

450

467

469

470

12.2 움직이는배경과 발판 474

12.3 게임01만들기 483

12.4 게임매니저 만들기 493

12.5 마치여 510

513

514

13.2 발판생성기 만들기 524

13.3 빌드하기 540

13.4 마치며 543

549

550

14.2 레벨 아트와라이팅설정 554

14.3 플레이어 캐릭터와 애니메이션 구성 562

6무

탑다운 슈터게임:

좀비서바이버

20 러너 게임 :

유니런

11장 유니런 :플레이어 제작

11.1 유니티20프로젝트열기 -

11.6 I기3오61’00011'이16('스크립트

11.7 마치며

14장 좀비 서바이버 : 레벨 아트와플레이어 준비

14.1 %젝트구성

13장 유니런 : 발판 반복 생성과 게임 완성

13.1 발판만들기

12장 유니런 : 배경 스크롤링과 게임 매니저

12.1 배경추가하기

P:16

목차

14.4 캐릭터이동구현 577

14.5 시네머신 추적 카메라 구성하기 596

14.6 마치며 605

607

608

15.2 층 게임 오브젝트준비 612

15.3 600스크립트 617

15.4 슈터 만들기 ” 644

15.5 마치며 658

661

662

667

678

685

699

706

732

735

736

17.2 게임매니저 744

17.3 적생성기 749

17.4 아이템상성 767

17.5 포스트프로세싱 779

17.6 빌드하기 786

17.7 마치며 787

16.2 나、서9타써V 기반 클래스

16.3 플레이어체력 니

16.4 I기876(146311으 스크립트

16.5 내비게이션시스템과 좀비 준비

16장 좀비 서바이버 : 생명과 좀비 시

15장 좀비 서바이버 :총과 슈터

15.1 인터퍼:이스

16.6 타160「)7 스크립트

16.7 마치며

17장 좀비 서바이버 :촤종 완성과 포스트 프로세싱

17.1 13110 08X38와 III 매니저 …

P:17

794

18.2 게임 서버의종류 799

18.3 네트워크권한 분리 804

18.4 포본준비하기 809

18.5 로비 만들기 - 813

18.6 마치며 827

829

830

19.2 네트워크용 플레이어 캐릭터 컴포넌트 839

19.3 네트워크600 859

19.4 네트워크좀비 866

19.5 네트워크아이템 871

19.6 네트워크 게임매니저 882

19.7 적생성기 포팅 889

19.8 완성본테스트 899

19.9 마치며 901

책을 끝내며 904

부토 요 안드로이드빌드 909

부록8 )08빌드 925

찾아보기 938

7부

네트워크 협동 게임 :

좀비서바이버

멀티플레이어

19장 좀비 서바이버 멀티플레이어 : 네트워크 게임 월드 구현

19.1 네트워크 플레이어캐릭터준비

18장 좀비 서바이버 멀티플레이어 : 네트워크 이론과 로비 구현 793

18.1 네트워크동기화

P:19

1-7

께리베네 께0 = 0:니]뤺

스: '츠호하효수

1—1—

1-.

1(『%킈떼그"』

1=0』테』@이0저

:’..7'뷰-누'오흐

V I11?;자 '’'’

P:20

게임소개

난이도 수구슈

예제 위치 11 폴더. 12 폴더. 13 폴더

완성본 빌드 아나흐8 ://『6타0-1300스』1(가'!.

목표 20 러너 게임 유니런을 제작합니다.

미션 계속 뛰면서 발판(플랫폼) 사이를 점프해 낭떠러지로 떨어지지 않고 살아남아라!

으 점프하는 캐릭터

가능

416 5부20러너 게임 :유니런

① 발판은 무한 생성됩니다. 발판의 생성 간격과 높이는 랜덤입니다. 각각의 발판 위에는

1〜3개의 장애물이 일정 확률로 배치됩니다.

② 캐릭터가 점프 후새로운 발판에 착지할 때마다 점수가 추가됩니다.

③ 플레이어는 마우스 왼쪽 버튼으로 점프합니다. 이단 점프도 가능합니다.

④ 마우스 왼쪽 버튼을 누르는 시간으로 점프 높이를 조정할 수 있습니다. 버튼을 오래 누

르면 상대적으로 높이 점프합니다.

⑤ 플레이어 캐릭터에 애니메이션이 적용됩니다. 상황에 따라서 뛰거나. 점프하거나. 죽는

애니메이션이 재생됩니다.

P:21

으 캐릭터의 애니메이션

조작법 ‘ 점프 : 마우스 왼쪽 버튼

- (사망 후) 게임 재시작: 마우스 왼쪽 버튼

5부 20 러너 게임 : 유니런 417

?

P:24

이 장에서 다루는 내요

11.1 유니티 20 프로젝트 열기

11.1.1 유니티 20 프로젝트

아래는 20 프로젝트의 주요 특징입니다.

420 5부 20 러너 게임 유니런

이 장에서는 20 플레이어 캐릭터를 구현합니다. 20 플레이어 캐릭터를 구현하면서 21)프로

젝트의 간단한 특징. 20 그래픽 소스를 사용하는 방법. 애니메이션 클립을 만드는 방법. 상황

에 맞는 애니메이션을 재생하는 방법을 다룹니다.

5부 -유니런’ 개발에서는 미리 준비한 20 프로젝트를 사용합니다. 씬과 코드를 제외한 모든 에셋

이 준비된 상태에서 미완성 프로젝트를 완성해나감으로써 코딩과 기능 구현에 집중하겠습니다.

사용할 유니티 프로젝트 폴더는 예제 데이터 11장 폴더에 있는 니⑴니《1111입니다. 11111-1^10 프로젝트 폴더에는 뼈대만 작성된 미완성 스크립트. 그래픽 이미지. 오디오 파일 등 게임 개발에

필요한 모든 에셋이 들어 있습니다.

위 설정을 각각 따로 변경하거나. 유니티 프로젝트 모드를 20 또는 30로 하여 일괄 변경할 수

있습니다.

유니티 20 프로젝트와 30 프로젝트는 유의미한 차이가 없습니다. 유니티 프로젝트 생성 이후

언제든지 현재 프로젝트 설정을 20와 30 사이에서 변경할수 있습니다.

- 여러 이미지를 스프라이트 하나로 다루는 방법

- 오디오 소스를 사용해 사운드를 재생하는 방법

- 유한 상태 머신을 사용하여 어떤 애니메이션을 재생할지 결정하는 방법

- 애니메이터와 애니메이터 컨트롤러

- 이단 점프를 구현하고. 바닥을 감지하는 방법

- 이미지 파일을 스프라이트 타입으로 임포트합니다

으 기본 생성 카메라가 직교(0(사⑴이⑵이1)0)모드를 사용합니다.

- 라이팅 설정 중 일부가 비활성화됩니다.

으 씬 창이 20 뷰로 보입니다.

P:25

11.1.2 0?기-미00 프로젝트 열기

예제 데이터의 11 장 폴더에 있는 001-1^111 프로젝트 폴더를 엽니다.

I ② 씬을 사이0이라는 이름으로 눠주"!

090061

느 새로운 씬 만들기

이것으로 프로젝트가 준비되었습니다.

11장 유니런 : 달레이어 제작 421

텨 I히

:이젝트가 열리면 [으하누8느를 눌러 현재 활성화된 임시 씬을 ⑵210이라는 이름으로 프로젝트

에 서상히니다. 씬 저장 경로는 기본 경로인 프로젝트의 스556(5 폴더를 그대로 사용합니다(씬

음 저장한 때 서장 경로를 변경하지 않으면 기본 경로에 그대로 저장됩니다).

우리는 20 프로젝트를 사용하는 동안 물리와 렌더링에 관해서는 리지드바디 20 같은 20 컴

포넌트를 주로 사용하게 됩니다. 하지만 프로젝트의 20/30 모드 설정과 사용할 컴포넌트의

종류는 서로 관련 없습니다. 게임 장르에 따라서 20 프로젝트에서 20가 아닌 일반 컴포넌트

를 사용해도 문제없습니다.

20 컴포넌트는 대부분 76010드2로 동작하거나 니아⑴드3로 동작하되 7 값을 무시합니다. 하지만

20 게임 오브젝트의 실제 위치값이 니6어0그인 것은 이닙니다. 20 프로젝트의 20 게임 오브

젝트도 실제로는 위치와 스케일 등을 76아0「3로 저장합니다. 다만 원근감이 없으니 7, 값이 의

미 없을뿐입니다.

53*8 슈이 서3;0

1305:

\\이|10(’0: 09 슈55015

,가정 02)새로운 씬 만들기

① (011-1+81 누르기〉씬 저장 창이 실행됨

② 씬을 1713)0이라는 이름으로 프로젝트에 저장

|(3)(0어우3】 누르기〉씬 저장 창이 실행됨

〔가정 이 ) 유니런 시작프로젝트 열기

1 유니티 허브 실행〉이'0)6015 탭에서 /\\00 클릭

2 예제 폴더〉11 폴더〉II이-0110 폴더 선택〉열기

P:26

11.2 시작지점 만들기

가장 먼저 캐릭터가 배치될 시작 지점을 구성합니다. 시작 지점에는 캐릭터가 서 있을 기본 발

판과낙사 판정 영역을 만듭니다.

11.2.1 시작지점발판

프로젝트에 미리 포함된 스프라이트 에셋을 사용해 시작 지점의 발판을 만듭니다. 스프라이트

는 20 그래픽과 니I를 그릴 때 사용하는 텍스처 에셋(이미지 파일)입니다.

프로젝트 창에서 스프라이트를 하이어라키 창으로 드래그&드롭하면 해당 스프라이트를 사용

하는 스프라이트 렌더러—부 『느!' 컴포넌트 1 추가된 게임 오브젝트가 자동 생성됩니다.

(과정01) 시작지점발판만들기

① 프로젝트 창에서 8^0(65 폴더로 아동〉[기3느0”,느009 스프라이트를 하이어라키 창으로 드래그우드롭

② 생성된 이3호이711-1009 게임 오브젝트의 이름을 813(1 두13휴이'01으로 변경

③ 81311 유13바이711 게임 오브젝트의 위치를(0, ~1,0)으로 변경

④ 80오 0이11(」81’ 20 컴포넌트 추가(슈(베 0이11|3이'I이기〉미1X8105 20〉80으 0이11에아’ 20)

I ② 게임 오브적트의 이름을 8(311 1313유0”1으로 변경

0 105^^10^

‘ 브세:—

’050110 드

13우타'

(3) ^1(0^1.1009 스프라이트르 | ③위차를 (0 -1 스 (구그로 변계1 —호도⑤ :.:?131(00.1009 하이어라키 창으로 드203드롭

( 001

&111 00111유으

V^0^

V?’

느 시작 지점 발판 만들기

422 5부 20 러너 게임 : 유니런

여—("니히으

2=3

———7

2 그 흐.

1431(계

뉴 10998^

0X((1 8아 00100051(6

쇼(110 111109

0(—1

512(

흐어9( 111(1101

노 I아6

0010으

후1:0

0으# 서0유

④80소 0》!!어61’ 20 컴포넌트 추가(/서(1 000100060(〉―) 와IV오05 20〉80노 001(020)

V 10

0*11(110

나드아11

II유((35(

보501이5

호고 느 70*10.01(

후 -- 우7아0스111파1

느 70110.11110

‘두 바!"하하사

&(11( ’

;제그10—

1―—

주〒~

0슈(그나

05마!1〔5~0하1니1

| 5@오

1| - 히'히 께(0도11 I

'모—、—조322으은끄— I ^0111100

1(01111011

5(41(

[즈사011& (아1유0 에31(셰 20)

%유15 으 1유;)?’1185 그

나(교히

0유1히%

X 0

드~6—

X 1—

〒"흐—V 1

50^109 I바(느

0(48오 10 13/하

네!1( 101^0(11011

5(세8 500 ?0101

V I호히11~20

01 (어0)*0 |으스

\\ &(11( - : 흐.

V 도VII게0

시I시그

슈!I 서0(161( 수 으、!……~

치I”(3오 느 —혀8(우0느

P:27

이것으로 게임 시작과 동시에 플레이어 캐릭터가 가장 먼거 밝을 발판을 만들었습니다. 발판에

물리적인 표면을 추가하기 위해 박스 콜라이더 20 컴포넌트를 사용했는데. 컴포넌트 끝에 20

가 붙는다는 사실에 주의합니다.

11.2.2 데드존 만들기

플레이어 캐릭터가 점프하여 다음 발판에 착지하지 못하고 아래로 떨어지는 것을 감지하고, 플

레이어 캐릭터가 죽게 하는 낙사 판정 영역 (데드존)을 만듭니다.

낙사 판정은 게임 화면의 하단 영역에 가로로 긴 트리거 콜라이더를 만들어 구현합니다. 그렇

게 데드존 게임 오브젝트를 만든 다음 0*1 태그를 할당할 겁 니다.

1)누시 태그는 플레이어 캐릭터를 죽게 하는 게임 오브젝트에 할당할 태그이며. 저자가 미리 프

로젝트에 추가해두었습니다. 11.6절 - 스크립트’에서 플레이어 캐릭터를 위

한 스크립트를 작성-할 때 06*1 태그를 가진 게임 오브젝트와 플레이어 캐릭터가 닿으면 플레

이어 캐릭터가 사망하게 할 겁니다.

;저 01) 데드존 만들기

| ①빈 게임 오브젝트 생성

여구호'

테! 0)111〜

081그이’8

X 드6“

느 데드존 만들기

11장 유니런 : 플레이어 제작 423

으르— 뮤하

누 빈 게임 오브젝트 생성(하이어라키 창에서 0@거6 스 09316 드⑴으하 클릭)

② 생성된 게임 오브젝트의 이름은 003012006. 태그는 093어. 위치는(0, ~8, 0)으로 변경

(3) 00소 00111^6(’ 20 컴

포넌트 추가(/서거

600기30060( ) 유우우이오

20〉80/ 00111^61- 20)

④00수 00111661’ 20

컴포넌트의 18 1(19961’

치!크, &26는 (50, 2)로

변경

X 0

21으수 0

가프—

- —'

어3(81’|2|

115171996(’ —

1)58(1 8/ 8하801이’

1)5(6 8우 00111()0X1:0

슈(110 1*111119

I 5128

^99 110어1(15

느 1(110

52 0(3(1200&

1~39 | 0*8(1

7*0115호01711

[으051(100

(《0(31100

5#8

V V @80x00111(161-20

I즈740(16(I가IV이드오 스12(61131 20) 히나 -21프즈

I ② 이름은 068(고0116. 태그는 069⑴ 위치는((X 우. 0)으로 규

… I , , 스 스—

3 80 0011(어이' 20 컴포넌트 추가(/\\거(」00111^00601〉I가1우5주08 20〉80오 0이11거의' 20)

(흐) 80 001116101- 20 컴포넌트의 13 17199아 체크. 으2@는 (50, 2)로 변경

['그나@31하IV 느 드다에I? - —.:『'느

I 그 I ’ 30 06)601

; 20 0⑴60(

셔 8^6015

I 내9하 | 슈0《1:0

: : 71(160

---- 1

1 05(311( 프

......... .이.

다보아

P:28

11.3 캐릭터 스프라이트 편집

시작 지점을 완성했으니 플레이어 캐릭터를 위한 20 그래픽을 준비합니다.

11.3.1 I애니나이@ 스프라이트

느 V휴8(:1(39흐도

느 8(30(68 폴더

각각의 스프라이트는 일본 유니티의 마스코트 캐릭터 중 하나인 토고1아。가 죽는 모습. 점프하

는 모습. 뛰는 모습을 담고 있습니다. 이들은 단일 이미지 파일에 캐릭터의 여러 모습을 합친

스프라이트 시트5!어느 아—'‘ 입니다.

스프라이트 시트는 여러 이미지를 하나의 이미지 파일로 합친 겁니다. 캐릭터가 연속적으로 움

직이는 모습을 여러 이미지 파일로 만드는 것보다 이렇게 한 이미지 파일로 합쳐서 관리하는

것이 리소스 관리가 편하고 성능도 좋습니다.

예를 들어 7=0유110.9꾸를 이미지 뷰어로 열면 토고가 뛰는 연속된 이미지가 하나의 ^6

이미지에 합쳐져 있습니다. 7=0.016.100응나7아《0싀11011사?I오도 마찬가지입니다.

424 5부 20 러너 게임 : 유니런

프로젝트 창의 5^01^ 폴더에는 여러 스프라이트 에셋이 준비되어 있습니다. 여기서 플레이어

캐릭터에 사용할 스프라이트는7#0그01으. 7#0싀111119. 7#0유1111입니다스

V 0/^55*15

0%히0

0^00:

1아하)15

수 휴⑵으기 )〔::스

; 0**(( ’스에、스"”

XII 세키히’121&

시I 세0흐15

^11 하0(21)5

|’ %5615 》으

011006

느 01)513016

누 —이3호01711

느 —여3하01111.10119

; 느 51^

|'그 701(0.016 I

누 … ‘70110^00113

I 느 1‘이《0우00

P:29

03- 0、: ①、 허 (3)

으 70누0,000우09의 모습

에셋을 멀티플、'1'1'"' 스프라이트 모드로 변경하면 하나의 스프라이트 에셋을 여러 개의 개별

스프리‘이트로 잘라 사용할 수 있습니다. 따라서 우리가 사용할 캐릭터 스프라이트 시트 또한

멀티플 스프라이트로 사용해야합니다.

보“"'' ““ '-1

”‘'“ 701(0^1101

오 미리 잘라둔 스프라이트

11장 유니런 : 플레이어 제작 425

701(0-^0(1.13119

0‘

프로젝트의 701x0^010 스프라이트와70느0의11019 스프라이트는 저자가 미리 멀티플 스프라

이드로 변경해 개별 스프라이트로 잘라두었습니다. 프로젝트 창에서 7=0—04으 스프라이트와

101x() 우⑴⑴ 스프라이트를 펼쳐서 잘려진 스프라이트들을 확인할 수 있습니다.

유니티는 20 프로젝트에서 이미지를 기본적으로 싱글510" 스프라이트 모드로 가져옵니다. 싱

글 스프라이트에서 하나의 스프라이트 에셋은 하나의 스프라이트를 표현합니다. 스프라이트

드느수브!^^스|스노죠^

-……니수니비니0니I

스“/「0^0시1101아0

후': 701(0싀001휴-1

701(0^1101|3,2

네!'0스0시1101유.3

』으55615 :' 51*1165 브

51아

, 오… %늬표%0|0|누대 “ 70^0-016-0 \\

; ’ 10^0.016.1 ; ;10^0.016.2 ;

: ^701(0-016.3 :

I 〔느:"「0^0-086-4 I

I --- ~::~::!「으!으그므흐-―—그-]

P:30

^0^0^11II 스프라이트는 여러분이 직접 잘라볼 수 있도록 하기 위해 저자가 미리 잘라두지 않

았습니다. 이제 70느0-1이⑴을 멀티플 스프라이트로 변경하고 직접 스프라이트를 잘라봅시다.

( 과정 이 ) 10^0.8110 스프라이트 편집 창 열기

① 프로젝트 창의 81X1168 폴더에서 70스0—0110 스프라이트 선택

② 인스펙터 창에서 8⑶0016를 I어니I!미6로 변경

③ /우)이V 버튼을 클릭해 적용〉8?기가6 트^아' 버튼 클릭

| ①10스0,무00 스프라이트 선5~|

V | ②8|3기6 I아0으6릅 으10111이6로 변경 |

이0*1도90

느 10^0-000 스프라이트 핀집 창 열기 후라해?0브으뜨스

|| 5으나16 타거!0? !,

호 서노311(((1

I ③스「⑴1/ 버튼 글릭〉8아으16 트⑴!】 버튼 클릭-)-

0=1!

I :

I (『X아)부 || -

( 고제)2)10수0.8110 %근[이트 XI르기

① 스프라이트 편집 창에서 81106 버튼 클릭

② 17으0은 60(1 아 0이I 8126로. 이)《이 8126는 (64, 64)로 변경

(3)81106 클릭

(4) 사기기/ 버튼을 클릭해 저장〉스프라이트 편집 창 닫기

426 5부 20 러너 게임 : 유니런

701^0으VII

0 느 |느———————

701(0-^00 1(1100^ 5(⑴0^5

7 0X1X0

11*11(0

0^001

01^*(361

느5010&

78X10) 후아에

10*1^0 5수이?0

서호X 5128

으)90다01/7!

007아도1뉴011

1*0가113!

누/(하) 사10(10

다!:하 바0(1(

사1 50 14.4:

[: 고 0,

(흐".'

2, 의세흐 크 나! 그 느

후 0610(노

후 —이1다0011

보 - ^1(/01711.1009

후 유V

부 10110.(X0

노 ‘1~0누0 1110、0

스느으

10누0

우2

서 쌔

| 01=0

〔 으0:01 (00 ||노하)

^024 ~

! 사0흐

휴 아0;~ I호 주

1—1 ’ ~ ”

V 드누0@10

시114*(*6111

스 140*1

0”1(61

5()유1( 14(X16

유3《사09 189

0X815 ?8으 1)01(

어유

&(^11(1(

P:31

| ①스프라이트 편집 창에서 31)06 버튼 클릭 |

/‘64’

긔 V 0

후 511(6 | ③81우06 길릭 |

으 70스0스게 스프라이트 자르기

이 것으로 10^0^1111 스프라이트를 701《0느1《11115)에서 7이《0,1《1111,7까지 총 8개의 개별 스

구 리이트로 잘랐습니다.

: 5(31*1(65 느

으 잘라낸 70느0-000 스프라이트

11.4 20 캐릭터 게임 오브젝트 준비

잘라낸 70느0—1아111 스프라이트를 기반으로 20 캐릭터를 만들어봅시다. 구현할 플레이어 캐릭

터는 다음과 같은 기능을 가져야 합니다.

11장 유니런 : 플레이어 제작 427

%

| 다110으 : 두

②'푸아6유 6(1어 67 0이 으"로.

^1X61 8)20는 (64.64)5 변깅

'나이’01

‘.〔(01711-1009

5유

1이《0,016

01(0스」001휴

… '유―3

―VI ―——

511(0 I I 느'.''' XIVIII

1주유6

이〉《(1 5128

0유581

으3(1(11119

이노01

I쪼구(하하효의 I트2^드으 X^64

5^0

X^0

| 0*01^

----느.고네으츠비!

70^0-1100-0 I

10140-11110-1

10^0.1100.2

10140-11011-3

‘ 10|40,1?00,4

: -'101(0-1100.5

너 ’10^0-^110.6

| ~ 1~01《0~1《00,7 |

| ④시3이V 버른을길릭해저장

P:32

- 물리 상호작용

- 조작을 감지하고 점프

- 사망

으 애니메이션 재생과 제어

- 효과음 재생

11.4.1 게임오브젝트 준비하기

플레이어 캐릭터가 될 게임 오브젝트를 만들고 필요한 컴포넌트들을 추가합니다. 먼저 70^0,

I아]1느0 스프라이트를 사용한 1기21)。게임 오브젝트를 만들고. 태그를 할당하겠습니다.

|; 과정 이 ) 플레이어 게임 오브젝트 생성

① 프로젝트 창에서 10^0^00 스프라이트 펼치기〉10^0-0110-0 스프라이트를 하이어라키 창으로 드

래그&드롭

② 생성된 10^0^110-0 게임 오브젝트의 이름은 !기3오이'. 태그는 기3오이'로 변경

③ 기3오6드 게임 오브젝트의 위치를 ( 으6, 2, 0)으로 변경

| ②이름은 두하아; 태그는 I기라'이로 변경 | 주 ‘

1 0513(1(

느—니 ( 0*1*1111 %

~%~0

X^1"

’7“5‘

VI”

I ③위치로 (-6.2.0)으로 변경 |

0 플레이어 게임 오브% 생성 배치된 I기3761‘ 게임 오브젝트의 모습 뉴

428 5부 20 러너 게잉 유니런

」1으으쓰쁘으

①70X0-01X1-0 스프라이트5 하이어라키

창으로 드라I그&드롭

0X0(110

0유이):

도드 어)0아유/

느드으스으

V 오14*11

:—우 ―

— 71부포1=1X0~

‘ 511/1 1*0011

,- 0*1X011(

10*0-11110-1

:’:1”0누0.1100-2

’‘”70110-1100-3

:’:1’0|10,11110스4

써소:으부^쇼: :' 그

,、주1580 으 5유더유8 으

0 10(=0어’ |

I 52 히죠—

739 서11내1하

V 그、 7?301(0페

1*0511100

(《0131200

5^1(

나 아0)61 |

0*41( ’ 그5”

V ^1*0(110

새 1=(—

슈II 사아이)

시! 아에스

바누 \\ 06112()(

수 ―냐‘100011

노------------------

으 - 51하、

수 인?느

70110311015,

1*0뉴0,1서0

P:33

그디음 필요한 컴포넌트를 추가합니다. I기기우" 게임 오브젝트가 중력에 의해 떨어지려면 리지

드바디 기) 컴포넌트. 발판 위에 서 있으려면 콜라이더 20 침포넌트가 필요합니디-.

먼저 리지드바디 20 컴포넌트를 추가합니다.

〔 과정 02)리지드바디 20 컴포넌트 추가

I너0(18

리지드바디 20 컴포넌트의 충돌 감지 방식을 이산니아쁘에서 연속가―、으로 변경했습니

다. 이산은 충돌 감지를 일정 시간 간격으로 끊어서 실행합니다. 연속은 움직이기 이전 위치와

움직인 다음 위치 사이에서 예상되는 충돌까지 함께 감지합니다. 그러므로 연속이 이산보다충

돌 감지가 상대적으로 정확하지만 성능을 더 요구합니다. 그리고 다6626 호0121(100 2를 체크

하여 캐릭터가 회전하는상황까지 예방했습니다.

다음에는 콜리이더 20 컴포넌트를 추가합니다.

11장 유니런 : 플레이어 제작 429

그’".

’I 0513110 드

0—

0.05

2〕13X6’’ I

느.’ 1(0(1

/ '’0 쉬.155

②00111510(1 06100()00을 (300(1011005^

변경

501흐

'허 다

⑴01(11)0(1^ 20

요,느V

① ^13X6'’ 게임 오브젝트에 하9)이XXIV 20 컴포넌트 추가(/\\(베 0아11으00601〉가가이오오 20〉

0191(봐XXIX 20)

② 01916160^7 20 컴포넌트의 001118100 061601100을 0001(00005로 변경

(3)I가9네30(휴 20 컴포넌트의 0008^310!8 펄치기〉다'6620 00131(00의 2 체크

^x 0오

32

① 유137아’ 게잉 오브젝트에 듀!9즈가)0(하 20

컴포넌트 추가(7X(유! 000'⑴00601 )

두가17*3 20〉0)01(가XXIV 20)

# 0그9

’|1” 0그19

다- 읜븨?——그

1 ’'(I 00(6000

、‘ :1:01’;9

11110(*(3013(0

^0051^31015

듀(’051:100

(70*2(! 유0(31)00

1으우0

105^6(101’

V 8하

1.19 어※'

17105호0호01

피고호

6 고허

I느

으 리지드바디 20 컴포넌트 추가

( 0^00*116

유00( (아IV이드오 세3(6가31 20)

〔히므끄느으으

I 5(4(1

즈-- —가

11

③00081(=118 필치기〉다’6으26 1구0:3()00의

2 체크

P:34

2? \\ 아—

뻬어60하 20

V 스 30*0 00111으" 20

2

V ‘0.57

0.2

느 써클 몰라이더 20 컴포넌트 추가

11,4,2 오디오 소스

오디오 소 컴포넌트는 게임 오브젝트에 소리를 낼 수 있는 능력을 부여합니다.

스、슈1”0 5011(드느

1기사'" 게임 오브젝트가 점프 소리를 내도록 오디오 소스 컴포넌트를 추가합니다.

( 과정 이 ) 오디오 소스 컴포넌트 추가

430 5부 20 러너 게잉 : 유니런

—―주

’08(311( ''’

0 10(*001’

박스 콜라이더 20 대신 써클 콜라이더 20를 사용한 이유는 I기:IV。게임 오브젝트가 점프 후

각진 모서리에 안착했을 때 부드럽게 모서리를 타고 올라가도록 만들기 위해서입니다.

게임 오브젝트에 원 모양 콜라이더인 써클 콜라이더 200세우에1내"20를 추가했습니다.

그리고 써클 콜라이더 20 컴포넌트가 게임 오브젝트의 하체 일부만 차지할 수 있도둑오프셋이슈과 반지름아1브을 조정하여 배치했습니다.

②0#501을 ⑴. “0.57),유3(*8을

0.2로 변경

〈3) 으13아이' 게임 오브젝트에 7X0(110 801」!’06 컴포넌트 추가(슈(베 00011300601〉사11(이0〉사II⑴0

800!’06)

② ^0^10 8001-06 컴포넌트에서 스0이0(기⑦ 필드 옆의 선택 버튼〉선택 창에서 )0으 오디오 클립 더

블 클릭

③ 7X0^10 801X6 컴포넌트의 이3아 0^ 스\\시31《6 치I크 해제

(과정03)써클를라이더20컴포넌트추가

① 두기아이' 게임 오브젝트에 (가이6 0011)*1” 20 추가(슈# 0아1가)00601〉가바이05 20〉0;1'이6

001110161- 20)

② 011'이6 001110161- 20 컴포넌트의 0(우861을 (⑴ ~0,57),두3(기115을 0.2로 변경

①0휴016 0《〉11⑵6『 20 추가 (/\\6어 000100060( )

우1175105 20〉0호019 00111(^61’ 20)

6 고 휴 허코흐

⑪ 고 후

이 코흐.

사1:~

1117*990

V》8아 60^*0도

느 10(6

으2 〒57쥬

1*9 ! 1*1—

1*001.0011

흐’ 브.' ⑦5|1이18 흐서흐파흐

노우

I | 6*0)11x4하

7401)( (#/다0 사1((611 20)

P:35

사0(10 (쇼0(110 ^1X0^ 6^000)

…3)(6

0111()11:

어1110

8수1고으으 토유(05

8오하고으으 나5(하’16(’ 도유(그&

87()35! 요6、흐다) 20001

도 '//\\11(1|0 50111*(6

슈11이0011()

100() 0

?다0히7

나XV、

701(1아으

?|흐6 0

유1@60 1\\10

뉴II 11x)61

오(나! 8100(1

즈.'. (‘'\\3 2006 1(사X

501*( 슈1”001|으

스 오디오 소스

이기서 오디오 소스 컴포넌트는 소리를 재생하는 부품이지. 소리를 담은 파일이 아니라는 점에

주의합니다. 소리를 담은 파일은 오디오 클립입니다. 비유하자면 오디오 스스 컴포넌트는 ‘카

세트테이프 플레이어-에 해당하고. 오디오 클립은 ‘카세트테이프’에 해당합니다.

오디오 수수

시작과 동시에 점프 소리가 1 회 무조건 재생되므로 해제했습니다.

오디오 리스너

11장 유니런 : 플레이어 제작 4히

그기4까)

컴포넌트에서 체크 해제한 1%7 0(1 쇼프3느6는 오디오 소스 컴포넌트가 활성화

되었을 때 최초 1 회 오디오를 자동 재생하는 옵션입니다. 해당 설정이 활성화되어 있으면 게임

- 게임 오브젝트에 오디오 소스 컴포넌트를 추가하고. 미리 준비된 )011113 오디오 클립을

해당 오디오 소스 컴포넌트가 재생할 오디오 클립으로 할당했습니다.

오디오 스스 컴포넌트는 소리를 내는 컴포넌트입니다. 그런데 오디오 소스 컴포넌트가 소리를 재생해도 소

리를 듣는 오디오 리스너(/\\0에0 1」3(007)컴포넌트가 없으면 씬에서 재생되는 소리가 플레이어에 들리지

않습니다.

, !사11브 스노!;11느?그|바

스 우》'.:브/포%44=4

즈!

스5%0:5 5느0(16

슈1000

이8

소스 컴포넌트 추가

3크) I유이오꼬

0 1(15으0드(6구 I

[퍼 ;머3아하'

139〔^27

①슈⑴0 800(-06 컴포넌트 추가(스#

0(X111X)0601》/\\1」(어0〉슈1X^0 301」(’00)

스 스

’ , ; 5(,!“ -

②^1X11001패 필드 옆의 선택 버튼〉선택

창에서 ^!710 오디오 클립 더블 글릭

I

I

9

:

: 브

-

스 므히

P:36

소스 컴포넌트는 30 사운드 설정을 사용할 수 있습니다. 30

33 '’ ,

느 오디오 리스너가 추가되어 있는 ⑴3)0 03⑴이'3

11.5 캐릭터 매니메이션 준비하기

그러면 제작-할 애니메이션을 저장할 폴더를 먼저 만들고 애니메이션 제작을 시작하겠습니다.

432 5부 20 러너 게잉 : 유니런

’ 히』

“30예수 '’’

플레이어 캐릭터가 사용할 애니메이션을 만들고. 플레이어 게임 오브젝트에 애니메이션을 재

생할수 있는 컴포넌트를 추가합니다.

오디오 리스너 컴포넌트는 사용자의 귀를 대표하여 게임 월드 속의 소리를 듣는 컴포넌트입니다. 오디오 리

스너 컴포넌트가 게임 속에서 듣는 소리가 게임에 최종 출력되는 소리가 됩니다.

컴포넌트는 소리를 내는 오브젝트 수만큼 씬에 존재합니다. 반면 오디오 리스너는 씬에 하나만

존재해야 합니다. ‘한 명의 플레이어가 여러 장소의 소리를 동시에 듣는’ 상황을 막기 위해서입니다.

만약 씬에 두 개 이상의 오디오 리스너 컴포넌트가 활성화되어 있다면 씬을 플레이할 때 두 개 이상의 오디

오 리스너 컴포넌트가 존재한다는 경고 로그가 출력됩니다. 그리고 둘 중 하나의 오디오 리스너 컴포넌트만

정상적으로 동작합니다.

씬을 새로 생성하면 자동 추가되는 ^1810 03⑴이8 게임 오브젝트에는 오디오 리스너 컴포넌트가 추가되어

있습니다. 그래서 씬을 생성할 때 ^10 니8160이’ 컴포넌트를 직접 추가할 필요는 없습니다.

( 과정 01)애니메이션 저장용 졸더 만들기

① 프로젝트 창의 ^88615 폴더 하위에 새 폴더 생성(프로젝트 창에서 0(-9319〉도이거이‘ 클릭 )

② 생성된 폴더 이름을 슈⑴지3하005로 변경

0 101(1*(X01’ |

; 52 아스어 (:3그10

7^9 ! 나

누 7*011110711!

후흐⑦0—1그

조 6(X1X110 115101X1’

흐호호 프고흐 《2' :거 0,

오디오소스

현재 프로젝트에서는 사용하지 않지만 오디오 소스

사운드 설정을 사용하는 오디오소스 컴포넌트가오디오 리스너 컴포넌트를 가진 게임 오브젝트에 가까워질

수록 해당 오디오 소스 컴포넌트의 소리가크게 들립니다.

P:37

11.5.1 애니메이션 만들기

즈듸

고 도스—..1—…그…——!

으 애니메이션 창열기

두00 애니메이션 클립 만들기

11장 유니런 : 플레이어 제작 433

어.

열린 애니메이션 창은 원하는 곳에 배치하거나 개별 창 그대로 사용해도 됩니다. 저자는 편의

상 게임 창이 있었던 위치에 애니메이션 창을 배치했습니다.

애니메이션 창을 띄웠으니 캐릭터에 대한 애니메이션 클립을 만들겠습니다. 가장 먼저 70^0,

유110의 스프라이트를 연속으로 배치하여 캐릭터가 뛰는요1.0 애니메이션 클립을 만들겠습니다.

여러 장의 스프라이트 이미지를 사용해 캐릭터의 애니메이션을 만들겠습니다. 유니티 에디터

에서 애니메이션을 제작하려면 애니메이션 장을 열어야 합니다.

(과정 이 ) 애니메이션 창 열기

① 상단 메뉴에서 7710(^0^〉/\\010131100〉/\\010131100 클릭

② 열린 애니메이션 장을 적절한 곳에 드래그하여 배치

①상단 메뉴의 〉/\\(11013(100〉

/\\0111)31100 글릭

② 애니메이션 창을 드래그하여

적절한 곳에 배치

현재 애니메이션 창에는 ‘⑵기우"에 대한 애니메이팅을 하기 위해 애니메이터와 애니메이션 클

립 만〜들‘기 1”0 IX:니0 1101013()0휴 !’13)'아'. (다"으 :10 :10《1 30 #11013(1아1 ⑦⑴’라느 메시지와(하흐자으 버트이 축

비!^^^VII호

P:38

시—I ①애니메이션 창에서 0=6 갈릭 |

70 6*9구 (0히4:09유으르오1유 I

느 0110 애니메이션 클립 만들기

434 5부 20 러너 게임 : 유니런

IV 014 IX수001411 09,

느 현재 애니메이션 창의 모습

력됩니다. 만일 이러한 메시지가 출력되지 않으면 하이어라키 창에서 1’1:17이- 게임 오브젝트를

선택하면 출력됩니다.

이 상태에서 애니메이션 창의 0*31으 버튼을 누르면 게임 오브젝트에 관한 새로운 애

니메이션 클립과 애니메이터 컨트롤러를 생성합니다.

〔과정 미 ;| 유니! 애니메이션 클립 만들기

① 애니메이션 창에서 01-6316 클릭 -애니메이션 클립 저장 창이 열링

② 새로운 애니메이션 클립을 800이라는 이름으로 슈88618 폴더 내부의 슈이⑴31(008 폴더에 저장

②새로운 애니메이션 글립읍 유00

이라는 이름으로 싸1013(1008 폴더

에 저장

10 6*^0 V노흐000 으1(10,히— (으 4으1히107 1^0 0^, 0흐호]

그거

P:39

이제 프로젝트의 2*111112(1008 폴더에 1《1111 애니메이션 클립이 생성되고. 애니메이션 창에서

1+101 애니메이션 클립을 편집할 수 있게 됩니다.

( 과정 02 ;| 아⑴ 매니메이션 클립 구성하기

| ①프로젝트 창에서 39⑴65 똘더로 이동 |

흐 0110 애니메이션 클립 구성하기

드래그&드롭한 70느0—1아10 스프라이트들이 조110 애니메이션 클립의 타임라인에 키프레임으

로 배치됩니다. 20 애니메이션 클립을 만드는 방법 중 하나는 이런 식으로 연속된 스프라이트

를 타임라인 위에 키프레임으로 배치하는 겁니다.

스프라이트 키프레임

프리뷰 재생 버튼

느 키프레임이 추가된 0110 애니메이션 클립

11장 유니런 :플레이어제작 435

|흐즈즐게

① 프로젝트 창에서 8|가1168 폴더로 이동

② 101^0-000 스프라이트 펼치기〉【3⑶유+클르!]으로 10^0-000.0 〜 1이《0,0110그7까지 모두 선택

(3) 애니메이션 창의 타임라인으로 드래그4드톱

@70^0.000 스프라이트 펼치기〉

【810+긜릭!으로 모두 선택

1*14((0^^.1.0119

101(0.0!흐

주으노으-휴빈1 그스느스 휴—

(3) 애니메이션 창의 타임라인으로

드래그&드롭

70누0,?100,0

101(0.^110.1

―1《0-유00-2

)140-^00.3

--

- …7』주…1~2그33::@표3 흐 )0 비 노 너 ― 1 스 — 이— “— ’ 고 1

I/— —소I

‘:%2프저 ‘3:

P:40

—-] ①8817⑴:68를 16으로 변경"! 흐 - 유3누보으 - &901(

아야((하

으 상플 프레임 변경

| ②이1X0으라는 이르으로 서711311005 폴더에 저장 |

0세011(100

3

느 느.' I사아" : 5|아우

쓰으으쯔으뜨 II

스 3001으 애니메이션 클립 만들기 '자에^^크

436 5부 20 러너 게임 : 유니런

방금 구성된 1《1】0 애니메이션 클립이 어떻게 보일지는 애니메이터 창의 프리뷰 재생 버튼을 클

릭하여 확인할 수 있습니다. 그런데 프리뷰 버튼을 눌러 1《1】11 애니메이션 클립을 미리보기 해

보면 애니메이션 재생 속도가 지나치게 빠른 것을 알 수 있습니다.

현재 I⑴I! 애니메이션 클립의 초당 샘플 프레임이 60으로 설정되어 있기 때문입니다(1초에

60번 스프라이트 교체). 따라서 샘플 프레임을 낮은 값으로 변경합니다.

샘플 프레임을 16으로 변경하고 다시 프리뷰 재생 버튼을 누르면 이전보다 애니메이션 재생

속도가 느려진 것을 확인할수 있습니다. 이것으로 애니메이션 글립을완성했습니다.

나⑴'⑴ 애니메이션 클립 만들기

이번에는 점프하는 모습을 담은.1나1119 애니메이션 클립을 만듭니다.

( 과정 03)샘플 프레임 변경

① 애니메이션 창에서 8301이68를 16으로 변경

( 과정 이 ;| 30따애니메이션 클립 만들기

① 애니메이션 창에서 0110 클릭〉01-6316 ^16^ 014으... 클릭

② 새로운 애니메이션 클립을 니1101으라는 이름으로 ^0101311005 폴더에 저장

① 어)나미이신 창에서 0느0 클릭〉

08319 시6、7 06[가. 글릭

흐 1=1

I’ 으

?3 호0?으15^"‘하

I :느으 4 1 |소~

1.31 ;

서—바 ’ : 흐. 어| 서; 드 ’

.1 가" 브| 5*10^0 흐

11너주후.‘''?,/4~초 수께으" 1- ~

,그 브 .브.본서 ”스---- --호

:나 - . . 1=1으

P:41

그다음 과 같은 방법으로]1111푸 애니메이션 클립을 구성합니다.

I; 과정 02 ;| 니니따 매니메이션 클립 구성하기

① 프로젝트 창의 8의1165 폴더에서 70느0스0⑴으 스프라이트 펼치기〉+클릭]으로 I아(0,

(3)애니메이션 창에서 8301미05를 6으로 변경

쓰여브으프!

101(0.11110

으 0슈!II이3(100 [-

8 1쓰1 혀 I 51”이II

?1느수히’: 5|어부

~| ③83뜌165를 6으로 변경 ! 소(16 ?느0휴6흐V

우 311땨 애니메이션 클립 구성하기

0|@ 애니메이션 클립 만들기

1310 애니메이션 클립도 I하⑴.,⑴⑴그와 같은 방법으로 만듭니다.

(과정 이 ) 016 애니메이션 클립 만들기

11장 유니런 : 플레이어 제작 437

‘I트트기.우깨1 도 ^9 # …애 ※으

① 애니메이션 창에서 나001으 클릭〉09316 01클릭

② 새로운 애니메이션 클립을 016라는 이름으로 /\\0101311008 폴더에 저장

시1」0아3.0부터 70^0^00113^477^1 모두 선택

(2) 애니메이션 창의 타임라인으로 드래그&드롭

①70^0^003^ 스프라이트 핀치기〉

(8⑴유+글릭!으로 모두 선택

②애니메이션 창의 타임라인으로

드래그&드롭

다 1시/쇼160

느^01013(10111

1*11 슈11(1|0 ; 유오 1

5(01)11 ........

70그0」0누하,0 ’ ’|

『’ ; 701(0이00111.1

-. ! ': 701(0이0(11유.2

구?/!'0느0의0⑴유,4

“그—보!— 사5161& 느 5인1흐X 브

0111^0*8

유 0111(3(1(

노 31유

에&- 101(0.0)8

'〈하) ‘1=0-11에)

\\1회— ’

03 유’0부아

0하1(( # 사그

V (:8노0(11(5

치I 에(6체:

시I 어0에으

시I 1호히3유 -—1*11((0^01

여3((아'111.10(19

31아

1*01(0.0)0

뉴.'〕

P:42

후 016 애니메이션 클립 만들기

(과정 02)016 애니메이션 클립 구성하기

① 프로젝트 창의 8|가1163 폴더에서 101^0-010 스프라이트 펄치기〉[으⑴유+클릭]으로 70스0-010-0부

터 7아(0-056,5까지 모두 선택

(2)애니메이션 창의 타임라인으로 드래그4드롭

③ 830기이68를 6으로 변경

—―1(3)1'아으- 0(6 스프라이트 펄치기〉【81게14갈릭)으로 모두 선택

흐 II후

--1 ③83따168를 6으로 변경 |

노 :?. "사(도: 5()610

세아이오파

소 016 애니메이션 클립 구성하기

438 5부 20 러너 게임 - 유니런

으흐흐 1010.064

I , ,

②애니메이션 창의 타임라인으로

드래그8드롭

11 유0)*0

0*11( ’’

V 호흐하1(0

시1143=111후

세 140(1(15 누 01=1(

새 아누'—케(0@

우-------------

701(0.0누

드’ 10110,0〜0

070,10.018.1

프’10^0.0=2

드‘101=3

^7010-0^.4

즈'10110-0부-5

| 호 0810 I 0세0181100

느구—— 소 으 ’ 8 X 1'하; 너

스쓰——니으— I—카듀&|

; 휴오5흐15 으 5유다185 으 ―01x(111(

V0X1X15 V—

V슈—히이너구)- …1X0 | 1*1

0두001

10 ”(3유: I

0501()0 "” 0&

—〜그

느 드.'?11히‘ : 5(3^

8

0*818흐에야

:드네||네두-1 ①애니머;이션 창에서 301으 클릭〉06316 이6\\사 01후)... 릴릭 ~|

-그 1 ~~ 1~~|“【노-..-. ‘ 느.-—.-《-

3?""흐 - ‘ 소 느』다;

②019라는 이름으로 슈데31(003

폴더에 저장

| 하0*8X1 서 ~ 소 1-0 ^0*013,100 ―|

더하~~ ; 으 |즈구 I스 | 오; 어 , 서느

0호:((오- 으스'-4100 I호 유 (으(후

I 1-.1 ^4 |[니 —

V 요!%

유110

니 고

〔1

1

드0 V

스:

-01

1』

66:;】0

P:43

이것으로 1)1으 애니메이션 클립도 만들었습니다. 그런데 새 애니메이션 클립은 기본적으로 애

니메이션을 반복 재생하는 루프 재생이 활성화되어 있습니다. 1《니!'!과 5니⑴9는 문제 없지만

01아 애니메이션 클립은 반복 재생되면 안 됩니다. 따라서 016 애니메이션 클립의 루프 설정을

해제합니다.

( 과정 03 ;| 018 매니메이션 클립의 루프 설정 해제

I -

016

1.000 6 하’5

3

그 016 애니메이션 클립의 루프 설정 해제

이것으로 1《1⑴시니!!!!:). 016 애니메이션 클립을 모두 완성했습니다.

11,5,2 유한 상태 머신

현재 애니메이션 클립은준비되었지만 아직 어떤 애니메이션 클립을 어떤 상황에서 어떻게 재생

할지 결정하지 않았습니다. 상황에 맞는 애니메이션을 재생하려면 애니메이터 컨트롤러가 필요

합니다.

애니메이터 컨트롤러는 상황에 따라 어떤 애니메이션 클립을 재생해야 하는지 저장한 지도이

모델을 사용합니다.

유한상태 머신은 유한한수의 상태유가존재하며. 한 번에 한 상태만 ‘현재 상태’가 되도록 프

로그램을 설계하는 모델입니다. 유한 상태 머신에서는 어떤 상태에서 다른 상태로 전이'—"

하여 현재 상태를 전환할 수 있습니다.

11장 유니런 : 플레이어 제작 439

0 1(1아)60(01’

(3) ^011713(1008 을더로 이동〉

016 애니메이션 클립 선택

②인스펙터 창에서 10아) 11016

체크 해제

느〔수@3

누서11001

10X)111

10(가》71010

100아 유050

0^01& 0((501

'『즈^효띄101

터 이하'"

히 유1!그

:7“““01

6 고 허

|0⑭"!

며 유한!‘ 사]‘태 머신다0프느 5모뜨 시3‘에0느. 유5나

0유(1 ?04: 0 0(131(^100: 0 타!" 0 0 세0(1*1: 0 0 IV!드 1

(:11유110(*1: 1. 000((1111: 0 (0.0)0 0(01(; 0 (0.0*9 51(*4(11: 1 (100.090

12.7X8 ――――――――

0 1*^0)601

0041( ’ ''고’-

(느노이’1(05

시I 41((1벼!

시1시0(1014 드

슈II

드고유해『1113110115 3깄

① 프로젝트 창에서 이⑴814005 폴더로 이동〉016 애니메이션 클립 선택

② 인스펙터 창에서 느0야? 11016 체크 해제

P:44

느 적 슈I의 상태도

440 5부 20 러너 게잉 : 유니런

위와 같이 유한 상태 머신을 표현한 그림을 상태도라고 부릅니다. 위 상태도에서 적 /\\1의 현재

상태는 탐색. 추적. 공격 중 어떠한 것이라도 될 수 있습니다. 다만 두 개 이상의 상태가 동시에

현재 상태가 될 수는 없습니다. 예를 들어 현재 상태가 탐색 상태이면서 동시에 추적 상태일 수

는 없습니다.

기초적인 게임의 적』\\1는 유한상태 머신의 대표적인 예입니다. 유한 상대 머신으로 게임 속 적

스I를 구현한다고 가정해봅시다. 유한 상태 머신으로 구현한 적 스I는 총 3가지 싱태 (탐색. 추

적. 공격)를 가집니다.

처음에는 적 /\\1가 탐색 상태로 시작합니다. 목표인 플레이어를 찾을 때까지 담색 모드가 유지

되어 플레이어를 계속 찾아다닙니다. 그러다가 플레이어를 발견하면 탐색에서 추적으로 전이

가 일어나 적 쇼I의 현재 상태가 추적 상태로 됩니다. 추적 상태에서 플레이어가 사정거리 안으

유한 상태 머신에서는 전이를 통해 현재 상태에서 다른 상태로 이동할 수 있습니다. 상태도에

서는 전이를 화살표로 표현합니다. 전이에는 전이가 발동될 조건을 추가할수 있습니다.

결론적으로 여러 상태 중 하나의 상태만 현재 상태가 되지만 전이를 통해 현재 상태를 다른 상

태로 이동할수 있습니다.

- 탐색 : 목표를 찾아다닙니다.

- 추적 : 목표를 쫓습니다.

으 공격 : 목표를 공격합니다.

P:45

11,5,3 애니메이터 컨트롤러와 애니메이터

11장 유니런 : 플레이어 제작 441

이전에 으110 애니메이션 클립을 만들 때 I기37。애니메이터 컨트롤러가 자동 생성되었고.

게임 오브젝트에 - 애니메이터 컨트롤러 에셋을 사용한 애니메이터 컴포넌트가

자동 추가되었습니다. 따라서 유니런 프로젝트에서는 우리가 직접 애니메이터 컨트롤러를 생

성할 필요가 없습니다.

애니메이터 컨트롤러는 에셋이며. 애니메이터는 컴포넌트라는 점에 주의합니다. 비유하자면

애니메이터 컨트롤러 에셋은 애니메이션을 재생하는 방법에 관한 -지도,에 해당하며. 애니메

이터 컴포넌트는 지도를 통해 실제 애니메이션을 재생하는 ‘부품’입니다. 따라서 애니메이션을

게임에서 재생하려면 애니메이터 건트롤러와애니메이터 컴포넌트 모두 필요합니다.

새로운 애니메이터 컨트롤러는 프로젝트 창에서 0(*(6〉/'101012(:0[- (2001:1‘01161로 생성할 수

있습니다.

직전에 설명한 적 ⑴의 상태도를 애니메이션 상태도라고 생각해봅시다. 탐색 상태일 때는 탐색

애니메이션 소 추적 상태일 때는 추적 애니메이션. 공격 상태일 때는 공격 애니메이션이 재생됩

니다. 한 번에 단 하나의 애니메이션만 재생될 수 있지만 어떤 애니메이션이 현재 재생되는 애

니메이션이 될지는 전이를 통해 결정할 수 있습니다.

로 들어오면 추적에서 공격으로 전이가 일어나 적 스I의 현재 상태가 공격 상태로 됩니다. 반대

로 플레이어가 시야 밖으로 도망치면 적 의 현재 상태가 추적 상태에서 탐색 상태로 전이함

니다.

적 ⑴의 예에서 보듯이 유한 상태 머신은 현재 상태가 어떤 상태이며 어떤 조건에서는 어떤 상

태가 현재 상태가 되어야 하는지 분명하게 표현할 수 있습니다. 같은 이유로 유니티는 애니메

이션 제어에 유한 상태 머신 모델을 시용합니다.

프로젝트 창의 II1111^(1005 폴더에서 1기3^01’ 애니메이터 컨트롤러. I기3/61‘ 게임 오브젝트에

서 애니메이더 컴포넌트를 찾을 수 있습니다.

애니메이터 컨트롤러 에~》’하。11"는 유한 상태 머신을 사용해 재생할 애니메이션을 결정하

는 상태도를 표현하는 에셋입니다. 애니메이터는 애니메이터 컨트롤러를 참고하여 게임 오브

섹트에 애니메이션을 적용하는 컴포넌트입니디-.

P:46

0 105(1600느

(쓰기분] 츠 513(10 ’’'

I) 1하하’ 프의브쓰

|3 유11!1

V & %

으 [기아아'애니메이터 컨트롤러와 애니메이터

더 이상 사용하지 않을 애니메이션 창은 닫습니다. 그리고 애니메이터 창을 열어 1기사'" 게임

오브젝트에 할당된 애니메이터 컨트롤러의 상태도를 확인합니다.

〔 과정 이 ) 애니메이터 창열기

① 애니메이션 창이 우측 상단 메뉴 버튼〉01080 73유 클릭

② 유니티 상단 메뉴에서 00*77〉^010131100〉7X01013101‘ 클릭

(3)열린 애니메이터 창을 적절한 위치로 드래그하여 배치

사;11!주11??0

노 -

쓰6 136

7710^0?/〉^0117131100〉

으 애니메이터 창 열기

442 5부 20 러너 게임 : 유니런

느그/: 으흐흐—

71X11^*61^0

후 ''''호((VI’주스구"

다:.

455(1으 브 ^111111311005

호— ’ —

0 1017)0

#1느810흐

1*109814*490

^0

844*400109

20

스..으.'….세

0^0(110

&8 호001

드1 다"0으

① 애니메이션 창의 우측 상단

메뉴 버튼、01086 18유 골릭

(3)열린 애니메이터 창을 적절한 위치로

드래그하여 배치

호 I호0)6하 |

0(11( ’ 주.

V 흐1*0(110

XII 서31(03)! 시I【40(1(1;

치I 아((3으5 |

7유 그I;재

!03 ,04

13 [’13V이’

스1006 (쇼73(30

으느——— 1호고3733

I 〜사유 ―꼬3(?

0 :기 호,

[주도 흐

1크 으

0 기 0, 호!。;

6괴 가 0,

I 01^1( : 0아네드00 I

홋" 나;—에어 —―흐

0브 415‘&1 ”6 ‘?.

; [고 &즈

139 \\ 우—스스노~

느 스. 17101?0011

우 구다”。#!!!!""

흐느—의의브0에그 —

호 으 고01)1^00111으" 20

브 '〜'60슈네0 5011데

7 느 ⑦유01018101’

즈—에"

유휴바 유00( 서0000

111X13(( 사0(16

011111119 사0(1(

더— ②상단 메뉴에서 ’드 ^01(X1310!’ 클릭

0? 0011(:1’ 3

0;(\\오1 ?01 0 0;오!. 0 도1|1하 0 5아;0: 0 ^1156(1 0 0(0하노' 0 ??느. 3

《구포흐 ^01- 3 으아이히. 0 (0.0^3 0((、으1 0 (0.0*1 51%1끄 3 (100.0X3

P:47

애니메이터 창은 현재 선택된 게임 오브젝트의 애니메이터 컴포넌트가 사용 중인 애니메이터

컨트롤러의 상태도를 표시힙니다.

애니메이터 창줌인/줌아웃

만약 상태들이 잘보이지 않는다면 애니메이터 창에서 마우스 휠 스크롤로 줌인/줌아웃을 해보세요.

11 브.4 애니메이터 컨트롤러의 상태

스/、끄브브009/호히.I쯔뜨으0

으 다|3오6오 애니메이터 컨트롤러의 상태

우리가 직접 구현한 상태

11장 유니런 : 플레이어 제작 443

’1 사1013101

I기애니메이터 컨트롤러에는 디음과 같은 상태가 존재합니다. 애니메이터 창에 보이지 않

는 상태는 마우스 휠 스크롤링으로 상태도를 줌아웃하면 볼 수 있습니다.

현재 애니메이터 창에 표시된 상태도는 I가3/01’ 애니메이터 컨트롤러의 상태도입니다. 만약

애니메이터 컨트롤러에 대한 상태도가 표시되지 않는다면 하이어라키 창에서 I기기X。

게인 오브젝트를 선택하면 표시됩니다.

애니메이터 창에서 [마우스 획 스크롤 버튼]을 꾹 누른 상태로 드래그하면 화면을 움직이면서 상태도를 둘러

볼 수 있습니다. 또한 유니티 2017.2 버전부터는 마우스 휠 스크롤을 사용해 애니메이터 창을 줌인/줌아웃할

수 있습니다.

우110 : 무00 애니메이션 클립을 재생하는 상태

’3110꾸 : 뉴!⑴으 애니메이션클립을재생하는상태

- 016 : 018 애니메이션 클립을 재생하는 상태

P:48

기본 포함되는 특수 상태

플레이어 캐릭터는 특별한 사건이 일어나지 않는 한 요1111 상태를 현재 상태로 유지합니다. 그

444 5부 20 러너 게임 : 유니런

애니메이터 창에서 상태의 위치는 드래그해서 옮길 수 있습니다. 상태들이 한 곳에 모여 있어

구분하기 불편하다면 상태를 드래그하여 넓게 배치해도 됩니다.

어떤 상태를 기본 상태로 변경하려면 해당 상태에서 마우스 오른쪽 클릭〉861 38 1-3791- 06131111

81316를 클릭합니다. 우리는 1《1】0 상태를 기본 상태 그대로 사용합니다. 만약 어떠한 이유로

기본 상태가 유1】0 상태가 아니라면 흐110 상태를 기본 상태로 변경하도록 합니다.

2X11 상태는 애니메이터의 동작이 끝나는 지점입니다. 현재 상태가 이곳으로 전이하면 애니1'II

이터 동작이 완전히 종료됩니다.

/\\자’ 8⑴16 상태는 현재 상태가 무엇이든 상관없이 특정 상태로의 즉시 전이를 가능하게 만듭

니다. 피격 애니메이션이나 사망 애니메이션처럼 현재 상태와 상관없이 즉시 재생해야 하는 애

니메이션에 자주 사용됩니다.

예를 들어 소아' 51310 상태에서 01& 상태로 전이를 연결했다고 가정해봅시다. 현재 상태가

1《011,부0꾸. 910 중 어떠한 것이라도 상관없이 /\\0우 81316 — 010 전이 조건만 만족하면 즉

시 현재 상태가 016 상태로 전이합니다.

11.5.5 전이 구성하기

이제 1’1270「애니메이터 컨트롤러의 상태들을 전이로 연결하겠습니다.

- &11(7 : 현재 상태가 진입하는 ‘입구’

- 5x11 : 상태 머신의 동작이 종료되는 ‘출구’

- 슈07 81316 : 현재 상태가 무엇이든 상관없이 특정 상태로 즉시 전이하게 허용하는 상태

요110 상태. .1111119 상태. 016 상태는 우리가 요1111. 우⑴꾸. 1310 애니메이션 클립을 생성하면서

같이 생성된 상태입니다. 반대로 타따 상태.〜상태. 서X 이지아 상태는 애니메이터 컨트

롤러에 기본 포함되어 있는 상태입니다.

50117 상태는 애니메이터 동작이 시작되는 진입점입니다. 므0117 상태와 전이로 연결된 상태는

가장 먼저 현재 상태로 활성화되는 기본 상태’)새⑴〜기소가 됩니다. 현재는 1《1111 상태가 기본 상

태로 지정되어 있습니다. 기본 상태는 주황색으로 하이라이트됩니다.

P:49

그러면 위 내용에 따라 전이를 구성해봅시다.

I

I ③.④.⑤. ⑥은 같은 방법으로 진행하여 완성]

전이 구성하기

11장 유니런 : 플레이어 제작 445

렇게 계속 으니!! 상태를 현재 상태로 재생하는 도중 플레이어 캐릭터가 점프를 시작하면 현재

상태가.)1101휴 상태로 변화해야 함니다.

플레이어 캐릭터가 낙하거나 장애물에 부딪쳐 죽으면 현재 상태가 무엇이든 상관없이 현재 상

디I가 무조건 1시으 상태로 변화해야 합니다. 따라서 511110 상태에서 010 싱태로 전이를 연

결해야 힙니다.

그리고 플레이어 캐릭터가 점프 후 발판에 착지하면.111111규 상태에서 1《110 상태로 변화해야 합

니다. 따라서 상태와.!11111|) 상태는 전이를 양방향으로 연결해야 합니다.

〔과정 미 ;! 전이 구성하기

① 우00 상태에서 마우스 오른쪽 클릭〉IV!가(6 1730511100 클릭

2 전이 화살표는 니」⑴드 상태에 연결(전이 화살표를 끌어다 30⑴으 상태에 클릭)

3? 31101(3 상태에서 마우스 오른쪽 클릭〉7^30511100 클릭

4 전이 화살표를 무00 상태에 연결

5 813(6 상태에서 마우스 오른쪽 클릭〉1\\43스0 7|’305|!100 클릭

6 전이 화살표픈-019 상태에 연결

P:50

조건을 구성하는 데 필요한 파라미터를 추가해봅시다.

―| ①아니다.이터 창에서 유858뚜05 텀 클릭 )

그 5드806

| 눅?5(808

8156 I그V후' 뉴 5드?00

느 파라미터 추가

446 5부 20 러너 게임 : 유니런

이것으로 1^10 상태와]110또 상태가 서로 전이를 통해 전환될 수 있습니디-. 그리고 어떤 상태

든 상관없이 조건만 맞으면 010 상태로 즉시 전환할 수 있습니다. 실수로 전이를 질못 연결한

경우 애니메이터 창에서 해당 전이 화살표를 클릭하고【0이6(9】 키로 삭제하고 다시 만들면 됩

니다.

파라미터는 전이의 조건으로 사용할 수 있는 수치입니다. 파라미터로 가능한 타입에는 실수

에예). 정수(페). 불리언(4)001),트리거(I도99이‘)가 있습니다.

②누 버튼 글릭〉8001 클릭 ) 생성된 파라미터

아름을 &’00%어로 변경

( 과정 02)파라미터 추가

① 애니메이터 창에서 ?3(’3171016!’5 탭 클릭

② + 버튼 클릭〉8001 클릭〉생성된 파라미터 이름을 6「000벼이로 변경

③ + 버튼 클릭〉17109아' 클릭〉생성된 파라미터 이름을 016로 변경

③+ 버튼 클릭〉'더996드 글릭、생성된 파라미터

이름을 0:6로 변경

스 ’"에

14히느 우히—(하으 | 9

드 흐 세0

― 0^0110으(으

이제 전이가 언제 발동될지 결정하는 조건을 구성합니다. 전이의 조건은 애니메이터 컨트롤러

의 파라미터매'네어"를 사용해서 구성합니다.

3 흐: 쇼:#410으

1스'히I ‘ |어하| 스데、^

서 '하-~2―—주@1

느 0(~~ 0” I ^103: I---------- --- ----- - -. —

:-------------------------- --------- 10:

P:51

우리는 12001 타입인 아01⑴쏘6 파라미터를 플레이어 캐릭터가 발판에 닿았을 때는 바’116. 닿

지 않았을 때는 주3156로 지정할 겁니다. 그리고 유00예 파라미터를 기준으로 유110 상태와

우⑴⑴ 상태 중 어떤 상태를 현재 상태로 재생할 것인지 결정할 겁니다.

6^000(16(1 파라미터와 달리 016 파라미터는 트리거 타입으로 설정했습니다. 트리기 타입의 파

라미터는 다른 타입과 달리 특정 값을 할당할 수 없습니다. 트리거 타입의 파라미터는 트리거

으 두110 — 니001그 전이 설정하기

'제의브

11장 유니런 : 프레이어 제작 447

유00 -고 V 때;(하63

001)611X)01

그러면 이제 추가한 파라미터들을 전이의 조건으로 사용해봅시다. 그리고 전이의 다른 여러 설

징값을 적절한 값으로 변경해봅시다.

를 셋우 또는 발동매〜하여 ‘방아쇠를 당기는’ 방식으로 사용합니다. 트리거 타입은 셋하는 순

간 즉시 나06가 되고 곧바로 주8156가 되도록 구현되어 있습니다.

지속적으로 어떤 수치를 비교하는 것이 아니라 어떤 사건이 발생했을 때 전이가 일어나도록 조

건을 구성할 때는 트리기 파라미 터를 쓰는 것이 좋습니다.

『가정 03)유00 ― 311⑴아 전이 설정하기

① 애니메이터 창에서 (구배 ― 니』이으 전이(화살표) 클릭

‘2 인스펙터 창에서 1438 드XII 11016 체크 해제

③ 89111098 탭 펄치기〉1730811100 00으31)00을 0으로 변경

4/ 조건에 (3|’0110에0어 추가(0이1여)1!이18의 + 버튼 클릭)

⑤ 아⑪때어0여의 조건값을 후3186로 변경

④조건에 (그‘느아어으거 추가(000(가!(008의

+ 버른굴릭)

— 그 0 5! 0-

| 3)1구00 ―、XXI꾸 전이(화살표) 글릭 포큰

③89111095 탭 필치기〉1?305⑴00 0』3노00을

0으로 변경

| ②너38 &《가 11016 치I크 8그『

—부르트브

-너도 5011091 누.......

다1( 、흐 -

다.호 0*1,아느

171011000 01^(101**0

7^11110110((1(1 ,0

101(^01100 50※흐、쓰쓰스

0(0(1히 )0!으'으

조조..

I 0 101^(00^ ——프

1110 -고 으0꼬0

1 세011(0노!711‘

171히6001

P:52

00의 값을

1488 드XII 71016

448 5부 20 러너 게임 : 유니런

1435 5X11 71111으은 종료 시점'% —을 활성화하는 옵션입니다. 활성화된 종료 시점의 값은

I즈⑴ 74111으 필드에서 변경할 수 있습니다. 종료 시점이란 전이에서 현재 상태를 탈출하여 디음

상태로 넘어가는 시점입니다.

1435 &XII 74111으이 활성화되면 종료 시점이 존재하게 되어 전이의 조건을 만족해도 즉시 다음

상태로 전이하지 않습니다. 즉. 현재 상태의 애니메이션 클립의 재생 시간이 종료 시점에 도달

할 때까지 전이가 지연됩니다. 반대로 니38 므XII 711116이 비활성화되면 전이 조건을 만족하는

즉시 전이가 실행됩니다.

예를 들어 @0 -유전이에서 버35 2X11 711110이 활성화되어 있고. 종료 시점이 0.5(50%)

로 설정된 경우를 가정해봅시다. 이 경우 휴110 ―우⑴꾸 전이의 조건을 만족해도 애니메이

션 클립이 최소 절반은 재생되어야 전이가 이루어집니다.

11*80511100 0^1’81100

전환 지속 시간은 전이가 이루어지는 동안 현재 애니메이션 클립과 다음 애니메이션 클립을 섞

어 (블렌딩 ) 부드럽게 이어주는 역할을 합니다.

30 캐릭터 모델이 뛰는 애니메이션을 재생하다가 점프하는 애니메이션을 재생한다고 가정해

봅시다. 전환 지속 시간이 0.2초라면 0.2초 동안 뛰는 애니메이션 클립과 점프하는 애니메이션

클립이 섞여 부드럽게 이어집니다.

하지만 20 스프라이트를 사용한 애니메이션 클립에서는 전환 지속 시간 동안의 블렌딩이 정

상적으로 동작하지 않고 전이 시점만 지연됩니다. 20 스프라이트는 30 모델과 달리 두 애니

메이션 클립 사이의 중간 위치를 계산할 ‘관절’이 존재하지 않기 때문입니다. 따라서 우리는 전

환 지속 시간의 값을 0으로 변경했습니다.

우리는 조건만 맞으면 요110 상태에서규 상태로 즉시 전이하길 원하므로 11“ 2X1( ⑴11)0

을해제했습니다.

이것으로 @11 ―3111119 전이의 조건을 @0110(16:1가 주3156인 경우,. 즉 ‘발이 발핀에 닿지 않을

때'로 설정했습니다. 그리고 너:18 모XII 741110을 해제하고 전횐. 지속 시간’’'디…"재디⑴

0으로 변경했습니다.

P:53

이제 나머지 전이 실정을 진행해봅시다.

나머지 전이 설정하기

( 고저 01) 니나[끼? ― 00(1 전이 설정하기

① 애니메이터 창에서 유0가3 — 0110 전이 클릭

② 인스펙터 창에서 나35 5X11 71016 체크 해제

③ 80111095 탭 펼치기〉1‘1‘30511100 01"하아1을 0으로 변경

④ 조건에 6으000010에 추가(0이1에1005의 + 버튼 클릭 )

⑤ 6!‘0110에6에의 조건값을 하00로 변경

|①"11으 800 전이 클릭 | ②너33

15 이

⑨—

| ⑤0!~00%6거의 조건값을 @6로 녀5~)으

으 나00기3 ― 0011 전이 설정하기

〔 과점 02 ) /⑴V 81316 - 016 전이 설정하71

① 애니메이터 창에서 /너7 81316 — 016 전이 클릭

② 인스펙터 창에서 86111098 탭 펄치기〉17305⑴00 00호00을 0으로 변경

③ 조건에 010 추가(000⑴15008의 + 버튼 클릭〉추가된 파라미터를 [기8로 변경)

11장 유니런 : 플레이어 제작 449

7=1파1005 포츠호호:^^

④조건에 61-000^6^ 추가

(000어⑴005의 +버튼 클릭)

(3)86111003 탭 펼치기〉7780811100

023(100을 0으로 변경

0 101^001’

I 1)101;) !오0 I

1 세꼬110으173111,10(181*(

-----조기

드:거하

호 I 7^1(1111100 011^11101- 0 ~

7^11111(1011 —^0

1^1(^(11)1100 500오느I의브―

0'흐;으《1 1117^1.1,(1( -/

유00 , 히 ,우 |0호

5X1( 71016 체크 해제

0011^11100:

그 으0.브!%

으I!⑴9 -오 11(10

—세5 &(II 71018

’(으어1;0이…;

''“즈 6*1:7유

도1X8드 1*100

10117

P:54

| ①어니에이터 창에서 슈V 31316 — 0;9 전이 클릭 |

우0

으 유8*316 ― 016 전이 설정하기

과정 02에서 조건으로 01(^ 파라미터를 선택한 경우 값을 실정하는 필드가 표시되지 않음에 주

목합니다. 트리거 타입의 파라미터를 조건으로 사용하면 수치를 검사하는 것이 아니라 트리기

의 ‘발동’을 감지하는 방식으로 전이가 실행됩니다.

이것으로 애니메이션 클립과 애니메이터 컨트롤러 준비가 끝났습니다.

11.6 I가3701*000하0116투 스:그립트

이제 I가37이 게임 오브색트를 조종하는 유그라아우이하0117 스크립트를 작성합니다. 유니런 프

로젝트에는 사용할 스크립트들이 미리 포함되어 있습니다. 단. 내부 구현은 비어 있는 미왼성

스크립트이기 때문에 책을 진행하면서 직접 완성해야 합니다.

미870거드011이‘ 스크립트는 사용자 입력을 감지하여 점프하고, 충돌을 감지하여 장애물에

닿았을 때 사망 처리를 실행합니다. 그리고 상황에 알맞은 효과음과 애니메이션을 재생합니다.

450 5부 20 러너 게임 소 유니런

5010 사11(?

0”0—

③즈건에 0:0 추가(0000008의 + 버튼

클릭〉추가된 파라미터를 0:6로 변경)

(2)86111095 텁 펄치기〉1730*00

1=00을 0으로 변경

0 11X00’ |

후 -소 0부

1 ^0101110(11*01111011814(

111111111001

수1、\\5111호 ‘그 0부

-、서41 도11 VI끄호 0

V 고01091’

다"《)|

… I호

도11!?《8 3()으1100

| 7(10111101 011^601,0

'도히11(100 0111*1 5

()(101 5011또!. 스아

드30 171011000 70 IV

오호1… 111(( I 스

아0, 우0 ,0 ;0 소

P:55

그러면 으13761으0011’0118도 스크립트를 I가게임 오브젝트에 추가하고 이해리으00바’0117

스크립트 편집을 시작하겠습니다.

( 과정 01 ;| 기3오6「(:001「이I아’ 스크립트 추가

① 프로젝트 창의 801’1|315 폴더로 이동〉?18761의0011’01161’ 스크립트를 하이어라키 창의 이그우으!'로 드

래그&드롭

② 인스펙터 창에서 마고761으001!‘0116도 스크립트를 더블 클릭하여 열기

V)1.8^0’ I XII

의인쓰의브?므

5?V스 5011(115 스 으1흐

호스

”5?체주5061?호'

으 I기8오6''으이’1하'0II이’ 스크립트 추가

열린 아137라'으0(1바‘0116드 스크립트는 다음과 같습니다.

05109 00117타19휴16;

11장 유니런 : 플레이어 제작 451

! 어:00오이리‘

|31‘1781:6 1(11 3001()60001: 그 0; // 누적 점프 횟수

^(‘173^6 1)001 156^01)0(16(1 그 1게86; // 바닥에 닿았는지 나타냄

이"15/316 1X)01 15063(1 드 오3156; // 사망 상태

①유13701001^0116드 스크립트로 하이어라키 창의

유13761'로 드래그&드롭

②?13^6^0011’0110(’ 스크립트믈

더블 글릭하여 열기

// ?1876애이나!‘011"는 플레이어 캐릭터로서 이하6도 게임 오브젝트를 제어함

아니3110 아.855 ?13오61'으001(-0116(“ : 1-100086^137100(“ (

아나)110 어63나)(:1조; // 사망 시 재생알 오디오 글림

으나)11.0 51031 드 1」(11아더이-06 그 700주; // 점프 힘

'‘\\5히5

- /、010131100소

- - 슈11(110

,, ?001

'그 1뉘0으다IX

느 ⑶ 이하0으

^310 03016즈

51=1 머31(0아고

―,。켜2이1브—,

이이하 —…,

I 유0)0《:(

1:2701’1165

요II 서3(4셰:

시I 수0에&

그II (아6(35&

5기

두 0513110 다

그 -… 이

01 겨호;

81 고 호:.

6:구하

61 고수

—―1깁 고 하

드처고호

0 고.⑤

— I。: 쇼아6(5 스

83(1에'0110(1100(1

、63010세하39히'

어3어00뉴

… 어헤01’01『03、

^0 1115(X(10(’ [으

;(3그 (1기3하

739 I 의하하

느 스.

느 오후5|)도1(6 11(0다01’0’

흐 V

느 # 6001X1호 00111(1하 20———

부 --1 60^11(110 50111X6

느'.그.도세01810?‘그—

V - 5? 휴|3아01’ 0:01111~011히(5드호101)

I 으13아('드0*11'’0|스『

0*31유 01() | 이0에 0네0 0다))

싸!11휴 드0^8 700 |

P:56

)

1

)

)

)

필요한 변수들은 미리 선언되어 있습니다. 메서드들은 선언만 되어 있고 처리가 구현되어 있지

않으므로 우리가 직접 완성해야 합니다.

11.6.1 I기애아'000하'이191'의 변수

유13X6두으001|‘0116('의 변수들을살펴봅시다.

가장 먼저 사망 시 재생할 오디오 클립을 할당할/\\에0(:11|) 타입의 변수 (1621110111),점프에 사

용할 힘인 1=1081: 타입의 변수 드"다이‘“가 선언되어 있습니다.

452 5부 20 러너 게임 : 유니런

|)흐1731:6 유!91아)0(1720 이8아6데9고아)0하; /7 사용할 리지드바디 컴포넌트

|)흐17816 세0131아" 81110※이-; // 사용할 애니메이터 컴포넌트

유도으가으 슈1X1105001X6 아.8아라’유네0; // 사용할 오디오 소스 킴포넌트

07816 701(1 513(가() (

// 초기화

?1*17316 7016 0160 (

// 사망 처리

|)두!7816 701(1 00601115100^X1120(0011.1510020 001115100)(

// 바닥에서 벗어났음을 감지하는 처리

()^17316 701(1 000)1115100타)16으20(으0111540020 001115100)(

// 바닥에 닿았음을 감지하는 처리

하!‘17316 70101 001(*1996으테61‘20(으011!(161‘20 011160 (

// 트리거 클라이더를 가진 장애물과의 충돌을 감지

701(1 I!13(18160 (

// 사용자 임릭을 감지하고 점프하는 처리

P:57

그다음 플레이어 캐릭터의 상태를 나타내는 변수들이 있습니다.

비 시막으로 I가게임 오브젝트의 컴포넌트들을 할당할 변수들이 선언되어 있습니다.

디오

11.6.2 81311() 메서드

11장 유니런 : 뜰레이어 제작 453

이제 ?13우6기1001드0116두 스크립트의 메서드들을 구현합니다. 먼저 51리"1() 메서드부터 구현

하겠습니다. 513^() 메서드에서는 661X0꾸00601 ( ) 메서드를 사용하여 I으1^61‘ 게임 오브젝

트로부터 사용할 컴포넌트들의 참조를 가져와 변수에 할당합니다.

13001 타입의 변수 15063(1는 플레이어 캐릭터의 사망 상태를 표현합니다. 기본값은 주3156입니

다. 15063(1를 사용하면 -죽은 싱티에서 다시 죽는’ 비논리적인 상황을 막을 수 있습니다.

1)001 타입의 변수 156「01111(166는 플레이어 캐릭터가 바닥에 닿아 있는지 나타냅니다. 기본값은

주3156입니다.

101 타입의 변수 느 10이:0001는 플레이어 캐릭터가 점프한 횟수를 나타냅니다. 드0[파)으00이는 플

레이어 캐릭터가 바닥에 닿을 때마다 매번 0으로 리셋됩니다. "으⑴유는 이단 점프나 삼단

점프 등을 구현할 때 캐릭터가 현재 몇 회까지 점프했는지 검사하기 위해 사용합니다.

1)(*17316 1^191(11)0^7 20()13X61*^191(11)0(17;

1)(*1781:6 슈0111181:이‘ 801013101“;

(31-1731:6 1.3X6^0(110;

가‘17316 101 드0111|3(:01』01: 그 0;

13(-17316 1)001 156(*00(1(16(1 그《31.86;

두)1“!\\/81:6 1)001 15068어 그 주3186;

아나)110 사0(110(:114)(」63나1아1|);

1)013110 51031: 드011191:01’06 그 700주;

아1876데9고아’0하에는 I기사761‘ 게임 오브젝트의 리지드바디 20 컴포넌트. 라!!미31이-에는

1기3우0 게임 오브젝트의 애니메이터 컴포넌트. 아13,6애1X110에는 I가3^61‘ 게임 오브젝트의 오

소스 컴포넌트가 할당됩니다.

P:58

)

11.6.3 0^316() 메서드

이어서 뚜볘6() 메서드를 완성합니다. 0^816() 메서드는 다음과 같은 처리를 실행해야 합

니다.

- 현재 상황에 알맞은 애니메이션을 재생

- 마우스 왼쪽 클릭을 감지하고 점프

- 마우스 왼쪽 버튼을 오래 누르면 높이 점프

- 최대 정프 횟수에 도달하면 점프를 못하게 막기

454 5부 20 러너 게임 : 유니런

701(1 513가0 (

// 게임 오브젝트로부터 사용할 컴포넌트들을 가져와 변수에 할당

1)13,61’'휴19히브0어우 드 661(:01까30060흐에91(1느0(1오20》0;

8010310(’ 그 661으이0휴0060하아01108100();

()13X61*^0(110 그 061(:이111)0060타애0으105001‘000;

// 사망 시 처리를 더 이상 진행하지 않고 종료

// 점프 횟수 증가

으 110에01101++;

// 점프 직전에 속도를 순간적으로 제로(0, 0)로 변경

()13^6['/119^^0(1^,761,0011^ 느 니6010으2 구6으0;

I; 과정 이 ) 니3(1318 () 메서드 완성하71

① 09(1316 ( ) 메서드를 다음과 같이 완성

(과정 미 ) 813(1 (〕메서드 완성하기

① 5181-1 ( ) 메서드를 다음과 같이 완성

【)(17816 701(5 I⑴에6() (

11 (15088(1)

// 마우스 왼쪽 버튼을 눌렀으며 8& 최대 점프 횟수(2)에 도달하지 않았다면

(10()01.661나0115680110000X0(0) 8& ]00)()으0110하 2)

(

P:59

)

자싱한 코드를 살펴봅시다. 가장 먼저 0^316() 메서드 최상단에 플레이어 캐릭터가 죽은 상

태 (180례가 1「06인 상태)에서는 그 이하의 처리에 도달하지 못하도록 막는 푸 문을 추가했습

니다.

1( (18063(1)

으61111*0;

)

플레이어 캐릭터가 사망한 경우 입력을 감지하고 점프하거나 애니메이션을 갱신하면 안 되기 때

문입니다. 15063:!가 후8156인 경우에는 1^X1816()의 처리가 계속 진행되어 마우스 입력을 감지

하고 점프를 실행하는 부분에 도달합니다.

1주 (1미?1』1: .661시0115601네:000017(0) 8& 누 0111|)(:0001 스 2)

11장 유니런 : 픈레이어 제작 455

6156 (I미〕01.66바1005681』하 1001)|)(0)I& 유!으!이)0어아오7610《:1‘1아./ 으 0)

(

// 마우스 왼쪽 버튼에서 손을 떼는 순간 요 속도의 V 값이 양수라면(위로 상승 중)

// 현재 속도를 절반으로 변경

1)18X61*^191(11)0(17^610011^ 그 |?18오6대으9고이)0그7으7610《:!1오 # 0.5주;

우 01파)60001:++;

1313X6(에9고아)0거7^6100117 3 \\/6(:10으2구61‘0;

아18우6에91어1)0(1유/뉴1(1드0도06(06유 76010^2(0,우!」히아두0“6));

|?1876『'슈I세0.이크오으);

// 애니메이터의 61*0110(16(1 파라미터를 156(-000(16(1 값으로 갱신

301⑴310(‘3618001(‘‘6〒01』0116(1,’,156^000(1611);

// 리지드바디에 위쪽으로 힘 주기

하 18^8에91(160어아.슈어?0으06(116유 76010하2(0,5001|3두0하06));

// 오디오 소스 재생

하18아6('슈11(110 4’18오0;

P:60

I미)01.66하1008680(10000?⑴ ( ) 메서드는 마우스 버튼 식별자를 101 타입으로 입 력받습니다.

노 문 블록 내부에서는 점프를 실행하고 오디오를 재생합니다.

456 5부 20 러너 게임 유니런

앞의 푸 문 블록은 누적 점프 횟수가 최대 허용 점프 횟수인 2보다 작은 상대에서 마우스 왼

쪽 버튼을 누르면 점프를 실행합니다. 푸 문 조건으로는 101X^.661시0056811110000—(0) &&

31101^0001: 으 2를 사용합니다.

두 조건이 &8로 엮여 있으니 누적 점프 횟수가 2보다 작은 것0니빼(:0001 스 2)과 마우스 왼쪽

버든을 누르는 것(10아01.661^0115580바:000=0 (0) )이 동시에 만족되어야 노 문 블록이 실행됩

니다.

참고로 6장에서 본 10⑭1.601유6오00?/0 ( X 1지?01\\66하(6오 ( )느 101)01.661X6^0^ ( ) 메서드〜치럼

마우스 입력을 감지하는 메서드 또한 세 가지 형태가 있습니다.

즉. I지)01.66하4005630110000씨 (0)은 마우스 왼쪽 버튼을 누르기 시작한 순간에만 1띠6가 되

고. 마우스 왼쪽 버튼을 누르고 있는 동안에는 주기56를 반환합니다.

여기서 사용한 10(X11.66하’1008560바:0000—( ) 메서드는 마우스 버튼 입력을 감지합니다. 마우

스 입력이 감지되면 11-06. 그렇지 않으면 후기요가 반환됩니다.

으0 : 마우스 왼쪽 버튼

-1 : 마우스 오른쪽 버튼

’ 2 : 마우스 횤 스크롤 버튼

‘ I마)01.681이005680110000'쑤 ( ) : 마우스 버튼을 ‘누르는 순간'

’ 10⑭1.601사0056801100 ( ) : 마우스 버튼을 ‘누르고 있는 동안,

‘ 퍼⑭!.661사00568011000() ( ) : 마우스 버튼에서 ‘손을 떼는 순간’

하13,6디《191(160(1오오7610011아 그 니60느이-2.26드0;

이3아6(‘1?19!아)(서/예이그자:6(06// 760101*2(0,드001아:01’(:6));

으13우0으슈1』610우187();

따라서 누적 점프 횟수가 최대 점프 횟수에 도달했을 때는 마우스 왼쪽 버튼을 눌러도 점프할

수 없습니다. 누적 점프 횟수를 가리키는 고뿌⑦”는 11.6.6절에서 플레이어가 바닥에 닿을

때마다 매번 0으로 리셋되게 할 겁니다.

P:61

76010드2(0, 0)과

다음 두 경우를 비교한다고 가정해봅시다.

|)18오리에9코아)0(1우7610(:11/ 그 휴18오6대?191사)0(17.76100117 부 0.55;

11장 유니런 : 플레이어 제작 457

61.56 (10유01.661에00568111:1000|)(0)8& 아18,6 마고91^130어7수610(:11:7^ 으 0)

그다음 이어지는 이요 포 문 블록에서는 마우스 왼쪽 버튼에서 손을 뗐을 때 실행할 처리를 구

현합니다.

그다음 아1카6애0뉴⑴이카 ( )로 오디오 소스 컴포넌트가소리를 재생하게 했습니다. 오디오 소

스 킴포넌트를 나타내는^10500^6 타입은 자신에게 할당된 오디오 글립을 재생하는 아1라 ( )

메서드를 제공합니다.

따라서 플랫포머 게임에서 점프를 구현할 때는 직전 속도에 영향을 받지 않도록 순간적으로 속

도믈 세로로 만드는 것이 일반적입니다.

그다음 아그우으데9고아〕0(휴.세트이’오 (아" \\/6(:1이''2 (0,두때다이-“ 서 어를 이용해 위쪽 방향으로

누 10아⑦주6만큼 힘을 줍니다. 아13X6에91아)0하는 리 지드바디 20를 표현하는 유19고아30하20 타

입이므로 세테으6( ) 메서드의 입력이 76아0그2 타입이라는 점에 주의합니다.

2의 경우 첫 번째 점프의 힘과 속력이 두 번째 점프의 힘과 속력에 그대로 합쳐집니다. 따라서

2의 경우 두 번째 점프에 의한 상승 속도와 높이가 1의 경우에 비해 비약적으로 증가합니다.

1,점프 사이에 충분한 시간 간격을 두고 이단 점프 실행(마우스 왼쪽 버튼을 여유 있게 두 번 클릭)

2, 매우 짧은 간격으로 이단 점프 실행(마우스 왼쪽 버튼을 빠르게 두 번 클릭)

우리는 1기37。게임 오브젝트의 오디오 소스 컴포넌트에 511(119 오디오 클립을 할당했습니다.

따라서 아그V이가뉴세0.^137()가 실행될 때마다 점프 소리가 재생됩니다.

또 다른 예로 캐릭터가 떨어지고 있는 도중에 공중 점프를 실행한다고 가정해봅시다. 이 경우

점프에 의한 상승 힘이 낙하 속도에 의해 상쇄됩니다. 즉. 점프를 실행해도 낙하 속도만 순간적

으로 조금 줄어들 뿐입니 다.

먼저 느1@)(:0001:++로 점프 횟수를 증가시킨 다음. 마그아으데9도시)0하.7610(:11:7 그 76010^2.26^0;

를 이용해 점프 직전에 속도를 제로(⑴ 0)로 만듭니다(76010드2.270는 0애

같은 표현입니다). 점프 직전에 순간적으로 속도를 제로로 만들어야 하는 이유는 직전까지의 힘

(또는 속도) 이 상쇄되거나 합쳐져서 점프 높이가 비일관적으로 되는 현상을 막기 위해서입니다.

P:62

앞의 코드는 아래 조건을모두 만족하는 경우 현재 속도를 절반으로 줄입니다.

301013101’,5818001II(160“,156|’000(16(1);

458 5부 20 러너 게임 : 유니런

‘ 5618001(511’109 0311)6,6001 781.118)

’ 561101(51[‘109 08016,101 73106)

‘ 561^1031031116,주1031 731(18)

플레이어 캐릭터는 마우스 왼쪽 버튼을 오래 누르면 상대적으로 높이 점프합니다. 이 기능을 마

우스 왼쪽 버튼에서 손을 떼는순간속도를 절반으로 줄이는 방식으로 간단하게 구현했습니다.

점프하자마자 버튼에서 손을 떼었다고 가정해봅시다. 캐릭터가 충분히 높게 상승하기도 전에

속도가 절반으로 줄어듭니다. 따라서 도달 가능한 점프 높이가 낮아집니다.

그런데 여기서 점프 속도가 아닌 낙하 속도를 절반으로 줄이는 문제가 생길 수 있습니다. 마우

스 왼쪽 버튼을 너무 오래 누르고 있다가 캐릭터가 최고 높이에 도달한 후 닉'하하기 시작한 시

점에 손을 떼었다고 가정해봅시다. X 방향 속도 값이 0 이하일 때 속도를 절반으로 줄이면 상

승속도가 아니라 낙하속도가 절반 줄어듭니다.

애니메이터 컴포넌트를 나타내는 써!0131이‘ 타입은 애니메이터의 파라미터값을 변경할 수 있

는561 계열의 메서드를 제공합니다.

반대로 마우스 왼쪽 버튼을 지긋이 누르고 있다가 뒤늦게 버튼에서 손을 떼었다고 가정해봅시

다. 이미 플레이어 캐릭터가 충분히 높게 상승한 상태이며. 최고점에서의 속도는 제로에 가깝

습니다. 이 시점에서는 속도를 절반으로 줄여도 영향이 거의 없습니다.

펴 문과 6186 펴 문이 끝난 다음 01X1316() 메서드 가장 아래에는 애니메이터 컴포넌트의

61-0110(16(1 파라미터의 값을 156드000히의 값으로 변경하는 처리를 주가했습니다.

우 조건 1|1|)1』1소(;01이00868네00000(0 ) && 버때하⑴띠츠 스 2의 결과가 주3156

‘ I미)111.66헤005680110014)(0) : 마우스 왼쪽 버튼에서 손을 떼는 순간

‘()1376후1《19고이)(너우우610(:11우이 으 0 : V 방향 속도가 0보다 큼

따라서 X 방향 속도(마구아으우페아50하.으으10네오7)가 0보다 클 때만 속도를 절반으로 줄이도

록 했습니다.

P:63

11.6.4 016() 메서드

18068(1

11장 유니런 : 플레이어 제작 459

첫 번째 입력에는 파라미터 이름. 두 번째 입력에는 해당 파라미터에 할당할 새로운 값을 입력

합니다.

이어서 플레이어 캐릭터가 사망 시 실행할 016() 메서드를 작성합니다. 016() 메서드는플레

이어 캐릭터의 죽음을 구현합니다. 사망 애니메이션을 재생하고, 플레이어 캐릭터의 현재 상태

를 사망 상태로 변경합니다.

만약 플레이어 캐릭터의 발이 바닥에 닿아 있어 1561-000606^ 값이 주3156라면 3(111113101-.

5618001 (”0-0110히", 156드0110(16(1)가 실행되었을 때 애니메이터의 61*000^6(1 파라미터의 값

이『8156가 됩니다.

// 오디오 소스에 할당된 오디오 클립을 으68하)(:1푸으로 변경

하18X6("슈그 (16311)0111);

// 사망 효과음 재생

마소3오61"슈11(110다’18,0;

1키가우01‘ 애니메이터 컨트롤러에서 유니II 으 전이의 조건은 6드0110(16어 파라미터가 데유인

경우.그 ― 요1111 전이의 조건은 6|“000예 파라미터가 바‘06인 경우로 구성했습니다. 따라

서 3010)310^,561:8001 (”6|’0110^6(1,\\ 156으0110예)에 의해 1《110과오파!? 애니메이션이 상황에

맞춰 재생될 겁니다.

; :정 미 ) 018() 메서드완성하기

(1)016() 메서드를 다음과 같이 완성

// 속도플 제로(0,0)로 변경

()13X61에9코이30어7수610(:117 그 261*0;

// 사망 상태를 바‘06로 변경

1|‘116;

으1*1731:0 7016 016() (

// 애니메이터의 016 트리거 파라미터를 셋

P:64

사망 애니메이션을 재생한 다음에는 플레이어 캐릭터가죽는 효과음을 재생합니다.

컴포넌트에]0019 오디오 클립이 할당되어 있었습니다. 따라서 오디오 소

그다음 플레이어 캐릭터의 속도를 제로(0, 0)로 변경합니다.

아13우8데9코이〕0하'.으61《)(:117 그 760101-2.261-0;

460 5부 20 러너 게임 : 유니런

작성한 코드를 살펴봅시다. 먼저 사망 애니메이션을 재생하기 위해 애니메이터 컴포넌트의 016

파라미터에 접근합니다.

이전과 마찬가지로 세10810!‘ 타입에 내장된 561 계열 메서드를 사용합니다. 5618001(),

561101696(’( X 5811:1081 ( )과 달리 56111-1996^( ) 메서드는 파라미터의 이름만 입력하고. 파

라미터에 할당할 새로운 값은 입력하지 않는다는 점에 주목합니다.

561:171997() 메서드는 트리거 타입 파라미터의 ‘방아쇠’를 당길 뿐입니다. 트리기 타입의 파

라미터는 셋하는 즉시 하가6가 되었다가 곧바로 조3156가 되기 때문에 별도의 값을 지정하시 않

는다고 했습니다.

30101810흐.유니드포으이‘(”0표" )가 실행되면 016 트리거를 조건으로 사용한』\\11)- 8131으 ―— 010

전이가 실행됩니다. 따라서 현재 상태가 유1】0이든.|11111휴든 상관없이 곧바로 04느 상태로 전환

되어 죽는 애니메이션 클립이 재생됩니다.

플레이어 캐릭터가 사망과 동시에 멈추지 않으면 어색하게 보일 수 있습니다. 예를 들어 점프

도중에 장애물에 닿아 죽은 경우 캐릭터가 공중으로 상승하면서 동시에 사망 애니메이션 클립

⑴그보이’슈0(110XIII? 그(1681^0111);

1)13761‘슈0(110우18오 0;

원래는 오디오 소스

스를 재생하기 전에 아1376애니에0으1!|? 그 가68나)(111아;을 실행하여 오디오 소스에 할당된 오디

오 클립을 여3나101포으로 교체했습니다. 그리고 슈11±1050#06 타입에 내장된 9187 ( ) 메서드

를 실행하여 교체한 오디오 클립을 오디오 소스로 재생했습니다.

P:65

마지막으로 플레이어 캐릭터의 현재 상태를 사망 상태로 변경합니다.

15063(1 바‘1】0;

”068(1” 8& 115068(1)

)

11장 유니런 : 플레이어 제작 461

131*1731:6 701(1 0017199이'테6호20((:0111거61-20 0나16도) (

51 (0하16구139

작성한 코드는 충돌한 상대방 콜라이더 20 컴포넌트 0나!"를 통해 상대방 게임 오브젝트의 태

그가 063(:1인지 검사합니다.

만약 상대방 게임 오브젝트의 태그가 06*1이며. 변수 1506361의 값이 1=3126라서 플레이어 캐

릭터가 아직 죽지 않은 상태라면 016 ( ) 메서드를 실행하여 플레이어 캐릭터가 사망하게 합니다.

11,6,5 0017199아트이아‘20() 메서드

이제 완성-한 016 ( ) 메서드를 언제 실행할지 결정해야 합니다. 우리는 플레이어 캐릭터를사망

하게 할 낙사 영역과 장애물 게임 오브젝트에 0(*1라는 태그를 할당하고. 트리거 콜라이더를

추가할 겁 니다.

따라서 트리기 충돌을 감지하는 0^1-1996^01:0(-() 메서드에서 1)621(:1 태그를 가진 콜라이더

와 딩'았는지 검사하고 016 ( ) 메서드를 실행하면 됩니다.

그런데 21) 콜라이더를 사용하는 경우 에199"타!!:이‘() 의 20 버전인 0017199"타116(*20 ( )

메서드를 사용해야 합니다.

이 재생될 수 있습니다. 따라서 플레이어 캐릭터가 사망하는 순간 잠시 속도를 제로로 변경합

니다.

// 중돌한 상대방의 태그가 06개이며 아직 사망하지 않았다면 016() 실행

0160;

(과정 이 ) 0011199라'타)I아2미〕완성하기

① 0유1두!99"타116[’20( ) 메서드를 다음과 같이 완성

P:66

)

)

)

여기서 00(=01115100타]!:“20()에서 노말벡터의 방향을 검사했다는 것에 주목합니다.

462 5부 20 러너 거잉 : 유니런

156[’000으6(1는 플레이어 캐릭터가 바닥에 닿은 동안 1^06, 바닥과 떨어져 있는 동안 주8186가

됩니다. 이것을 일반 콜라이더와 닿는 순간에는 156「00개6(1를 바‘06로. 일반 골라이더와 떨어

지는 순간에는 156「000(166를 주8186로 변경하는 방법으로 구현하겠습니다. 같은 방식으로 플

레이어 캐릭터가 바닥에 닿는 순간 느"이:0001를 0으로 리셋합니다.

따라서 일반 충돌이 시작되는순간 실행되는어(:01115!00타116「( ) 메서드와충돌한 두 콜라이

더가 서로 떨어지는 순간 실행되는 00(101115100도XII () 메서드를 사용합니다. 단. 20 콜라이

더에 의한 충돌을 검사할 때는 20 버전을 사용해야 합니다. 따라서 00001115100^16^-20() 메

서드와 00601.11510(1^X1120 ( ) 메서드를 구현합니다.

〔 고!정 01 ;| 00(:이115800타11이’20 ()와〔⑴드이느이아나)(8120 () 완성하71

① 00001115100^016(-20 ( )와 0000111510115X1120 ()를 다음과 같이 완성

11,6,6 00001118100^016^20( )와 00001115100^X1120()

0(X1816 () 메서드에서 고삐으001와 를 사용했지만 156[‘000(^0(1 값을 결정하는 부

분과 ⑴쀼(:0기를 리셋하는 부분을 아직 구현하지 않았습니다. 마지막으로 156^000(16(1 값을

결정하고 기째(:00이를 리셋하는 부분을 구현합니다.

// 를 나나6로 변경하고, 누적 점프 횟수를 0으로 리셋

156(’000으6어 그 히⑴으;

300)^0001 그 0;

()1*17316 701(1 000)1115400테"20(60111510020 00111510(1) (

// 어떤 슬라이더와 닿았으며, 충돌 표면이 위쪽을 보고 있으면

(001115100.(:01113(:15^.0001131.7 으 0.711)

()1-1731:6 701(1 0(16011151006x1120(00111510020 001115100)(

// 어떤 콜라이더에서 떼어진 경우 15아000어6(1를 후8156로 변경

186(*0140(16(1 그 18156;

P:67

같은 방식이 20 버전인 ^111510020 타입과 (10013(:하30^20 타입에도 동일하게 적용됩니다.

(0,1) (~0/7,0.7)

흐... 〕 (1,0)

(0, -1)

우 충돌 표면의 방향에 따른 노말벡터 값의 예시

위 조건을 검사함으로써 ‘절벽'이나 ‘천장,을 ‘바닥’으로 인식하는 문제를 해결한 겁니다.

11장 유니런 : 쯘레이어 제작 463

즉.(〕0(:01115100타1161*20 () 에서 검사한 조건(0011151이1오(:0111:8(:1:5【:0고1101“1!131^ 으 0.7주)은

첫 번째 충돌 지점의 표면의 방향이 ‘위쪽이며’. ‘경사가 너무급하지는 않은지’ 검사하는 겁니다.

11,6,7 기37아'0001^01101^1 전체 코드

이것으로 유137이우해1「0117 스크립트를 완성했습니다. 스크립트의 전체 코드는 다음과 같습

니다.

만약 어떤 표면의 노말벡터의 X 값이 0.7이라면 대략 45도의 경사를 가진 채 표면이 위로 향한

다는 의미입니다. 그리고 노말벡터의 V 값이 1.0에 가까울수록 경사는 완만해집니다.

즉. 00(:01115100타1161*20 () 에서 사용한 0011151011.0001:3(:1:5[이은 두 물체 사이의 여러 충돌

지점 중에서 첫 번째 충돌 지점의 정보를 가져온 겁니다. ⑴⑴:하다⑦!거:와(:001:3(:나’010120 타

입은 충돌 지점에서 충돌 표면의 방향(노말벡터)을 알려주는 변수인 00때31을 제공합니다.

0000111510(1 계열의 중돌 이벤트 메서드는 여러 충돌 정보를 담는 601115100 타입의 데이터를

입력받습니다. ^1115100 타입은 충돌 지점들의 정보를 담는(:0013(:바’0101 타입의 데이터를

0001301:5라는 배열 변수로 제공함니다. 따라서 00^13015 배열의 길이는 충돌 지점의 개수와 일

치합니다.

어떤 표면의 노말벡터의 7 값이 1.0인 경우 해당 표면의 방향은 위쪽입니다. 반대로 7 값이 0

인 경우 해당 표면의 방향은 완전히 오른쪽이나 왼쪽입니다. / 값이 -1.0인 경우 해당 표면은

아래를 향합니다.

P:68

05109 0011^^9106;

)

)

464 5부 20 러너 게임 : 유니런

)

6156 11 (10【)01으661뉴00558011000하(0)8& 1118,61’유!91어130(17수6100117시 ^ 0)

미"17316 101 3011)^00001: 느 0; // 누적 점프 횟수

?1-17316 1)001 156드00(X16(1 그 에요; // 바닥에 닿았는지 나타냄

()1*17316 1)001 15063(1 그 후8156; // 사망 상태

()1-17316 ^191(160(1^20 1)13X61*11191아)0(바; // 사용할 리지드바디 컴포넌트

|)(‘17316 쎄108(0도 301018101’; // 사용할 애니메이터 컴포넌트

()1*17316』\\에0500후06 이8오6재1』에0; // 사용할 오디오 소스 컴포넌트

()(‘17316 7016 11(X1816() (

11 (15068(1)

// 사망 시 처리를 더 이상 진행하지 않고 종료

나11;

// 마우스 왼쪽 버튼을 눌렀으며 최대 점프 횟수(2)에 도달하지 안았다면

(10()111.661^005680110(100*70(0) 오 누0【파)(:01!0흐 으 2)

// ?1하아으00나011"는 플리|이어 캐릭터로서 유⑴아" 게임 오브젝트를 제어함

()1161.10 이885 : 유0000아1*10111’ (

아나)110 슈1X110(111하 (168나!아1휴; // 사망 시 재생알 오디오 클립

아니3110 11031 누1@|)1:01’(:6 그 70아; // 점프 힘

?1-17816 701(1 5131‘10 (

// 게임 오브젝트로부터 사용할 컴포넌트들을 가져와 변수에 할당

하18아6(‘11191(11)0(1아 느 661으001으00&0하오191(160(^20〉0;

8(11(1131이' 그 061(:0(마)00601애011118100();

1)13X8^0(110 그 661으0끼?006(11이1X110500드스6,0;

// 점프 횟수 증가

두0!파)으0。++;

// 점프 직전에 속도를 순간적으로 제로(0,0)로 변경

|)13이61*1119히느0(1유7810011아 그 니801이‘2구61‘0;

// 리지드바디에 위쪽으로 힘 주기

이3아6에9코아)0호에이더아'“0】허 이6010두2(0,「다이。));

// 오디오 소스 재생

【)13X61’슈11(5!0,?13우0;

P:69

15068(1

“068^“ 8& 115068(1)

)

)

11장 유니런 : 믈레이어 제작 465

(‘17316 701x1 ()01'[’1906 테6두20((:0111(|0드20 0나16두) (

1조 (0아16(그189

(3(‘17816 701(1 0160 (

// 애니메이터의 016 트리거 파라미터를 셋

80101310(’,5611|‘1996^(”016,‘);

// 오디오 소스에 할당된 오디오 클립을 어63하1(:1푸으로 변경

|313^6구슈1X110XI!하 그 (168아)아.I아;

// 사망 효과음 재생

()1376^^^10-?13x0;

// 속도를 제로(0,0)로 변경

(〕1876(’1《191아)0(1아노7610(:117 그 76010^2,26(*0;

// 사망 상태를 나06로 변경

바'06;

// 충돌한 상대방의 태그가 063(1이며 아직 사망하지 았았다면 016() 실행

0160;

// 애니메이터의 6(-00066(1 파라미터를 1561-000^6(1 값으로 갱신

301(1)3하0(‘3618001(,,6(‘000(16아", 186^000(10(1);

// 마우스 왼쪽 버튼에서 손을 떼는 순간 요 속도의 X 값이 양수라면(위로 상승 중)

// 현재 속도를 절반으로 변경

아그우6에9고아)0하수이’⑪게오 그 아그76에9고어)어우오아⑴네이 부 0.5아;

// 156도00(X)611를 나가0로 변경하고, 누적 점프 횟수를 0으로 리셋

156(‘0110(^6(1 그 바‘06;

5001(300001 그 0;

(‘1731:6 \\/01(1 00(:011!5100타116으20((:0111510020 001115100)(

// 어떤 콜라이더와 닳았으며, 충돌 표면이 위쪽을 보고 있으면

(001115100.00018015^1.0017113〉0.7주)

P:70

오5하1|1흐 으0(|8도8으

- 히0141|011아 20

느 스 5?01흐노 히나호으 20

우 -; ⑦XIX!)0 5011프흐

부‘'그&세게0도

V - 52 후14수(으 0001흐011(도 은『1으1) 그

5《11유I

0^*01 0(0

100)0 후0흐흐

?13’(61(:0’100!소'

사이1( (사!4하0 0#0

700

으 6630101⑴에 오디오 클립 할당

466 5부 20 러너 게임 : 유니런

7^*11110^01 표구호.

)

)

따라서 I)나)11(:으로 선언한 /⑴서에① 타입의 변수(103나1(:1그만 설정하면 됩니다.

I ① 타 게임 오브젝트 선》'] 50:아1 소:00.0

33 느사81’ I 0이스느!!

| ③⑴6 오디오 클립을 더블 클라「|

I,

.1뉴.술.’":

10=11 -'

0 101*101

서 @5

?13오6기:0011’011라' 스크립트를 제대로 작성한 것을 확인하고 [에+이로 스크립트를 서장합니

다. 그리고 유니티 에디터로 돌아갑니다.

11.6.8 I기37아'0아111*0119후 컴포넌트 설정하기

이제 ⑵아'" 게임 오브젝트에 추가한 ?13오61으00바’01161‘ 컴포넌트의 필드를 설정합니다.

아‘1731:0로 선언된 컴포넌트 관련 변수 아"3아6애!91아)0거7소 8⑴1뗴0드. |)13오61기유에0는

히①까00601 ( ) 메서드로 참조를 가져왔기 때문에 인스펙터 창에서 별도로 설정할 필요가 없

습니다.

히 50*0(

|)으173^6 701(1 00^1115100^X1120^0111510020 00111510(1) (

// 어떤 골라이더에서 떼어진 경우 156〒000히를 13156로 변경

1561-000(16(1 드 호8156;

우에(쮸 소,:,!.,-에느- 그토교'&그^시/’.;으 |누노!.1.. 바;.나산.~,5즈 7

스는오느표포/느&14&0

〔 과정 이 ) (183111이무에 오디오 를립 할당

① 하이어라키 창에서 우|3이아' 게임 오브% 선택

② 인스펙터 창에서 ?13오6기:00하0116〒 컴포넌트의 063하! 01||3 필드 옆의 선택 버튼 클릭

③ 선택 창에서 이8 오디오 클립을 더블 클릭하여 063111 01⑴ 필드에 할당

177: ~

⑦ 75자'

1*91 카하

(2)으187600011’0116드 컴포넌트의 008나) 01(3

필드 옆의 선택 버튼 클릭

P:71

0 I기3오6오 게임 오브젝트 테스트

11.7 마치며

이 장에서 배운 내용 요약

11장 유니런 : 플레이어 제작 467

또한- ⑴뿌⑴기를 이용해 더블 점프를 구현했으므로 공중에서 다시 한 번 점프할수 있습니다.

충분히 테스트했다면 플레이 모드를 해제하고 [으하1+이로 씬을 저장합니다.

이 장에서는 I시게임 오브젝트를 구현하면서 20 프로젝트에서 스프라이트를 다루는 방

법. 애니메이터를 제어하여 어떤 애니메이션을 재생할지 결정하는 방법을 배웠습니다. 다음 장

에서는 움직이는 발판과 장애물을구현합니다.

그리고 마우스 왼쪽 버튼을 누르자마자 손을 떼면 낮게 점프하고, 오래 누르면 조금 더 높게 점

프하는 것을 확인할 수 있습니다.

테스트하는 동안 발판에 발이 닿았을 때는 플레이어 캐릭터가 뛰는 애니메이션을 재생하고, 마

우스 왼쪽 버튼을 눌러 점프히는 동안에는 점프 애니메이션을 재생합니다.

- ⑶니II이0 모드를 사용하면 하나의 스프라이트를 여러 스프라이트로 잘라 사용할수 있습니다.

- 오디오 소스 컴포넌트는 소리를 재생합니다.

- 오디오 클립은 재생할 오디오 파일(에셋)입니다.

- 오디오 소스 컴포넌트는 재생할 오디오 클립을 할당해야 소리를 재생할 수 있슴니다.

이것으로 I나게임 오브젝트를 완성했습니다. 이제 플레이 버튼을 눌러 플레이어 캐릭터가

잘 동작하는지 확인해봅시다.

P:72

468 5부 20 러너 게임 : 유니런

- 오디오 소스 컴포넌트가 재생하는소리는 오디오 리스너 컴포넌트가듣습니다.

- 애니메이션 창에서 스프라이트를 배치하여 20 애니메이션 클립을 만들 수 있습니다.

- 애니메이터 컨트롤러는 유한상태 머신(두8⑶)으로 재생할 애니메이션을 결정하는 에셋입니다.

- 유한 상태 머신은 유한한 개수의 상태 중 한 번에 하나만 현재 상태가 될 수 있지만. 상태와 상태 사이를 전

이를 통해 이동할 수 있는 설계 모델입니다.

- 애니메이터 컴포넌트는 애니메이터 컨트롤러를 사용하여 애니메이션을 재생하는 컴포넌트입니다.

- 애니메이터 창에서 애니메이터가 사용 중인 애니메이터 컨트롤러의 상태도를 편집합니다.

- 애니메이터 창에서 파라미터를 추가하여 전이의 조건으로 사용할 수 있습니다.

- 애니메이터에서 트리거 타입의 파라미터에는 값을 할당하지 않습니다. 트리거 타입의 파라미터는 트리거를

발동시키는 방식으로 사용합니다.

- 애니메이터 컴포넌트의 801 계열 메서드로 파라미터에 새로운 값을 할당할 수 있습니다.

- 20 콜라이더에 대한충돌 이벤트 메서드는 0가7199아’타가이’20() 같은 20 버전을 사용해야 합니다.

P:73

II,

/.

1:

헤 에:

그으,유호.

뗘%8째개;뻬뾰

조“%5%

―' -'즈고누'%렠8

'、으…유

조하에뷰-―--즈 - ‘

2

: 빼0 0〔내II :. 1, '드..':''’자 즈''나’'혀즈네

P:74

이 장에서는 움직이는 배경과 움직이는 발판을 만듭니다. 플레이어 캐릭터는 계속 뛰는 것처럼

보이지만 캐릭터의 실제 X축 위치는 고정되어 있습니다. 대신 배경과 발판이 플레이어를 향해

계속다가옵니다.

그다음 다양한 비율과 크기의 게임 화면에 대응하는 01를 만듭니다. 그리고 게임의 싱대와 규칙

을 정의하는 게임 매니저를 만듭니다.

이장에서다루는내용

- 20 스프라이트가 그려지는 순서 조정하기

- 반복되는 배경을 만드는 방법

‘ 5베10의 개념

- 여러 해상도에서 일관된 01를 유지하는 방법

- 상글턴 패턴

12.1 배경 추가하기

먼저 게임에 배경 하늘을추가합니다.

(과정 01) 바!경 추가

-'흐 ‘

23 13X8’’ ! 0하느0|1

2~

슈!5(1! 으 5휴!'느

배경 추가하기

470 5부 20 러너 게임 유니런

’| 05(3110 ''’

시I 사0?버드

시I 유

①31아 스프라아트륨 하이어라키 창으로

드래그&드롭

(2) 81아 게임 오브젝트의 위치1

(0.0.0)으로 변경

V XX1(1& 시—

||세(IV배0기구

(0X1X110

VI ^0()1

VI 유하31)(

나5허의5

스?으으/—

두 고 0,

:0— |느

0 10*(1이' I

느, 8 파?——

139 11노프99흐으

프 그、. 7프…0”

1^0)11101)

11012(1011

5아호

즈 V 프

: V ‘0

"주

0**0 ’

%

V ⑶)4110

/‘|4소0 0조슈'

51*71 ~오00그

061112011(

'써8?

15------

V '’、드우0하10 스그그스—

’X)! 볘하11:- ~ 00((011 즈

우 06106흐

구 '느'?11다001! 호브그의하[요5뇌으0요—:

니—I프I;701(0.01( 더188:

누…-101(0스|||(파)

누 701(0.11011

① 8이가65 폴더의 81아 스프라이트를 하이어라키 창으로 드래그&드롭

② 81아 게임 오브젝트의 위치를 (0, 0, 0)으로 변경

P:75

그디음 카메라의 배경색을 81《우 스프라이트에 어울리도록 변경합니다.

(과정 02 ;| 카메라의 배경색 변경

① 하이어라키 창에서 171810 03018( 게임 오브% 선택

| ①1이310 게임 오브젝트 선택 |

| ②01631‘ 도1395믙 3011거 6010('로 변경 |

”051**1드 구

스프브느뜨프

I‘ 501'느 ):0)0/

7/5”

으 카메라의 배경색 변경

12.1.1 정렬 레이어

몇몇 독자분은 8^ 스프리시트를 배경으로 추가하면 플레이어 캐릭터와 시작 지점의 발판이

51하 스프라이트에 의해 가려질 겁니다. 이런 경우 유/ 게임 오브젝트가 게임 오브젝

트와 아지! ?12나01‘111 게임 오브젝트 뒤에 그려지도록 수정해야 합니다.

스프라이트 렌더러 컴포넌트가 그리는 그래픽의 앞뒤 정렬은 트랜스폼 컴포넌트의 위치값과 상

관없습니다. 20 게임 오브젝트가 그려지는 순서는 스프라이트 렌더러의 정렬 레이어5。허쁘너。

가결정합니다.

그러면 먼저 20 게임 오브젝트의 스프라이트를 정렬하는 데 사용할 정렬 레이어를 추가합시다.

12장 유니런 : 배경 스크롤링과 게임 매니저 4기

I 쯔?으?으구.

—‘ 763~

05; &기고으

I토깨’,

I 00^4^5

② 0801하'3 컴포넌트의 01631’ I뒤395를 801(01 0이0[로 변경

③ 630^(-011001 컬러 필드 클릭〉컬러를 (163,185,194)로 변경

5스319흐즈2‘"

아이으1:00

( 1이'19 이3084 03~

‘1000’

우 ^410 0(71(^

1*39 느느10느느0、하1

0V0(0느그

0^1- 다이

에000(1

0(111109 사3나(

V 하1*1

(0)으: (‘‘ 10 오44 0(?“!

③8301으「0006 걸러 필드 갈릭〉걸러릅

(163, 185, 194)로 변경

P:76

(과정 01) 정렬 !II이어 추가하기

고 ; X느;느 '

후 13사흐다

I ③ 생성된 13,이' 이름을 83아이로변경']

』그

느 정릴 레이어 추가

정렬 레이어를 사용하는 방법은 포토샵 같은 이미지 편집 프로그램에서 레이어로 이미지의 순

서를 조정하는 방법과 유사합니다. 단. 포토샵에서는 가장 위쪽 레이어의 이미지가 가장 앞쪽

에 그려집니다. 하지만 유니티에서는 가장 아래쪽 정렬 레이어가 가장 앞쪽에 그려진다는 점에

주의합니다.

따라서 뒤쪽에 그려질 배경 게임 오브젝트에 위쪽 정렬 레이어를 할당하고. 앞쪽에 그려질 플

레이어 캐릭터에 아래쪽 정렬 레이어를 할당합니다.

472 5부 20 러너 거잉 : 유니런

거 0,

0 |0506010『 즈—

, -. 7395 & 13아으으 호

으의아스

!으흐①안끄으

①8(X1109 137이의 0이3미1 '클릭〉스%

8(X1109 1조@- 클릭

⑤+ 버튼 글릭〉생성된 1376드 이름은

드⑵에。」^로 변경

④+ 버튼 클릭〉생성된 187이 이름을

⑶에6910110으로 변경

1*191

V 50^(09 1그아하5

1 그 1뉴우으,

즈 ~

50그-:오 I그,V

141111 세

5에(( 50호 으0해

I ②50그109(~3우이'5 리스트의 + 버튼 클릭

[:스느※'‘

13,0’ 뷰"

13X0’

’041)1(

83《1(9으0110《1

서1*169。으어

^0^69^0110(1

아뚜〜 ~~1. 스 …—

그: 호'5듀 —"—“"~

7오;0카99여

수 스. 71^1111000

스 슬’".

051311( ’’’

――1』 3고흐

포고하

—"으I;

0노 가 ,으으

05^110-0((3^1:— 0

!유어* \\ 다 , 8;

I1뜨!;쓰으—.— ―"자 ;0 ,-

1— - ;

(3) 8후기116 더6(1거61’6「컴포넌트의 8011109 1~아아의 06(3니I 클릭〉슈(히 8011)119 느3아라'… 클릭

② 7395 & 느3아이즈 창에서 80^11^9 느8오61즈 리스트의 + 버튼 클릭

③ 생성된 1=7이’ 이름을 83아《9|’01』0어로 변경

④ + 버튼 클릭〉생성된 187라' 이름을 I내)어에89흐000거로 변경

⑤ + 버튼 클릭〉생성된 137이' 이름을 드(기'69「이7에로 변경

5깨1(&~페9111(

5^20(? 느-그‘’.:

00(0으

후&I)

144!”1

01**40유

P:77

(가정 02 ;| 정렬 레이어 할당하기

① 하이어라키 창에서 #7 게임 오브젝트 선택〉8이119 060에이'" 컴포넌트의 8011109 느37이’를

8301《9호000(너로 변경

② I기3우의' 게임 오브젝트 선택〉8|기116 이60거6하' 컴포넌트의 80게09 느3X61'를 두0!’09『0비1거로 변경

③ 813(1 [기3유(가'01 게임 오브젝트 선택〉8|기’116 더611(」61'아’ 컴포넌트의 80111119 느37이를 도이'691”01』001

로 변경

데 13/81’ I 0*1*011

브! 1가#1’ | 08구1)11

’5호7 110-0

123:

7〕13X81’ I 1X18

조?131(00.1009

-.. 뉴 ⑤으

느 정릴 레이어 할당하고I

뒤에 그려짐 |—

이제 배경이 플레이어 캐릭터와 발판 뒤에 그려질 겁니다.

12장 유니린 : 배경 스크몽링과 게임 매니저 473

으——기

’105=16 -

I 유008

''효7"..…

5071109 노우흐고

0/6^ 10 노아"

슈43!|《 10((^3(1101)

5()0(( 50구 유01(11

50하109 13/(으

01으" 10 11사"

서3으1( 1(1((1-30100

5|에0 50도 ?0|0(

①81아 게임 오브젝트 선택》80(1109 1.876'-3

880누9!’01』0(」로 변경

’ 그::;’1으 I고

01X1('으 13 137오그

‘ 1、‘; (011:13((100

- '“、01’1 ?010(

②유1370(’ 게임 오브젝트 선택〉80(1109 1376''르

도1X69。이로 변경

00(0느

다0

1.1^10^141

0으~ 사0(|0

0스 0노

느5(X1161-0((41111

스 사008

( 081‘1:흐으

( 아0"흐

(히호

페 호 휴도"6;

〔3스 0아

08으다1흐으~에3111(

| 51x1어호 —

- -그니 1 0514110 드

‘I

6구호

61 고호

그;

0 105()(010으 |

; 오 다’1376'‘—

739 I 카하

브 스、 77'헤우이’IV!

스’":

1 05(3(10 드

6고하

0 거 호..

1 0

IX

105으0드:0느

139 1”%에스—

1740X501711

, '/아… 유아〜"

0스 0나

서아5파1(유에30|:

I 5101이8

(I드의으뜨으브그—

3』81311 9131(01-(11 게임 오브젝트 선택〉

80⑴으9 137이’를 ^01’69(’000(1^ 변경

V 느.'6! 5|에"80드""

5하다IV

00,0으

후11|)

서312*1

0주유으【4*(

0 10‘;유0001’ | I

、/ 5(3(! 어;11(0아그”

’1\\19 0(1(359^1 — —

77211디0011

, 으'5@116으1너""

5|)다(8

00)0오

두1%)

^8(0^131

007 사0(10

I 3⑴7누 91376드와 3(3구 1기31(0?111

P:78

12.2 움직이는 배경과 발판

이제 움직이는 배경과 발판을 만듭니다. 우리는 5이‘0111090비6어 스크립트를 왼성하고 게임

오브젝트에 추가하여 해당 게임 오브젝트가 일정 속도로 움직이게 할 겁 니다.

12.2.1 801'이1109아#60흐

50*011109아):|6아 스크립트를 배경 81하 게임 오브젝트와 빌판 51=1 1기211101111 게임 오브젝트

에 추가하고 스크립트를 완성합니다.

〔 과정 01 ‘| 501-01110901)1601 스크립트 추가하기

21

0X1X110

브 80(-0111090^1601 스크립트 추가하기

열린 3(X0111090비스크립트는 다음과 같이 구성되어 있습니다.

115109 00117타19하16;

()(-17316 701(1 배)볘6() (

474 5부 20 러너 게임 : 유니런

① 프로젝트 창에서 80또15 폴더로 이동〉5이‘0111090비601 스크립트를 하이어라키 창의 81311

기31(01711과 81유로 드래그8드롭

② 프로% 창에서 5아‘0111090비601 스크립트를 더블 클릭하여 열기

(3)80^01.10900)80( 스크립트를 하이어라키 창의

513유 유과8;유로 드래그8드롭

\\그②80=090⑶601 스크립트-물

— 더블클릭하여열기

// 게임 오브젝트를 계속 왼쪽으로 움직이는 스크립트

()05110 01855 30011109아)1601 : 시0008야187101』드 (

하나]110 조1031 5|)66(1 그 10호; // 이동 속도

80*000(110아)

X,03(1)(*410190’

-

, 에(0111유;

- 허아우—

001―

『에"

더 유0호

^2V0?1(^X

사1 )411(세:

^0 14(x1^11

' 으、XII 유아3115

가18즈뉴스 —느오 ::%브

――브?띄쁘으—

P:79

// 게임 오브젝트를 일정 속도로 왼쪽으로 핑행이동하는 처리

)

05109 0011X^9106;

)

0(X1316 ( ) 메서드에 코드 한 줄을 추가했습니다.

하’그유으우⑪으171/1’두8051316(\\/6010(’3으161:1 후 5유66(1 11016.^611:311016);

12장 유니런 : 배경 스크폰링과 게임 매니저 475

여기서 사용한 허:의 값은(-1,0,0) 입니다. 따라서 76패0후3.161=1: 소 5으60(1의 값

은 (“51)66(1,0,0)이 됩니다.

이제 작성한 스크립트를 [으어+81로 저장하고 유니티 에디터로 돌아갑니다. 플레이 버튼을 눌

러 테스트하면 시작 지점의 발판과 배경이 왼쪽으로 움직이는 것을 확인할수 있습니다.

50*011109아)]601 스크립트의 변수 8아68거는 초당 이동거리를 나타냅니다. 1#?셰0( ) 메서드에

서는 초당 의6해만큼 왼쪽으로 평행이동하는 처 리를 구현합니다.

( 과정 02 ;| 50⑴II너9아》001 스그립트 완성하71

① 500111090비601 스크립트를 다음과 같이 완성

// 게임 오브젝트를 계속 왼쪽으로 움직이는 스크립트

1X1이10 아.355 501”0111090133601: : 어01X)8아18、/100후 (

아냐?110 111.031: 51)66(1 느 10주; // 이동 속도

701(1 0|?예6() (

// 초당 위660의 속도로 왼쪽으로 평행이동

하’305조0(‘피/1『1‘80513브8(\\/6(:10드3.16우1: 후 5하66어 # 11(116서611:311|116);

코드는 게임 오브젝트를 초당 (으아66(1,0,0)만큼 이동시킵니다. 트랜스폼 컴포넌트의

1「3051316 ( ) 메서드는 10장에서 본 평행이동 메서드입니다. 1*051316 ( ) 메서드는 이동할 거

리를 76(:1이‘3 타입으로 받습니다.

P:80

으 801X)111090^601 테스트하기

12.2.2 반복되는 배경 만들기

으 배경을 무한 스크롤링하기

1 가로로긴그림 두루마라3막대기로 감아서 웅직아는 그림을보여주는 도구

476 5부 20 러너 게임 : 유니런

우리는 배경인 51다' 게임 오브젝트를 두 개 이어붙여 길게 만들 겁니다. 각 배경 게임 오브신|트

는 왼쪽으로 계속 움직이다가 일정 거리 이상움직이면 오른쪽 화면 끝으로 순간 이동힙니다.

좀 더 구체적으로 봅시다. 다음 그림에서 비1(1나!는 배경 하나의 가로 길이입니다. 게임이 시작

되면 각각의 배경이 계속해서 왼쪽으로 이동합니다.

배경은 끊임없이 반복 스크롤링되야 합니다. 20 게임에서 반복되는 배경을 만드는 방법은 ‘크

랭키 박스0=7 3*1와 비슷합니다. 우리가 사용할 방법을 다음 그림으로 비유할 수 있습니다.

P:81

배경 1 배경 2

으나71게11 0 +에으바!

배경 1 배경 2

―\\시게느 0 +\\/\\/네11

으 배경들의 처음 위치

작싱한 83아이 000거10이? 스크립트는 게임 오브젝트의 X축 위치 (바'하유⑪제14)05111011수)를 계

속 감사합니다. 만약 게임 오브젝트의 X축 위치값이 이VI어나] 이하라면 ‘너무 많이 왼쪽으로’ 이

동했다고 판단하고 현재 위치에 2 추 세나!를 더합니다.

、(으

배경 1 배경 2

―VII 세느 0

2 ’ 7*111

배경 1 배경 2 배경 1

0 +\\차에1

브 재배치되는 배경

12장 유니런 : 배경 스크론링과 게잉 매니저 477

P:82

결론적으로 게임 오브젝트의 X축 위치가 -세1부가 되는 순간 어하!로 변경되어 (오른쪽으로

순간 이동하여 ) 배경 스크롤링이 무한 반복됩니다.

여기서 81아' 게임 오브젝트의 가로 길이 "하!는 8해에 박스 콜라이더 20 김포넌트를 추가해

구할 수 있습니다. 박스 콜라이더 20 컴포넌트는 추가될 때 20 게임 오브젝트의 스프라이트

에 맞춰서 크기가 자동 설정됩니다. 따라서 박스 콜라이더 20 컴포넌트의 5120 필드의 X 값을

게임 오브젝트의 가로 길이로 볼 수 있습니다.

단. 8버’ 게임 오브젝트가 다른 게임 오브젝트를 물리적으로 밀어내면 안 되니 추가한 박스 콜

라이더 20 컴포넌트는 트리거로 설정할 겁니다.

〔과정 이 ) 박스 클라이더 20와83애9「0나게0이] 준비하기

① 하이어라키 창에서 8⑴ 게임 오브전타 선택

② 81아 게임 오브젝트에 80 0에!어6호 20 컴포넌트 추가(슈% 600190*01〉I가175(08 20〉80오

(#1)*20)

너소^쇼%—:

I! 으 I으브쓰

2 고 흐.

'조아

스/으3016쎠(139@

호 박스 클라이더 20와 63아《9[’00(1610아) 준비하기

478 5부 20 러너 게임 : 유니런

브으의의므의으^

오브2뜨

-. -스기

05141흐 가

0X01^13(10(1(

느%하0

나아아3*)(

⑤880000*00유 스크립트를

더블 클릭으로 열기

03 유0)80

‘ 0(11( ” ‘ ‘

X^0 ;―'; 서2으58 !소:1(12인 ;

- 어31(01711

-. 이31601.5휴그아…

: 어3우"00아이"

-. 5(도01110901#6(:1

②8으 001.1^ 20 컴포넌트 추가

(써어 0X71000601〉으^:08 20〉

80x00^6(-20)

드 네아#다누 I

0히호 ’

V ⑶ 세|!1으

서3)0 03X^3

511하 위21(01771

0히2011(

,‘으18사6흐

I 5느 I

쑤에!

115 7009느

01X1 하 트7X10도

10나 8/ 0)1파10*11(

^1/10 II&09

00

512(

&10흐 II히10(

느 10(0

6 고흐

—―효 고 후.

5 고흐

0 105(X(10으

0?흐7

1*9 ‘ 00*^9^

수 X 7두110(0”

으 호85헤111느0601’

V ' &!50011109014*(1(5(^1)

아.끼 ~@쥬하즈---------

5~으 즈5 ‘ 2—

V I 3*0X0011111^ 20

| 사 | #0**1

아008 0100 쎄하느! 20) 0

'카노――― | ③15 I⑷96오 체크 |

④&30느9『000에00유 스크립트5 하이어라키

창의 81우로 드래그&드롭

,으-......... ..

|(1)8아 거임 오브젝트 선택

③ 80오 00111^61’ 20 컴포넌트의 |517199이' 체크

④ 80다기8 폴더에서 830스9)00이%이3 스크립트를 하이어라키 창의 81아로 드래그&드롭

⑤ 83이(9으000(110이) 스크립트를 더블 클릭으로 열기

주—

시I 서3((뱌쳬] 시I 서0에으 -------

유II I호(오65

P:83

열린 63아0「0110(110이? 스크립트의 모습은 다음과 같습니다.

05109 1)0117타19106;

)

)

)

^0511100 ( )은 재배치를 실제로 실행하는 메서드이며 0^(1310 ( ) 메서드에 의해 실행됩니다.

그러면 빈 메서드를 채워 스크립트를 완성해봅시다.

수\\/81〈@() 메서드

12장 유니런 : 배경 스크고링과 게임 매니저 479

0^310() 메서드에서는 매 프레임 현재 위치를 검사합니다. 만약 게임 오브젝트가 -유나!보

다 더 왼쪽으로 이동하면 게임 오브젝트를 재배치하는 메서드를 실행합니다.

^6() 메서드는 5누「1( ) 메서드처럼 초기 1회 자동 실행되는 유니티 이벤트 메서드지만.

513(-10 메서드보다 실행시점이 한 프레임 더 빠릅니다.

// 위치를 재배치하는 메서드

(‘17316 701(1 유아?0511100() (

사고나)는 배경 51아' 게임 오브젝트의 가로 길이가 할당될 변수이며 새가6 ( ) 메서드에서 계산할

겁니다.

〔 과정 이 1 88(에9「0나게0이] 스크립트의 새78스0( ) 메서드 완성하기

① ^3^6 ( ) 메서드 부분을 다음과 같이 완성

(‘173^6 701(1 81《6() (

// 가로 길이를 측정하는 처리

// 왼쪽 끝으로 이동한 배경을 오른쪽 끝으로 재배치하는 스크립트

I)나)110 01855 03아〈9드000(110이) : 이01X)6아)37101』드 (

1X17316 1=1031 1*1(1바); // 배경의 가로 길이

1)1-17316 701(! 0|)볘6()(

// 현재 우I치가 원점에서 왼쪽으로 아!6나! 이상 이동했을 때 위치를 재배치

P:84

)

스6() 메서드에서는 자신의 게임 오브젝트에서 박스 콜라이더 20 컴포넌트의 참조를 가져

옵니다. 그다음 박스 콜라이더 21)의 가로 길이 느3아"’00(1(20111(161구5120수의 값을 나)에

할당합니다.

0으어31@() 메서드

유6다0511100();

)

)

미입니다. 이때는 요이0811100( ) 메서드를 실행하여 게임 오브젝트를 오른쪽으로 밀어냅니다.

^6130811100( ) 메서드

)

480 5부 20 러너 게임 : 유니런

0?볘6() 메서드에서는 게임 오브젝트의 X축 위치 (바히외^「히우051110)()를 매 프레임마다

검사합니다. 현재 위치의 X 값이 쒀!6나)보다 작거나 같다면 왼쪽으로‘너무 많이' 이동했다는 의

〔 과정 이 ) 830*0(-00011100? 스크립트의 바)1^6 (〕메서드 완성하71

① 0()(1316 ( ) 메서드 부분을 다음과 같이 완성

(과정 이 ;| 83(애미0나게0이] 스그립트의 유리)05파00() 메서드 완성하기

① 휴아051110(1 ( ) 메서드 부분을 다음과 같이 완성

11(-178(6 701(1 0()68160 (

// 현재 위치가 원점에서 왼쪽으로 나오나! 이상 이동했을 때 위치를 재배치

(1(‘805^000,1)051^100으그 〜1어1듀)

(

5)1-17816 701(1 %81〈60 (

// 80X^111(161-20 컴포넌트의 5126 필드의 X 값을 가로 길이로 사용

80X00111(161*20(330^9(*0110(1으0111(16흐 그 061으001하00601①0노(1)11!66으20》0;

1*1(1111 느 1)3(:1《9(’011(1(1(:0111(161그5126노)(;

|)도1으816 701(1 116()051.11000 (

// 현재 위치에서 오른쪽으로 가로 길이 누 2만큼 이동

76010^2 0주주561 그 (16*1 ’ 2호, 0);

1(*305^001)-1)0511100 그 (780101*2) + 0'히581;

P:85

05109 00117타)9하16;

)

^05111000;

)

12장 유니런 : 배경 스크폴링과 게임 매니저 4이

단. 76010(-2 값을 76다이‘3 변수에 할당하는 것은 가능합니다. 이 경우 할당하려는 7*1:이‘2 값

이 값이 0인 760101-3 타입으로 자동 형변환되어 할당됩니다. 따라서 덧셈 연산으로 계산된

"어이‘2 값을 하히오⑪제]4)0511100에 명시적인 형변환 없이 할당할 수 있습니다.

우리는 가로 길이 (세나!)의 두 배를 X 값으로 가지는76아아'2 값을 0^561에 할당했습니다. 따

라서 이어지는 바"30어:00114)0511:1011 +(게561;에서 게임 오브젝트가 현재 위치에서 가로 길이

의 두 배만큼 오른쪽으로 밀려납니다.

여기서 에으이은 7601:0흐2 타입이지만 1드305주이’7114)051110(1은 76010[‘3 타입입니다. 760101“3

타입에 \\/6010^2 타입을 그냥 더할 수는 없습니다. 따라서 0/601이'2) 1^305^0(-(11.^0511:100 +

에861에서 나’8051:0제].|?0511100을 \\/6이:이‘2로 형변환하여 사용했습니다.

전체 83사느91’01」0에00|3 스크립트

작성한 83아(9'‘000(1100() 스크립트의 전체 코드는 다음‘과 같습니다.

^6^0511:100() 메서드 내부에 선언된 76010드2 0^561은 현재 위치에서 얼마만큼 오른쪽으로

밀어낼지 저장할 번수입니다.

이'17316 701(1 11()(13160 (

// 현재 위치가 원점에서 왼쪽으로 아!0바! 이상 이동했을 때 위치를 재배치

1주 (11-308^0^01 ^0811100으그 바!)

(

'/ 왼쪽 긑으로 이동한 배경을 오른쪽 끝으로 재배치하는 스크립트

1)111)110 이.355 830^9(‘011011100^ : 1-100086^37100(’ (

하드1731:6 주1031: ^1(1바); // 배경의 가로 길이

이‘!7316 701(1 ^3^60 (

// 80X(10II!어"20 컴포넌트의 5126 필드의 X 값을 가로 길이로 사용

60X60111(16드20 6801;9흐000어(:0111(16드 그 601^^00601^0X^111(16^200;

유1(베) 그 1)301^9^000(16011,1(161‘,8126^;

P:86

)

)

완성된 스크립트를 [으어+81로 저장하고 유니티 에디터로 돌아갑니다.

배경 스크롤링 완성

이제 51아' 게임 오브젝트를 두 개 만들어 이어붙이고 무한 스크롤링되는 배경을 완성함시디-.

〔 과정 이 ) 51《나 추가 배치

|①8어' 가;임 오브적트 선택〉(0마+01로 복제 |

17

0 104()00X0^

’ 5(31으 -

: ! 13오@ 0허〜1'!,

으 81아 추가 배치 | 복지:된 %(1『|

인할 수 있습니다.

으 반복되는 배경

482 유 20 러너 게잉 : 유니런

유V

5내 (1)

// 위치를 재배치하는 메서드

1X1731:6 701(1 1?6(305111000 (

// 현재 위치에서 오른쪽으로 가로 길이 ‘ 2만큼 이동

760101-2 0^^581 드 06^ 76010^2(^1(1111 # 2후, 0);

1^805^0011.^0511100 그 (\\/6010하2) 1(‘805^0^11,|)0511100 4^ 0^561;

②51아(1)게임 오브젝트의 위치읋

(20.48, 0, 이으로 변경

그 40/0、/

01(보

V 조

우수0 031710

5오 ~이0”

0히?00(

V

호 ^(1)

139 : 0느;?허

드느그——I므2의으끄

I 1*051(100

1《013:100

히6

X 20.48

※흐

XI

이제 플레이 버튼을 눌러 배경이 제대로 반복되는지 테스트합니다. 씬을 시작하면 아하- 게임 오

브젝트가 왼쪽으로 가다가 오른쪽으로 순간 이동하는 방식으로 배경이 무한 반복되는 것을 확

① 하이어라키 칭에서 #7 게임 오브전트 선택〉[으⑴+이로 복제

② 복제된 81아 (1) 게임 오브젝트의 위치를 (20.48, 0, 0)으로 변경

P:87

확인 후 씬의 플레이 모드를 해제합니다. 마지막으로 두 개의 5^ 게임 오브젝트를 하나의 게

임 오브젝트의 자식으로 만들어 하이어라키 창을 정리합니다.

( 과정 02)배경 오브젝트 정리하기

① 빈 게임 오브젝트 생성(0%316〉06316 011⑴X)

② 생성된 게임 오브젝트의 이름을 830느901에로 변경, 위치를 (0, 0, 이으로 변경

③ 하이어라키 창에서 8유오I 8스X (1)을 630스9오000에로 드래그&드롭하여 83#9『000에으I 자식으로

만들기

!스’

/] 14아흐'’ I 다으느“브

03*10

이것으로 움직이는 배경을 완성했습니다.

12.3 게임 니 만들기

점수와 게임오버 메시지를 표시하는 151를 만듭시다. ⑴를 구성하기 위해서는 먼저 캔버스 게

임 오브젝트부터 만들어야 합니다. 캔버스는 모든 ⑴ 요소를 잡아주는 루트— 게임 오브젝트

이기 때문입니다.

12장 유니런 : 배경 스크히링과 게임 매니저 483

어‘6816 타11유아

드뜨의의하우

소‘’스:

(3) 8^7와 81아 (1)읍 030누의

자식으로 만들기

② 이름을 03(얘아00%로 변경. 위차름

(0, 0, 0)으로 변경

트01히V 0우I허

30 0⑴&0( I

20 0⑴60( I

0(0015 I

^11(110 I

\\;000 I

、① 41111‘

우310 으3X^3

5(3구 머3((0아!!

0(.1(120116

I이3우이——————,

630^9^01(0(1 , 느^&너'

배경 오브젝트 정리하기

주피

1 03=1드 -'

8 고호

0 105유6010도 |

호(83(1(9^0(10(1

739 , ^01^99**1

V 스〜 713111101*01

1*05111011

11013(100

50810

① 빈 게임 오브젝트 생성(06810〉

09810 타1꾸(7)

P:88

12.3.1 고정 픽셀 크기

으 고정 픽셀 크기

484 5부 20 러너 게임 : 유니런

캔버스는 VI를 잡아두는 틀이기 때문에 캔버스의 크기나 가로세로 비율이 달라지면 캔버스에

배치된 니I의 모습도 다르게 보입니다.

먼저 유니런의 캔버스가 다양한 해상도에 대응되게 만든 다음 III 게임 오브젝트를 생성할 겁

니다.

640x360 해상도를 기준으로 게임 VI를 만들었다고 가정합시다. 이 경우 200x200 크기의 01

이미지는 세로 방향으로 게임 화면 절반 이상을 차지합니다. 그런데 같은 게임을 1280x720

해상도로 플레이하면 200x200 크기의 VI 이미지는 세로 방향으로 게임 화면의 절반보다 작

은 영역을 차지합니다.

이것은 131 요소의 크기는 같지만 화면(캔버스) 크기가 커져서 VI 요소가 상대적으로 작게 보

이는 문제입니다. 일부 게임이 초고해상도 모니터에서 플레이할 경우 ⑴가 알아보기 힘들 정

도로 작아지는 문제가 생기는 것도 같은 이유입니다.

캔버스의 크기는 게임을 실행 중인 화면의 해상도로 결정됩니다. 그런데 캔버스 컴포넌트의 VI

스케일 모드니 으3느 사유의 기본 설정인 고정 픽셀 크기0이아파1’“1 유는 캔버스 크기가 변해도

배치된 1)1 요소의 크기를 변경하지 않습니다. 이 경우 화면 크기가 달라지면 III 요소의 크기나

VI 요소 사이의 간격이 의도와 다르게 크거나 작아지는 문제가 생깁니다.

P:89

12.3.2 화면 크기에 따라 스케일

으 다양한크기의 해상도에서도 동일한 비 배치를 유지함

12장 유니런 : 배경 스크꼰링과 게임 매니저 485

(1280 X 720)

위 그림에서 ‘640x360 (1280x720)’으로 표시한 부분에 주목합니다. 여기서 640x360은

인스펙터 창에 표시되는 캔버스 크기입니다. 붉게 표시된 (1280x720)은 캔버스의 실제 픽셀

크기입니다. 즉. 캔버스의 실제 픽셀 크기는 1280x720, 이미지의 픽셀 크기는400x400으로

증가하지만. 수치상으로는 여전히 640x360 크기의 캔버스와 200x200의 이미지라고 가정

이 방식으로 640x360 해상도에서 미I를 배치했다고 가정합시다. ‘화면 크기에 따라 스케일'

모드에서는 게임을 실행 중인 화면의 해상도가 640x360보다 크거나 작아도 무조건 캔버스의

크기를 640x360으로 취급합니다. 다른 크기의 화면에 캔버스가 그려질 때는 캔버스 자체를

확대/축소합니다.

이때는 기준 화면 크기를 정하고. 실행 화면이 기준 화면보다 크거나 작을 때는 자동으로 확대/

축소(스케일업/스케일다운)하는 ‘하면 크기에 따라 스케일유"하배아배유’ 모드를 ⑴ 스케일

모드로 사용할 수 있습니다.

우리는 다양한 크기와 비율의 화면에서도 유니런 이의 크기와 배치를 일정하게 유지하고 싶습

니다.

즉. 고정 픽셀 크기에서는 ‘III의 크기와 비!!치,가 사용자의 화면 크기에 따라 달라지는 문제가

생길 수 있습니다.

P:90

방향 매치

필드 값이 높은 방향의 길이를 유지하고 다른 방향의 길이를

조절합니다.

640 X 360

가준 해상도 : 640 X 360

600 X100

실제 화면 크기 : 1280 X 900

640 X 450 (1280 X 900) 512 X 360 (1280 X 900)

486 5부 20 러너 게임 : 유니런

을 하는 방식입니다. 그럼으로써 640x360 화면에서의 111 배치 모습을 다른 크기의 화면에서

도유지합니다.

또한 ’화면 크기에 따라 스케일’ 모드는 작은 픽셀 크기로 그려진 최종 화면을 강제로 집이- 늘리

는 방식이 아니기 때문에 이미지가 깨지는 현상은 걱정하지 않아도 됩니다.

기준 해상도가 640x360일 때 가로로 긴 600x100 크기의 1)1 요소를 배치했다고 가정합시

다. 이때 1280x900 크기의 게임 화면에서 일치 필드의 값에 따라 인스펙터 창에 표시되는 캔

버스 크기는 다음과 같습니다.

일치 값이 높은 방향은 VI 레이아웃이 그대로 유지되지만 다른 방향의 레이아웃이 망가질 수

도 있습니다. 위 그림은 세로 일치를 높이면 가로 방향의 배치가 망가지는 경우입니다.

그림에서 볼 수 있듯이 가로 일치가 1.0이면 캔버스의 가로 길이를 640으로 고정하고 세로 길

이를 변경합니다. 세로 일치가 1.0이면 캔버스의 세로 길이를 360으로 고정하고 가로 길이를

변경합니다.

600 X100

(1500 X 250) 600x100

(1200 X 20이

가로 일치 0.0

세로일치 1.0

가로일치 1.0

세로 일치 0.0

느 화면 비율이 다른 경우

'화면 크기에 따라 스케일, 모드는 실제 화면과 기준 해상도 사이의 화면 비율이 다른 경우 캔버

스 스케일러 컴포넌트의 일치、’네’

P:91

일치 값을 결정하는 데는 정해진 기준이 없습니다. 저자 경험상 미 요소가 많이 나열된 방향의

일치 값을 높게 주는 것이 좋습니다. 예를 들어 세로 방향으로 버튼이 많이 나열되어 있다면 화

면 비율이 변했을 때 가로 방향보다 세로 방향의 레이아웃이 망가지기 쉽습니다. 이때는 세로

일치 값을 높이는 게 좋습니다.

12.3.3 캔버스 스케일러 설정

-화면 크기에 따라 스케일’ 모드를 사용해 640x360을 기준 해상도로 사용하여 VI를 배치하겠

습니다. 캔버스 스케일 모드는 캔버스 스케일러 컴포넌트에서 설정합니다.

( 과정 이 ) 캔버스들 만들고 기준 해상도 사용

① 030733 게임 오브젝트 생성(08316〉III〉030738)

② 630738 80316흐 컴포넌트의 1이 80316 1\\40여6를 80316 771111 8(X611 8826로 변경

(3) 06(6드@000 06801111100을 (640, 360)으루 변경

0 I 0

으"1

1

I)

휴후호

으 캔버스를 만들고 기준 해상도 사용

이제 실제 화면 크기와 상관없이 640x360 해상도에서의 VI 배치만 신경 쓰면 됩니다.

12장 유니런 : 배경 스크론링과 게임 매니저 487

--- - - —긍.%』 05(311( '’' I

"하?!

5&으II 71&유

트소80! 5/316(11

①080788 게임 오브젝트 생성(063(6〉

III〉030735)

060(0 타00하

000(0 트01이/ 0(111(1 ! 30 0비(XI 느 I

20 0이0으1 느 ; @60!3 느 ! 나9바 브 |

사어!0 느

5/1(100 느 I

08010

- —구 게 76X1

76X1^05^1(^0 - 78X1

I그1390

유3*7 I⑴900

801100

109010

811(161’

50『이I&"

0으이나0=1

10(1111 디01(1

10X(서65유1^0 - |000; 드!이어

—— 즈'

'‘'-!'(으V

I 그":. 노 그

— ③00(0(-0006 듀680111노00음

(640, 360)으로 변경

②030738 80316(’ 컴포넌트의 III 50816 시0거6를

80316 80도660 &26로 변경

부 ::’'

호…

X ^640 I V 360‘

| 스0101 유40| 0( 너흐으부

잆으버

11(후도011(( 1*1X815 0이1 400

,브-※하??비인으?으흐흐.즈이!씌1..

5? [(:30*35

739 I 01*99배 —

휴80 1730*10으01

해VII

조1오냐!으1즈오!히5도의0으. 너VI 803(6 우0으0 ! 5“!8유16 5000 51호~

니1《6((!1’6016 유0!0|11(|011

5드느흐(11 어31다! 사0(1(

서31대1

6고후

8 고 하 — 고 호

P:92

12.3.4 점수 0! 텍스트 만들기

점수를 표시하기 위한 131 텍스트를 만들겠습니다. 그리고 텍스트 내용과 폰트를 변경하고 그

림자 효과를 주겠습니다.

( 과정 이 ) 점수 니 텍스트 만들기

| ② 이름을

I 13우히'

?0으 I

V:

뉴 0,

『드「 !그— ’0' 기그 0,

I 다크 ( - I

트,XI” 드크

으 점수 III 텍스트 안들기 3트

8001-0 76X1 텍스트가 캔버스 하단 중앙에 정렬됩니다. 이어서 50016 70X1 텍스트의 내용을

바꾸고 효과를 추가합니다.

(과정 02 ;| 8001-8 18X1의 텍스트 컴포넌트 설정

488 5부 20 러너 게임 : 유니린

-……주

5(*0( ''’

15. 0 0 0

타 떠- —뎌

내 휴 | 0

— ’’으스— ―6

버히9이

① 16X1 컴포넌트의 16X1 필드를 800(-6 : 0으로 변경

② 두004 필드 옆의 선택 버튼 클릭〉선택 창에서 ^6007 1^110! 8이03% 폰트 더블 클릭

① 새로운 16X1 게임 오브젝트 생성(06316〉III〉16X1)

② 16X1 게임 오브젝트의 이름을 800% 76X1로 변경

③ 060117305(0011 컴포넌트의 \\/\\/네느를 300,1셰아11를 80으로 변경

④ /나1(가]이’ 아6501 클릭〉[새누8디하]를 누른 채로 430(1001-09016(’ 클릭

④써0% 아85이 클릭〉아바르 누

른 치I로 13000X60:이’ 클릭

10X1"오유나0 - 76X1

.10&390...: 유유 1^0*90

00110*1

702아#

①새로운 16X1 거;잉 오브젝트 생성

(08818 )01〉16X1)

쁘스 고 0 ~

표죠300------------

0 I아우히01 |

- — 너비 50X8 78X1

739 나"스95으으

V 11((1 17111)10도111

| 드 토히—수 | ,

I 014아 ~ I

0*110 다;)유

0(6*10 타하)(V 0부1】으

30 0이※! I

20 00히 I

터1*01 느

0아(1 느 …흐 느

/40그나

1또I

’' ‘ /바((XX1 하(1(11

511-1(: 시50 1(( 0)701 시!: 시10 1(1 ()0111100

노!| 유!!!.- 119*11 111*1(6

므 미 。 0

80(X616X1로 변경 | | ③7\\에우르 300스 나6〒1른 80으로 변경 |

기 으.

P:93

③ 두001 8)X6를 50% 변경

I토!구조I〔드0차]—

'이00( (어31((131)

프'

으 80(가'6 16X1의 텍스트 컴포넌트 설정

( 가정 03 ;| 8001-0 10X1에 그림자 추가

① 800도6 76X1 게임 오브젝트에 8드3어이/7 컴포넌트 추가(/\\(히 0001(300601〉01〉두유@015〉

8=7)

V)137흐'’ I쓰

5113으0\\7

느1

으 800(-0 I가XI에 그림자추가

12장 유니런 : 배경 스크로링과 게임 매니저 489

―.

I 7하1“18

1—I (5)00101- 필드 글릭〉폰트 컬러

류 (255, 255, 255)로 변경

(4)세3060(로 060(81’.

에어에6로 변경

②1=00: 필드 옆의 선택 버튼

'클릭〉오6007 이01 5(^081’6

폰트 더블 클릭

①76X( 필드르 80(X6 :0

으로 변경

(5) 8드3거0누7 겅포넌트 추가(/\\허어 0001000601 )

1)1〉드000(5 으 8누8605/7)

프 ’I 05*31^ '’’

'하〒?I타그?

…-도001................

호00( 5이르

유00( 512(

110( 5

111(유 7*6X1

흐흐!‘89도3|1유

| /\\119017100(

0 10우600느

'으 5^(-8 7**1

739〔0마199흐

11(01 7|’9(15^0701

0311*31 므으으투르!’

그7느XI (5히으0

V 후5113110뷰 (50이하1)

5((1이

6(휴다 00101

타흐가 01X(30“

1)요 0히세0 시()브3

⑦ 1510^ 78X1

739 I 베느00허 | ! 1~37#1 01-

유8가 77311디0히 —,

-- 080X85 II흐!1어8〒8그——―! 에드XI (5드1|1이) 두 프쓰5드0후 : 0

"—유8”8아유서지‘5으1*8%

I 14070111

|우 흐

:; —으。

8 고 프:

2222허교흐 됴 고 호

-— .1기고하0

III디I어

’]0예느 그

------- 11,,

0 곻 휴

8 고 휴

~ 8 고흐

"— - ―1

— 스주3!26무 50으로 변경

- - 1:

④ /이)9001이가를 0기아'. 1\\/11(」에6로 변경

⑤ 0017 필드 클릭〉폰트 컬러를 (255, 255, 255)로 변경

시(9유 8사 0흐0가흐11\\ 0

비0(1200131 076(‘00^ | '아유아

7(그1(31 07#^10^/

80( 두II

0010(’

사3(^131

P:94

이것으로 점수를 표시하는 800뜨 “XI 게임 오브젝트가 완성되었습니다.

으 완성된 5001^ 18X1 게임 오브젝트의 모습

12.3.5 게임오버 텍스트 만들기

이번에는 게임오버 메시지를 표시할 70X1 게임 오브젝트를 만듭니디-. 삐르게 만

들기 위해 8001-0 70X1 게임 오브젝트를 복제하겠습니다.

〔과정 이 ) 게임오버 텍스트 생성

I①50(X616X1선택》(01*1로목제 |

-:쿠느드츠의브그

도V타1!유、(— & 3!'혹

, ? 미..미페다 드 '(고'도‘이

0- -51 0 1-,‘ I

I그. 0- 드한

노 게임오버 텍스트 생성 0 0 0 0

490 5부 20 러너 게임 : 유니런

가! 50X81'르XI

(3)유(X 마956! 클릭〉^11+8(110)를

누른 채 10|3“060161’ 클릭

(2)8001-8 16X1(1)의 이름을

63019076(’ 16X1로 변경

드'

흐으-

^”―즈햐~)

0 |

‘ |'후

’ 1*4*1 7히14*0*01

느다".

으죠

스아느가

스스

(0*11

XI—으—

―1

: 0 ± ;

XX 스110 901*00

; : 0 033

「거수',. &1*1( ’ '《아,그

〒③바'

7@『타@

5(X1

0(2(1200(

’ 하"

느 ’ 84(19^000(1

① 하이어라키 창에서 8001-6 78X1 선택〉[(거(1 +이로 복제

② 800(^9 16X1(1 )의 이름을 (330160으61’ 70X1로 변경

③ 스I!아10「아6591 클릭〉[/⑴+오⑴유]를 누른 채 10으-06(116[‘ 클릭

P:95

I; 과정 02 ;| 게임오버 텍스트의 16X1 컴포넌트 설정하기

① 16X1 컴포넌트의 76X1 필드 값을 63이60으이’!로 변경

② 0이아' 필드 클릭〉폰트 컬러를 (255, 66, 85)로 변경

「035〕〔트0프I

3/ 0(0016(0( 0

0하/ (가유4:

,5! 1’3!’90(

으 게임오버 텍스트의 16x1 컴포넌트 설정하기

지금까지 030*(”。70X( 게임 오브젝트를 생성하고 앵커 프리셋을 사용해 화면 중앙 상단

에 배치했습니다. 그리고 텍스트 내용을 수정하고 컬러를 붉은색으로 변경했습니다.

이제 (⑶이으⑪우" 76X( 아래에 게임 재시작 방법을 안내할 III 텍스트인 ^65(31-1 76X1 게임 오

브젝트를 만들겠습니다.

( 과정 03)게임 재시작안내 텍스트 만들기

① 하이어라키 창에서 63⑴607% 76X1 선택〉[아기+이로 복제

(2)630100\\/이’ ‘(1 )의 이름을 0684311 70X1로 변경

12장 유니런 : 배경 스크몬링과 게임 매니저 491

사006 (사3(6(131)

0 10위6010「 1

③ 063=1 70X1의 1=1901 7|’308(001 컴포넌트의 1*8 V 값을 으40으로 변경

④ 76X1 컴포넌트의 76X1 필드를 ^110113 70 0681311로 변경

(5) 두004 8)X6를 33으^ 변경

②60101- 필드 클릭〉폰트 컬러를

(255, 66, 85)로 변경

〜 I《(그유(V 에드I 5()03도6 ’ 0

(풍&7그 2』그그:』

X 5*3하16&

@ &1410 10 3(1(1

두001

?00: 517느

8(20

1-1/10 8|?3(||19

느 -1 「으X!

| 16X1

0;!⑴6076드!

——그소 으!

1 0 513(1드 '’’

프고휴

——호 고 후

——프 고 하

프 030160*6오 78X1

739 '고흐호^— 그 프고 1~37흐1‘〔포

11*01 17805호01*01

02^85 11011*10도8후

오1~8하 (50에)루 ~

① 16x1 컴포넌트의 76X1 필드 값을

030=011로 변경

’ 0/ I I 수.''

1 :|?00(31 0/6도00、)(유오소하 수..''' :]

|’1031 0V^I^(I0VV ( 101001보

.1 4 ?|1 0

P:96

⑥ 8=13(1 16X1를 630160느6「16X1의 자식으로 만들기(하이어라키 창에서 0=1헤 1@〉《1를

630190761’ 76X1로 드래그8드롭)

“1

느: 너스)'하、브

X 0^-------VI----------

V”

'/드브(1헤1801

⑤17

"'스…(도규&교추

누 게임 재시작 안내 텍스트 만들기

이제 요08(*1 76X1의 텍스트 컴포넌트는]1111뚜 70 1《651311(점프 버튼을 눌러 재시작하세요)’

라는 메시지를 띄웁니다.

으 완성된 01 모습

492 &부 20 러너 게잉 : 유니런

0110(0*(1 18X1

유하18X1

다주—프구—

나고 히

(니 고 즈 '..

2 쓰—

①6제00\\‘이 16X1 선택 )

(01*1로 복제

0더01도0니트듀!

311(11? 10 ^511^^1’

④16X1 필드를 이001아

70 듀68(811로 변경

⑤드001 &20른 33으로

변경

드 8|(드뜨!

‘ 0**1( ’ ’ '오스 ‘

흐히프히스 : 14고00*0

‘ 5=1 여히00도

/ 0**11100(

,'하

부 ’ 14^0^01111(1

V /0*0*15

소 다지

③ 므03 V값을 ―40으로 3?-— 변경

- (프I흐3

,뜨꼬1"“ 유“,,,

〒3 :

"‘ :우 ;; 프르)=0—70 0114/1

——

0 1X1^00 |

|호 '스뉴"'규;1

다느9 ,그, .

1(*0 7^X1*(0011

?흐-,

으、,-、. ,、-

그수 1

-으뿌:— V ⑶14“

7조표10소10

:드11호 ^11)0^

/00(12011(

후 : 1x)(9^0411X1

V ,:0*0*13

’ 유0하 1***1 노스뜨헤혀;

,’ 6히5쓔:11

| ② 이름을 유68!8구 16X1로 고

⑥듀85!311 10X1를 631X160716X1의 자식으로 만들기

(0651311 I&XI은 16X1로 드래그&드롭)

또0코 '드13그

4*90하0*0X(^ 프스————

1*07(X0X111 아에아(

6*041 0、오#70

1*1( 드

00107

P:97

1^51.11( 76X1 게임 오브젝트는 (330100우61‘70X( 게임 오브젝트의 자식이기 때문에 0311*(*7

70X1가 비활성화/활성화되면 함께 비활성화/활성화됩니다.

%

〕프

이세 게임 화면에 게임오버 메시지가 보이지 않게 됩니다. 이것으로 ⑴를 모두완성했습니다.

12.4 게임 매니저 만들기

12.4.1 싱글턴 패턴의필요성

게임 매니저처럼 관리자 역할을 하는 오브젝트(예를 들면 파일 매니저, 몬스터 매니저. 점수

12장 유니런 : 배경 스크몰링과 게임 매니저 493

이제 ⑴는 물론 플레이어의 상태에 따라 게임의 전반적인 상태를 관리하는 게임 매니저를 만

들어야 합니다. 게임 매니저의 역할은 다음과 같습니다.

0211116=7 7^X( 게임 오브젝트는 평소에는 비활성화해 두었다가 게임오버가 된 순간활성화

힙-니다. 따라서 030*(*0 76X1 게임 오브젝트를 미리 비활성화해 둡니다.

- 점수 저장

- 게임오버 상태 표현

- 플레이어의 사망을 감지해 게임오버 처리 실행

- 점수에 따라 점수 III 텍스트 갱신

- 게임오버되었을 때 게임오버 III 화성화

I; 과정 04 ;| 게임오버 텍스트 비활성화하기

① 하이어라키 창에서 63010076우 16X1 게임 오브젝트 선택

② 인스펙터 창에서 활성화 체크 해제

1 051311드 프'

~ ~ 니

| ② 인스멕터 창에서 활성화 체크 5허]

게임오버 텍스트 비확성화하기

| ①6376076도 16X1 게임 오브젝트 선택

105휴61(01’

(하)하제6〒〒즈? 노 — -

P:98

우리가 만들 게임 매니저 또한 이 두 가지 조건을 만족해야 합니다.

단일 오브젝트

손쉬운 접근

싱글턴을 사용하는 이유

정리하면. 게임 매니저는 아래 두 조건을 만족해야 합니다.

494 5부 20 러너 게임 : 유니런

매니저 등)는 일반적으로 프로그램에 단 하나만 존재해야 합니다(단일 오브젝트). 그리고 언

제 어디서든 즉시 접근 가능해야 합니다(손쉬운 접근).

점수를 관리하는 점수 매니저가 두 개라고 가정해봅시다. 이 경우 최고 점수도 두 개가 될 수

있습니다. 비논리적입니다.

또 다른 예로 파일에 접근하고 수정하는 파일 매니저가 두 개 있다고 가정해봅시다. 이 경우

두 파일 매니저가 동시에 하나의 파일에 접근하고 수정하면서 에러가 날 수 있습니다. 따라서

파일 매니저는 프로그램에 하나만 있는 것이 좋습니다.

이와 같은 이유로 점수와 VI,게임 상태를 관리하는 게임 매니저 또한 게임에 단 하나만 존재

해야합니다.

매니저라고 불리는 오브젝트들은 보통 프로그램의 특정 영역이 아니라 어느 곳에서도 사용할

수 있는 편의 기능을 제공합니다. 따라서 매니저 오브젝트는 코드 어느 곳에서도 쉽게 선근하

여 사용할 수 있도록 구현함니다.2

우리가 구현할 게임 매니저는 게임오버 상태와 점수를 관리합니다. 게임오버 상태와 점수는 게

임의 거의 모든 부분에서 사용됩니다. 따라서 어떤 스크립트에서도 씬에 있는 게임 매니서에

쉽게 접근할 수 있어야합니다.

2 상황에 따라 다르 수 있습니다 싱글턴 파!턴이 남용되연 너무 않고 다양한 곳에서 오브젝트에 접근하므로 코드의 흐름을 읽기 힘든 경우가

밤생합니다.

- 게임 매니저 오브젝트는 단 하나만 존재

- 어떤 곳에서도 손쉽게 게임 매니저 오브젝트에 접근 가능

P:99

이런 조건에서는 주로 싱글턴이라는 디자인 패턴을 사용합니다.

12.4.2 정적

싱글턴 패턴을 구현할 때는 정적이지11' 변수의 특징을 활용합니다.

12장 유니런 : 배경 스크로링과 게임 매니저 495

009 클래스로부터 009 타입의 오브젝트 스. 8, 0를 순서대로 생성했다고 가정합시다. 이때

(20001 값의 변화는 다음 그림과 같습니다.

다음과 같은 009 클래스가 있다고 가정합시다. 간략화한 예이므로 구체적인 처리나문법은 신경

쓰지 않고 개념에만 집중합니다.

클래스에 선언된 변수들은 해당 클래스 타입의 오브젝트가 생성되면 함께 생성됩니다. 이것은

메모리 상에 멤버 변수가 오브젝트 수만큼 존재한다는 의미입니다.

싱글턴 패턴은 ‘어떤 오브젝트가 프로그램에 단 하나만존재해야 하며. 어느 곳에서도 쉽게 접근

가능해야 할 때’ 사용됩니다. 싱글턴 패턴을 사용하면 게임 매니저가 씬에 단 하나만 있게 하고,

어느 곳에서도 게임 매니저에 즉시 접근할 수 있게 만들 수 있습니다.

3 디자인 패턴이란 어떤 문제로 해결하는 데 좋다고 알려진 구조입니다 프로그래머 사이에서 경험적으로 어떤 문제에는 어떤 구조가 좋다

고 공유하는 방법이라고 함 수도 있습니다.

위 코드에서 009 오브젝트는 자신이 생성되고 활성화될 때 쌔가6 ( ) 메서드에 의해 001101: 값을

1 증가시킵니다.

701(」/\\오/31《6() (

001101유;

아나?110 01855 009 : 시이!08아13\\/1001‘ (

|?나〕110 5히’100 (1091481116; // 가|으| 이름

유니3110 네 00001 그 0; // 프로그탬에 존재하는 개의 층 수

P:100

009 009 009

0-1

으 각각의 000 오브젝트에서 001101가 증가

000(11

00001 = 0 “ 1

009 【)09 【)09

(1091네 5 "슈" (109이31116 즈 "하, (109이레16 그 "으"

으 하나의 000(11를 3개의 009가 공유

496 5부 20 러너 게임 : 유니런

I

그림에서 보듯이 009 오브젝트가 3개 있기 때문에 변수 으001도 3개 존재합니다. 601101는 009

의 총 수를 나타내야 합니다. 의도대로라면 아이의 값은 3이 되어야 하지만 현재 각각의 009

오브젝트의 00001 값은 그입니다.

위 구현의 문제점은(:00이가 ‘각 개체의’ 오기라는 겁니다. 위 그림에서 보듯이 “I⑴I기‘ 1 증

가하는 처리는 3번 실행되었지만 3개의 009 오브젝트에서 각각 일어난 일이기 때문에 이기는

3이 되지 않습니다.

00001가 009 오브젝트의 총 수를 나타내기 위해서는 00001가 009 오브젝트마다 하나씩 존재

하면 안 됩니다. 다음 그림과 같이 호이는 단 하나만 존재하고 모든 009 오브젝트가 하나의

(:00이를 공유해야 합니다.

그림에서 보듯이 009 오브젝트가 3개지만 이들이 단 하나의 0(11를 공유하면 어떤 009 오브

젝트가 00001 값을 변경했을 때 다른 009 오브젝트에서 사용하는 00001 값도 같이 변경됩니다.

3개의 009 오브젝트가 각자 00” 값을 1씩 증가시켰지만 사실 하나의 0001를 공유하고 있으

므로 00001 값이 0 ― 1 ― 2 — 3으로 증가하면서 000거:는 3이 됩니다.

(109시리06 즈 ”8“

00001 그 0 ― 1

(100아8016 3 ”0”

0000흐 드 0 ~ 1

(109^3106 그 "슈"

00110흐

P:101

처음 009 예제에서 오”를 정적 변수로 변경하면 다음과 같습니다.

)

)

009X011(11 그 100;

정 리하면, 518110 변수는 다음과 같은 특징이 있습니다.

81311(:의 이 러한 특징은 싱글턴을 구현하는 데도 활용됩니다.

12장 유니런 : 배경 스크몬링과 게임 매니저 497

513110 변수는 해당 클래스와 관련 있지만 개별 오브젝트마다 하나씩 가지고 있는 것보다는

모든 오브젝트가 공유하는 것이 더 나은 값을 표현할 때 사용합니다. 그러한 값의 예로는 직전

까지 살펴봤던 ‘오브젝트의 전체 개수,가 있습니다.

예-::- 들어 009 스크립트 외부에서 009의 000이에 새로운 값 100을 할당하려면 다음과 같은 코

드를 작성합니다.

정석 신언된 변수는 특정 오브젝트에 속하지 않고 같은 타입의 모든 오브젝트가 공유합니다.

따라서 009 클래스 외부에서는 001101 변수를 다음과 같이 클래스 이름과 점 0 ) 연산자를 이용

해 접근합니다.

어떤 변수를 51811(:으로 선언하면 여러 오브젝트가 해당 변수 하나를 공유합니다. 정적 선언된

변수는 해당 타입의 오브젝트를 몇 개를 생성하든 그 수에 상관없이 메모리에 하나만 존재합

니다.

- 메모리에 단 하나만 존재하고 모든 오브젝트가공유합니다.

- 클래스 이름과 점0) 연산자를 이용해 접근할 수 있습니다.

701(1 3수6() (

001101++;

131113110 아.355 009 : 시아100아1871001‘ (

|?나)110 51(*109 (109^31116; // 가|으| 이름

아나)110 101 00001: 그 0; // 프로그램에 존재하는 개의 층 수

P:102

1 2.4.3 63016⑶30396투 스크립트 준비

정적 변수로 싱글턴을 구현하는 방법을살펴본 다음6헤]배8039이’ 스크립트를완성하겠습니다.

먼저 게임 매니저가 될 게임 오브젝트를만들고63111매러1397 스크립트를 열겠습니다.

( 과정 미 ) 게임 매니저 준비

④ 0317161너3039의' 스크립트를 더블 클릭하여 열기

| ①빈 게임 오브젝트 생성 (08319 으 06316 타그유해) |

노브 게임 매니저 준비하기

631116쉬30896드 스크립트를 열면 다음과 같이 구성되어 있습니다.

498 5부 20 러너 게임 소 유니런

나03016 1430히

호 0=614*0그까’

① 빈 게임 오브젝트 생성(06316〉01-6318 도⑴⑴V)

② 생성된 게임 오브젝트의 이름을 63⑴6 히13030의'로 변경

(3)63016^30896^ 스크립트릅 하이어라키 창의

631X)6 1\\?180398(로 드래그8드롭

② 생성된 게임 오브젝트의 이름을

6리『110 시30390(로 변경

④631=3961’ 스크립트튼

더블 클릭하여 열기

③ 프로젝트 창에서 80(1|315 폴더의 68016^/130396스크립트를 하이어라키 창의 68010 1\\/130390|-

로드래그&드롭

II세께으(에

나…)0

0^001

나아8(가)5

0 유0^80

0*0( ’ 흐

V (고노0더10

시11441(쳬:-

시1 (40=5 |

시I 유8=5 6

- 여31하주

, (’11하(1으011도011하

, 5(101110905)((1

'드 8부드드으/

0=( ’

노 사" ―—으 그 —

:- 14110 흐10X13

’ 5(2그 ~하00으

’ 01(1X011(

느 ,- 8x1(9^01*1(1

후 / 0=35

~ 드나015610즈뷰느 가 ^해

―1“

으은그,,

쓰으으느호모뜨

8**000으1000

P:103

드170하6 101 5(:01‘6 드 0; // 게임 점수

0011)

10513006

// 10이:3006에 이미 다른 6301#30396〒 오브젝트가 할당되어 있는 경우

)

)

12장 유니런 : 배경 스크몬링과 게임 매니저 499

)

6156

(

// 게임 시작과 동시에 싱글턴을 구성

701(1 슈?/가《6() (

// 싱글턴 변수 10513006가 비어 있는가?

(10518006

으나)11으 1)001 156811160761’ 그 주3156; // 게임오버 상태

아나〕110 16X1 5《:0(’6!6〉(1; // 점수를 출력할 III 텍스트

하나11!으 630)6아어601 9허06076으01; // 게임오버 시 활성화할 1)1 게임 오브젝트

05109 0011x^^9116;

05109 00117드091(16.50606이3089601601;

05109 0(1117타19106.01;

// 10518006가 비어 있다면(0011) 그곳에 자기 자신을 할당

11115;

// 점수를 증가시키는 메서드

하나)11.0 701(1 /네5(:0〒6(101: 06^500(-6)(

701으 11()(18160 (

// 게임오버 상태에서 게임을 재시작할 수 있게 하는 처리

// 게임오버 상태를 묘헌하고, 게임 점수와 이를 관리하는 게임 매니저

// 씬에는 단 하나의 게임 매니저만 존재할 수 있음

유나)110 이.885 6301614리13961‘ : 11000861137100(

II1)1.10 51:3110 63016^303961’ 10513006; // 싱글턴을 할당할 전역 변수

// 씬에 두 개 이상의 63끼이430397 오브젝트가 존재한다는 으|미

// 싱글턴 오브젝트는 하나만 존재해야 하므로 자신의 게임 오브젝트를 파괴

061)09.109유3띠!09("씬에 두 개 이상의 게임 매니저가 존재합니다!");

06511-0X(99^6063601);

P:104

)

)

I)나)110 518^10 030)6^803961’ 10518006; // 싱글턴을 할당할 전역 변수

10518006 그 0115;

)

)

500 5부 20 러너 게임 : 유니런

6156

10513006에는 68^80896(- 타입 오브젝트의 참조를 할당할 수 있습니다. 그런데 씬에

6에이4리13961‘ 타입의 오브젝트가 100개 존재해도 10813*6는 메모리에 단 하나만 존재하므로

10513006에 할당될 수 있는 68(1)6^303961’ 오브젝트도 단 하나뿐입니다.

6301아180896두 스크립트의 최상단에는 싱글턴 오브젝트를 할당하기 위한 813110 선언된

68111아130396[‘ 타입의 변수 10513006가 있습니다. 새8스6 ( ) 메서드에서는 현재 오브젝트를 싱

글턴 오브젝트로 만들고 1081:30(:0에 할당하는 작업을 실행합니다. 10818*6는 싱글턴이 될

6히16이803901- 오브젝트가 저장될 변수입니다.

5네10으로 선언된 변수는 모든 오브젝트가 공유하는 단 하나의 변수가 됩니다. 이것을 다르

게 생각하면 10518006는 ‘단 하나뿐인 왕좌’라고 생각할 수 있습니다.

061)119.10개리71109("썬에 두 개 이상의 게임 매니저가 존재합니다!");

0651〒07(98*01)으 601);

12.4.4 6301이713039이' 싱글턴 구현

68(1)아430396「에서 싱글턴을 구현한 부분을 먼저 살펴보고 다른 부분을 완성하겠습니다.

701(1 ^8^60 (

11 (105흐8006 = = 0011)

// 들레이어 캐릭터 사망 시 게임오버를 실행하는 메서드

|)나)110 701(1 0아’187이"083(1() (

P:105

1051:3(106 : 자리는하나뿐

으 단 하나의 680161^303901- 오브젝트만이 자신을 10313006 변수에 할당할 수 있다

즉. 싱글턴이 될 6301아'13039이‘ 오브젝트는 스스로를 1051:3006에 할당합니다. 이 과정은 비어

있는 왕좌를 경쟁적으로 차지하려는 과정으로 비유할수 있습니다.

쎄31〈6 ( ) 메서드의 고 문 블록에서는 1=13X6가 비어 있다면 그곳에 자기 자신을 할당합니다.

1주 (105하3006 11011)

10513006 나)!5;

빈'약 105130(:0의 값이 0011이라면 I가5130(:6에 아직 어떠한 6301애1803061” 타입의 오브젝트도

함당되지 않은 상태입니다. 따라서 현재 쎄가6( ) 메서드를 실행하고 있는 63^303961- 오브

젝트가 나115를 10518X6에 할당하여 스스로를 10513006에 할당합니다. 나)!8는 오브젝트가 자

기 자신을 가리키는 키워드로서 스스로에 대한 참조값이 출력됩니다.

이렇게 105130(:6에 할당된 63010이30306드 오브젝트는 63(0아48039이-.105130(:6로 즉시 접근할 수

있습니다.

68(116사80896드 타입의 오브젝트는 씬에 단 하나만 존재해야 합니다. 어떠한 이유로 68⑴6시80896으

오브젝트가 둘 이상 존재하는 경우 싱글턴이 된 63016^130396(- 오브젝트 하나만 남기고 나머지

68(110|‘1803961’ 오브젝트는 모두 파괴해야 합니다.

이어지는 이요 문 블록은 10813006가 0나II이 아닌 경우에 실행됩니다. 즉. 자신이 아닌 다른

63016시80396즈 오브젝트가 1(1518*6에 이미 할당된 경우입니다.

12장 유니런 : 배경 스크보링과 게임 매니저 5이

68010^80396(’ 우버젝,타

63016^30898(’

오브젝트

63010이30306하 오브젝트

스스루른

105=106에 합당

10513006으| ‘빈자리’가 채워지 있다언

다믄 오브젝트9 함당함 수 없음

P:106

01111)

10518006 그 나115;

)

이 경우 경고 로그를 출력하고 싱글턴이 될 수 없는 자신의 게임 오브젝트를 06510^() 메서

드로 파괴했습니다. 위 코드의 처리 과정은 아래의 그림으로 이해할수 있습니다.

1051허1(:6

느 스스로 파괴돠는 두 번때 6&016^308961- 오브%

12.4.5 63111이^3039아'의 필드

싱글턴 구현 부분을 살펴봤으니 이제 6히!아130396「의 다른 변수들을 살펴보고 나머지 메서드를

완성합시다.

()1-1731:6 101 500(-6 드 0; // 게임 점수

502 5부 20 러너 게임 : 유니런

)

6156

I조 (10518006

(

V V

(1 스스로프 파괴함

싱글턴을 위한 변수 10518006 이외의 다른 변수들은 다음과 같습니다.

하나)110 1)001 1563*076흐 드 주기56; // 게임오버 상태

1301)110 16X1 500(-816X1; // 점수물 출력할 01 텍스트

아051!으 68띠80비601 93^6076(-01; // 게임오버 시 활성화할 01 게임 오브젝트

0아)09.109*^0109("씬에 두 개 이상의 게임 매니저가 존재합니다!‘');

0651 (⑴오(981116아) 60흐);

(2)105180063 이미 다른

08016사3089“가 차지하고 있음 \\ 서 /

68(%시30390

오브젝트

①스스로0

1051300609 할앙

P:107

115109 0(111오타19106 .50611이4808960)601;

그러면 부예6 ( ) 메서드를 완성하겠습니다.

1

12장 유니런 : 배경 스크모링과 게임 매니저 503

게임오버 상태에서 마우스 왼쪽 버튼을 누르면 누 문 블록 코드가 실행되고 현재 활성화된 씬

을 다시 로드하여 게임을 재시작합니다.

먼저 문으로 15680160761'가 하때으인지 확인하여 게임오버 상태인지 확인합니다. 동시에

I이)01.66하1005680110000*70 (0)을 검사하여 마우스 왼쪽 버튼을 눌렀는지도 확인합니다.

게임 새시작은 현재 활성화된 씬을 다시 로드하는 방식으로 구현할 수 있다고 했습니다. 따라서

씬 관리자 5^0아13=96「가 필요하므로 스크립트 상단에 다음과 같은 선언을 미리 추가해두었

습니다.

701(1 11|3(!31:6() (

I주 (1568018076^ && I기)으68하4011568111브00【)01사0(0))

’ 1563016076흐 : 게임오버 상태

- 5으0!’61‘6〉《1 : 점수를 출력할 III 텍스트 컴포넌트에 대한 참조

- 98*07701 : 게임오버 시 활성화할 1)1 게임 오브젝트에 대한 참조

- 500(-6 : 현재 게임 점수

12.4.6 63끼기\\/13039아으I 09어316( ) 메서드

이제 6301이130897 스크립트의 나3쎼6( ) 메서드에서 게임오버 상태일 때 게임을 재시작하는

기능을 만듭니다. 게임오버 상태는 1568*0“라‘의 값으로 알 수 있습니다.

스; 91) 0|36316( ) 메서드 완성하기

1 68(11이130396도 스스크립트의 0이316 ( ) 메서드를 다음과 같이 완성

// 게임오버 상태에서 마우스 왼쪽 버튼을 클릭하면 현재 썬 재시작

50606유803961’노103(150606(50606유303961^681슈(:흐!7650600().03⑴으);

P:108

8060아1803961-.10=0606(5060아》396다.66히170506060폐”6);

,,500!‘8 : '’ + 5001’6;

이어서 8(:01‘6 += 500도6 +=

06?6(:01‘6;는 5001*6

500도616X1.16X1: ”500(-6 : '’

504 5부 20 러너 게임 소 유니런

여기서 3(1606시30890으.66타노117650606 ()은 현재 활성화된 씬의 정보를 36606 타입의 오버-젝

트로 가져오는 메서드입니다. 그리고 50006 타입의 오브젝트는 씬의 이름을 변수 08(116으로 제

공합니다. 즉. 5으606시30396으.601슈6117650606 으).031116은 현재 씬의 이름을 가져온 겁니다.

그렇게 가져온 현재 씬의 이름을 50606시80890.103(1506*() 메서드에 입력하여 현재 씬을 다

시 로드했습니다.

먼저 푸 ( !156301607이‘)를 사용해 게임오버가 아닌 상태에서만 점수를 추가하도록 했습니다.

게임오버인 상태에서는 어떠한 상황에서도 점수가 증가하면 안 됩니다.

06?/5(:이‘6;를 이용해 아이를 06유5(:0우6만큼 증가시켰습니다.

듀6?6(2이'6;의 단축형입니다.

1 2.4.7 (3301이\\/13039아'의 71*8001*6() 메서드

점수를추가하는^(1(1500^6 ( ) 메서드를 구현합니다. 쎄5(:0드6 ( ) 메서드는 입력으로 추가할 점

수를 받아 입력된 값만큼 점수를 증가시키고. 점수 III 텍스트에 출력되는 점수를 갱신힙니다.

마지막으로 그 ”5001‘6 : '’ + 5히;에서는 8001‘6 70X1 게임 오브젝트의

70X1 컴포넌트의 76X1 필드인 2001‘6!6오베6)(1의 값을 "요아’6 : ” + 5(:이'’6로 변경합니다. 이

|; 과정 미 ;| ^(1(18001-6 (1 메서드 완성하71

① 6하0애30396(~ 스크립트의 세5001’6( ) 메서드를 다음과 같이 완성

// 점수를 증가

5001’6 += 0이소500〒6;

그 5(:01"& +

|)1』1)110 701(1 08?600드0)(

// 게잉오버가 아니라면

I주 (!1863!060761’)

P:109

로써 점수가 추가될 때마다 50016 “XI 게임 오브젝트의 70X1 컴포넌트는 갱신된 점수를 출

력합니다.

1 2.4.8 63지!이VI3039아'으I 00^1376^63^() 메서드

플레이어가 사망했을 때 실행할 처리를 구현하는 0가’13X6피63거 ( ) 메서드를 완성합니다. 플레

이어가 사망하면 게임오버 상태가 되며 게임오버 ⑴가활성화되어야 합니다.

〔 고^정 01) 00^01-003(1 () 메서드 완성하71

① 630)이130896두 스크립트의 00?13오6도063(1 ( ) 메서드를 다음과 같이 완성

)

이로씨 0「1?13우이’063거 ( ) 메서드가 실행될 때 1563111607이-가 바-116가 되며. 9811160761’01에 할당

된 0311^0X^61- 76X( 게임 오브젝트가 활성화됩니다.

1 2.4.9 6317101\\/13039아' 스크립트의 전체 코드

이것으로 63111이’130890즈 스크립트 작성을 완료했습니다. 63끼#30396!‘ 스크립트의 전체 코드는

다음과 같습니다.

12장 유니런 : 배경 스크5링과 게임 매니저 505

05109 00117^9106;

05109 00117드09고06.50606에8089610601:;

05109 00117드09106.01;

1)06110 1)001 1563016078(- 그 두8156; // 게임오버 상태

|?나)110 16X1 5001*616X1; // 점수를 출력할 01 텍스트

유니3110 681116아)1601 9하116076도01; // 게임오버 시 팔성화할 01 게임 오브젝트

// 게임오버 상태를 표현하고, 게임 점수와 이를 관리하는 게임 매니저

// 씬에는 단 하나의 게임 매니저만 존재할 수 있음

다나)110 01355 6311161-130396(‘ : 이0008아1371001” (

|?나31:10 513흐10 68010에30396드 10513006; // 싱글턴을 할당할 전역 변수

|)니)110 701(1 0(1?18아61’1)6311 0 (

186311)60761’ 그 타'08;

93(1160761‘111,561/\\01:176 (^06);

P:110

?1*17816 101 5001-6 그 0; // 게임 점수

01111)

// 10513*6에 이미 다른 69피아13089아‘ 오브젝트가 할당되어 있는 겅우

)

)

)

)

5001-616X1.16X1:

)

506 5부 20 러너 게임 : 유니런

)

6158

// 게임 시작과 동시에 싱글턴을 구성

701(1 ^8^60 (

// 싱글턴 변수 10513X6가 비어 있는가?

II (10513008

(

// 씬에 두 개 이상의 63이하43039아‘ 오브젝트가 존재한다는 의미

// 싱글턴 오브젝트는 하나만 즌재해야 하므로 자신의 게임 오브젝트를 파괴

1)61)09.109*81⑴109("썬에 두 개 이상의 게임 매니저가 존재합니다!");

0851 (93끼80이601);

// 점수를 증가

500(’6 += 00600〒6;

”500^6 : '‘ + 5001’6;

701(1 10)(131.6() (

1후 (1563*076드 8& 10^)01.661시008680110000^(0))

// 플레이어 캐릭터 사망 시 게임오버를 실행하는 메서드

데비.10 701(1 00?13사아0예0 (

// 게임오버 상태에서 마우스 왼쪽 버튼을 클릭하면 현재 씬 재시작

50606유30896드.103(150606 (5우0이누0396후.661사0117650606().08016 );

// 점수를 증가시키는 메서드

유나)110 701(1 06*600^5)(

// 게임오버가 아니라면

I도 (!1868016076^)

(

// 10513X6가 비어 있다면(0011) 그곳에 자기 자신을 할당

10818006 그 나115;

P:111

)

)

63111아13089“ 스크립트를 제대로 작성했는지 확인하고 드011’1부81로 스크립트를 저장합니다.

12.4.10 I기3우아'0이기후011아' 스크립트 수정

6301하130390드의 게임오버 기능인 0가’18X61-063(1 ( )를 알맞은 시점에 실행하려면

스크립트에 간단한 수정이 필요합니다.

00^137이’0히( ) 메서드는 플레이어가 사망할 때 실행되므로 ?13아6두으001드0116즈 스크립트의

016() 메서드에서 실행되어야 합니다. 따라서 우1376으0011-0116[’ 스크립트의 016 ( ) 메서드를

수정합니다.

소 ; ) 가37이우이!하이10「스크립트 수정하기

?1376^0011’01161- 스크립트를 열고 016 ( ) 메서드를 다음과 같이 수정

15063(1

12장 유니런 : 배경 스크모링과 게임 매니저 507

(‘1731:6 701(1 0160 (

// 애니메이터의 016 트리거 파라미터를 셋

80101810드.5611’(‘1996드(,1)!6,1);

// 오디오 소스에 할당된 오디오 클립을 쎠3나)(:!구으로 변경

으13,61'슈!」(110.0111) 그 (168하1(:1!|);

// 사망 효과음 재생

아18,61’규11010,?1370;

// 속도를 제로(0,0)로 변경

|)13오6드1느9고아〕0(슈유7610(:117 그 \\/6010(‘2,281‘0;

// 사망 상태를 하"로 변경

타‘06;

// 게임 매니저의 게임오버 처리 실행

08111애3(13961구1051300아’13오61’088(1();

// 현재 상태글 게임오버 상태로 변경

1568016076(’ 그

// 게임오버 01를 할성화

9311160761-01

P:112

)

)

지금까지 수정한 스크립트들을【0여+81로 저장하고 유니티 에디터 창으로 돌아갑니다.

508 5부 20 러너 거임 : 유니런

수정된 유13,61으001(*011"의 016() 메서드는 씬의 6히116시30990도 오브젝트에 접근해

0^13^61-068(1() 메서드를 사용합니다. 이제 플레이어 캐릭터가 죽는 순간 게임오버 처리가

실행됩니다.

여기서 씬에 유일하게 존재하는 63111아130396도 오브젝트로 접근하는 데 싱글턴 변수 6801=3089아‘.

10513006를 사용했음에 주목합니다.

1 2.4.1 2 (3301이\\/1303901” 컴포넌트 설정하기

03010 조'13113응。게임 오브젝트의 6301이430396도 컴포넌트의 필드를 설정합니다.

(!631116시30890(‘느05130(:6느56311160701‘)로 게임오버가 아닌 동인에만 평행이동하도록 코

드를 수정했습니다. 이번에도 6811)6시80896드.111518⑴:6로 씬의 63(11이48039하 오브젝트에 손쉽게

접근했다는 사실에 주목합니다.

// 초당 51)66(1의 속도로 왼쪽으로 평행이동

1(’305조001!/「1‘30513흐8(76010(*3.1651 # 5하66(1 부 1111)6.1161^3111116);

12.4.11 80^0111090^601 스크립트 수정

게임오버인 상태에서는 움직이던 발판과 배경이 멈춰야 합니다. 6301애허139이‘의 변수 1563*077

가 게임오버 상태를 나타내고 있으므로 5(:즈011109아)]6더 스크립트에서 63피#80896도의

1563*07이‘를 검사하여 움직임 여부를 결정하면 됩니다.

〔 과정 이 ) 501-01110901))601 스크립트 수정하기

① 50(-01110901)3804 스크립트를 열고 0^816() 메서드를 다음과 같이 수정

()1*17816 701(1 0|)(181:60 (

// 게임오버가 아니라면

II (!63106^30896(‘,10513006.156308076[’)

P:113

|; 과정 01 1 6허116시3039라’ 컴포넌트 설정하기

’--즈-. "’

- - 스5 03^80^81 으

,: 030180^^78X1 3:

으 03(11이\\/13039의' 컴포넌트 설정하기

위 과정에서 8(201 70X1 게임 오브젝트와 020100우61‘ 7오XI 게임 오브젝트는 0(0\\기5 게임

오브젝트의 자식에서 찾을 수 있습니다.

이것으로 게임 매니저 구현이 끝났습니다. 플레이 버튼을 눌러 씬을 테스트해봅니다.

플레이어 캐릭터가 낙사하면 게임오버 ⑴가 활성화되며 더 이상 배경이나 발판이 움직이지 않

는 것을 확인할 수 있습니다. 게임오버 상태에서 마우스 왼쪽 버튼을 누르면 게임이 다시 시작

됩니다.

12장 유니런 : 배깅 스크고링과 게임 매니저 509

① 하이어라키 창에서 63010^803961-

게임 오브젝트 선택

③ 하이어라키 창의 6301007이' 76X1 게임 오브젝트를 68016^803961‘ 컴포넌트의 63019070흐 III 필드

로 드래그여드롭

① 하이어라키 창에서 03끼이니3080아' 게임 오브젝트 선택

② 하이어라키 창의 8001-9 70X1 게임 오브젝트를 68(11아!80896도 컴포넌트의 8001*6 16X1 필드로 드래

그&드롭

500?? 74X4 -. 으

0—V# 01

01

-

애이

오;으01(

서30390

’―~

—~

739 | 0111899해 누 어 1^70’ [‘07*111

느 X、

V 브.' &1631X1( 어3030흐!‘ (5010()

, 으 스 03016^1303961’

"' 느 ; | 500프 7^x( (18X()

'스

③0301607이 16X1 게임 오브젝트-를

680100701’ 01 필드로 드래그&드롭

| 0513110 '’’

61 겨 휴

6 고흐

②80(X9 16X1 게임 오브젝트로 80(X6 18X(

필드로 드래그&드롭

( :3사|

하… - ’

': 으) 서고0

서41(1 0꾸(1*3

514구 1*141(01*11)

03(120110

으14오4『

8.^(^9^00011

(:40、/35호

5흐%들과〜

‘ ’'누아하프시 뉴-、- , ’

7*6X( -~

다?065(801

P:114

느 게임 매니저 테스트하기

12.5 마치며

이 장에서 배운 내용 요약

510 5부 20 러너 게잉 : 유니런

이것으로 움직이는 배경과 발판. VI와 게임 매니저까지 모두 완성했습니다. 플레이 모드를 해

제하고【0어+81로 씬을 저장합니다.

이 장에서는 배경과 발관을 지속적으로 움직이고. 배경을 반복하는 방법을 배웠습니다. 게임

⑴를구성하면서 다양한 크기와 비율의 화면에서 의도한 미의 모습을 유지하는 방법도 배웠습

니다. 그리고 싱글턴을 사용하여 게임 매니저를 구현했습니다.

다음 장에서는 발관 프리갭과 장애물을 구성하고. 발판을 무한 반복 배치하는 기능을 만들어

게임을완성합니다.

- 20 게임 오브젝트를 그리는 순서는 정릴 레이어로 조정합니다.

- 캔버스 스케일러 컴포넌트의 스케일 모드는 다양한 화면 크기에 대해 캔버스의 크기가 어떻게 변경될지 결

정합니다.

P:115

12장 유니런 : 배경 스크잔링과 게임 매니저 511

- 513116으로 선언된 정적 변수는 하나의 변수를 여러 오브젝트가 공유하는 방식으로 동작합니다.

- 정적 변수는 클래스 이름과 점 연산자를 이용해서 접근합니다.

- 싱글턴 패턴은 ‘단 하나만 존재해야 하며. 손쉽게 접근 가능한’ 오브젝트를 구현하는 디자인 패턴입니다.

- ‘고정 픽셀 크기, 모드에서는 화면 크기가 달라져도 01 요소의 크기는 달라지지 않습니다.

- ‘고정 픽셀 크기’ 모드에서는 화면의 크기가 커졌을 때 01가 상대적으로 작게 보이는 문제가 있습니다.

- ‘화면 크기에 따른 스케일' 모드에서는 기준 해상도를 정하고. 게임 화면 크기에 맞춰 캔버스를 확대/축소하

는 방식으로 동작합니다.

- ‘화면 크기에 따른 스케일, 모드에서는 다양한 크기와 비율의 화면에서도 기준 해상도에서의 III 모습을 최

대한유지할 수 있습니다.

P:118

이 장에서 다루는 내용

13.1 발판만들기

514 5부 20 러너 게임 : 유니런

이 장에서는 발판을 만들고. 발판을 반복 생성하는 발판 생성기를 만듭니다. 그리고 게임을 완

성하고 빌드합니다.

시작 지점의 발판과 달리 일반 발판은 밟는 순간 점수가 증가합니다. 일반 발판 위에는 장애물

이 랜덤 생성됩니다. 발판을 만들고 나면 발판 생성기를 만듭니다. 발판 생성기는 발판을 매번

새로 생성하는 대신 미리 만들어진 발판 게임 오브젝트를 재활용하는 방식으로 메모리를 아낍

니다.

현재 씬에는 시작 지점의 발판인 81311 I기지!'0011 게임 오브젝트만 있습니다. 81지I

게임 오브젝트에는 별다른 기능이 없습니다. 하지만 시작 지점 이후의 일반 발판은 픈데이어

캐릭터가 밟을 경우 점수가 올라가는 기능과 발판 위에 장애물을 생성하는 기능을 가집니다.

발판 위에 장애물을 배치하는 시간을 아끼기 위해 발판의 초안은 저자가 프리팹으로 미 리 만들

어두었습니다. 발관 프리갭을 편집할 수 있도록 씬에 추가합니다.

으 발판 구현

으00타)31)16() 메서드

- 발판 생성기 구현

오 오브젝트 풀링

- 미리 생성된 발판을 재사용하는 방법

〔 과정 이 ) 가3호0따! 프리팹 배치하기 (1)

① 드『6(365 폴더에서 I기3바이'01 프리팝을 하이어라키 창으로 드래그유드롭

② 생성된 I가그보이!!! 게임 오브젝트의 8아16 컴포넌트의 8이비09 노히를 드(가'아!'아」0어

로 변경

P:119

1 ―1

'호자; ’

즈그!빈의끄

;:?:어21|0오01

.—1

스 우13하이711 프리팝 배치하기(1)

‘32)기아아’⑴프리팹 배치하기 (2)

;?‘ 자식들의 813016 06*61'이' 컴포넌트의 8이1)09 느3우61'를 1이101에애우니즈로 변경

1—

13아8흐 | 0*^011

1**01)1(3010

흐 I기3110011 프리팹 배치하기(2)

13장 유니런 : 반판 반복 생성과 게임 완성 515

(、100흐

( 0—?

[기3((0071 게임 오브젝트의 자식들(013313이6 1%유. 0=13이6 조/1!여,(가3813이0 I가하1흐)을【81기유+

클릭]으로 모두 선택

①미81(0”의 자식들을【5내버클릭]으로

모두 선택

0사 0?

나예히느/카||(

I 5101으!0 '— '

............................ 스….그그|

‘ —") 0513110 ’” ’

② I기기(0까 게임 오브젝트의 8(X1109

1376으&으로변경

5고프 3폭"코

이 고녀 I '…' !

| ②3071)00 13761~5 유11여에69(’000(1로 변경 |

‘IX 81""다!V

’ 0(1(( ’ I —스 우’사느”

스—규]

; 051111( 흐 :

X\\

① 031(0011 프리팝을 하이어라키 창으로

드래그8드롭

'(”0 10와60(0드 주

누-하 흐 [(’|3휴의III

139 I 0"뉴90해 『1 13/61- ;’ 08스#

아(우6 | 0;10 | ‘5*1*0 | ! 아"0

으코보 으고소 @ 거유

I 50(1109 13X0’

0^81,1(1히’

서3)1( 111(0^30100 I

5휴(1(0 50호 유010( I

느 V 호80노(:0||1(181’ 20

토교호

더 고 흐、

0우 0우

; 05(X100하호반5

| 5;01이;

때 그나06^*1유

나 0551311? 서나

네 0()유;16스 X)으느I

으…」 |

가@10 - '으’사 ’

스0 시기0‘

유131)1 (231110

어3(10(0)

063(12000

이2아0’

흐 38(1(9^0011(1

으 030*35

트"아⑤히

03016 쉬3030(1’

\\ 1 이3네0으01

0 105()(010으

&

139 ! 0^으

—그—1~008?0011

V 으:1251)1’|10 유(11(1흐1’0’

5하1’1:8

히“ (

디10 I

서3(6다31

어0(1( (

V ⑶ ^310’ —

휴3(0 03018^3

5(3구 I이3하이’01

0(3(120116

이3우8도

드 8301(9(-0006

느 으30노35

—으아이히가

0201흐 &4311390으

| 50^109 13아흐오 (,흐3후8으0짜『

01-(10-10 13X0’ : 0

어311( 10(00X100 | 사008

5^^116 50하 ?0,01 | 으0(하

느 0 6180뉴 00111(1하’ 20

수 스 655느도0,1100 01^*61 (501하1)

스 ’‘ (고I유||타이’01 (5(어이)

두 브.' 535(*1118 1181X18^01’

5이하

0)1아' (

디10 (

어3=131

0^1^ 에0유 〔

P:120

13.1.1 I기3휴아'⑴ 스크립트

기31(01'⑴ 스크립트 적용하기

열린 미게0때 스크립트는 다음과 같은 모습입니다.

05109 0(111오타191(16;

)

516 5부 20 러너 게임 : 유니런

장애물 게임 오브젝트는 배경보다는 앞에. 플레이어 캐릭터와 발판보다는 뒤에 그려지도록 정

렬 레이어를 !#!이6옹。10(:1로 변경했습니다.

또한 장애물 게임 오브젝트는 모두 트리거로 설정된 박스 콜라이더 20를 가지고 있으며.

063(3 태그를 가지고 있습니다. 따라서 플레이어 캐릭터는 발판 위의 장애물에 닿는즉시 사망

합니다.

발판은 플레이어 캐릭터가 자신을 밟으면 게임 점수를 증가시켜야 합니다. 또한 자신의 장애물

게임 오브젝트를 일정한 확률로 활성화해야 합니다.

해당 기능을 구현하는 미8부0께 스크립트를 I가3나’0「01 게임 오브젝트에 추가하고 아1에07 스

크립트를 완성해봅시다.

I기가10011 프리팹으로부터 생성한 게임 오브젝트는 박스 콜라이더 20, 스프라이트

렌더러. 8(X011108(기후⑦ 스크립트를 가지고 있습니다. 자식으로는 장애물 게임 오브젝트를

3개(013813이스 으!이’11. 01)81:1(:10 초'14이. 01)5(3016 1바'() 가지고 있습니다.

〔과정 01)

① 80다가5 폴더에서 유13부0께 스크립트를 하이어라키 창의 두13유이'01 게임 오브젝트로 드래그우드롭

② 이3부000 스크립트를 더블 클릭으로 열기

// 발판으로서 길오한 동작을 담은 스크립트

()나》110 01355 ?13냐이‘01 : ^000861)87100(‘ (

1)01)110 63(116아어60타] 01)8180165; // 장애물 오브젝트들

휴1*178(6 1)001 516|우6(1 그 주3186; // 플레이어 캐릭터가 밟았는가

// 컴포넌트가 활성화될 때마다 마!번 실행되는 메서드

하1*17816 701(1 00타)31)160 (

// 발판을 리셋하는 처리

P:121

먼저 이8부0때 스크립트의 변수를 살펴봅시다.

아)요3(:168는 1^13^0011 게임 오브젝트의 자식으로 있는 장애물 게임 오브젝트를 할당할 변수

입니다. 여러 장애물 게임 오브젝트를 한 번에 다룰 수 있도록 배열 타입으로 선언했습니다.

510아)6(1는 플레이어 캐릭터가 자신을 이미 밟았는지 알려주는상태 변수입니다. 516이)601의 초

깃값은 주8156입니다. 플레이어가 발판을 밟으면 외:6이?6(1는 바’06가 됩니다.

816푸해를 사용해 발판을 중복해서 밟았을 때 점수가 반복 상승되는 것을 막을수 있습니다.

I기게아'01의 0(기타13미@() 메서드

I시311=0때 스크립트의 아]타181)16 ( ) 메서드를 완성합니다.

00타!가)16() 메서드는 %가6()나 513「1() 같은 유니티 이벤트 메서드입니다. 5131거:() 메

시드처럼 컴포넌트가 활성화될 때 자동으로 한 번 실행됩니다. 하지만 처음 한 번만 실행되는

513「1 ( ) 메서드와 달리 00^31)16 ( ) 메서드는 컴포넌트가활성화될 때마다 매번 다시 실행됩니

다. 따라서 야1타!캐16 ( ) 메서드는 컴포넌트를 끄고 다시 켜는 방식으로 재실행할 수 있습니다.

&?67주" ―」

허3110가11 |’|3((0071

누 00드03비6()이 실행되는 순간

13장 유니런 : 발판 반복 생성과 게임 완성 517

게임 도중에 꼬고 다시 켜는 방식으로

00타131)16 ( ) 메서드 반복 실앵 가능

아나3110 631116(가)]6(:히] 0651:3(:165;

|?(‘1781:0 1)001 516이?6(1 드 『31.56;

701(1 0(1(:01118100타116〒20((:0111510021) 001.115100)(

// 플레이어 캐릭터가 자신을 밟았을 때 점수-를 추가하는 처리

컴포넌트가 황성화될 때 해당 컴포넌트의

00터31)16() 메서드가 실앵됨

V 으(03》18하0170 (50’1이)—

오이이 I

느 06X(3(165

V히》|3규01’111 (유볘'

흐 01)5131185

후 06513(1(5

P:122

0)

01)513(: 165므구861슈01176 (하‘06);

055180185^1.561^01176(^8136);

)

518 5부 20 러너 게임 - 유니런

6156

(

우리는 00타19616() 메서드에 발판을 리셋하는 코드를 넣을 겁니다. 그리고 리셋이 필요할 때

마다 발판 게임 오브젝트를 끄고 다시 켤 겁니다.

게임 오브젝트가 활성히/비활성화되면 게임 오브젝트의 모든 컴포넌트도 함께 활성화/비활성

화됩니다. 따라서 개별 컴포넌트를 끄고 켜지 않고 게임 오브젝트를 끄고 켜는 방식으로 컴포

넌트의 00타]81316 ( ) 메서드를 재실행하는 것도 가능합니다.

00타181)16() 메서드는 게임 오브젝트가 활성화될 때마다 상태를 리셋하는 기능을 구현할 때

주로 이용됩니다. 00타18610()에 초기화 코드를 넣어두고. 게임 오브젝트의 정보를 리셋해야

할 때마다 게임 오브젝트를 끄고 다시 켜는 방식으로 활용합니다.

// 장애물의 수만큼 루프

|0드 (101 1 = 0; 1 스 01)5130185.1609하’; 1++)

(

// 현재 순번의 장애물을 1/3의 확률로 활성화

11 (1^30(1010.^31196(0^ 3)

(

|;과정 이 ) "하이'⑴ 스크립트의 00타13비8 () 완성하71

① 이3하이10 스크립트의 005(18516 ( ) 메서드를 다음과 같이 완성

그럼 ?18부0때 스크립트의 00타13^16() 메서드에 발판의 상태를 리셋하는 초기화를 구현해봅

시다.

^1-17816 7016 0【1타13느16() (

// 밟힘 상태를 리셋

516하|)6(1 드 주8156;

P:123

작성한 코드를 살펴봅시다. 먼저 밟힘 상태 516야?해를『8156로 초기화합니다.

516[가)6(너 그 『3186;

이어지는 주이‘ 문에서는 각각의 장애물 게임 오브젝트를 1/3의 확률로 활성화합니다.

^0(‘ (101 I 드 0; I 으 01)5130165.1609바1; 고4부)

(유800)0(11.)81196(0으 3) 0)

01)51:3(:165[고].561/1(:11760x1)6);

6156

01381:30165[고].561슈(:11760:8156);

)

/01‘ (101 1 = 0; 1 아)513(:165.1609바); 고누0를 사용해 순번 1를 0부터 시작해 장애물 수

01)51:3(:165.1609나!에 도달하기 전까지 1씩 증가시키며 루프를 돕니다.

조이‘ 문 블록에서는 이3818(:165 배열에 있는 장애물 게임 오브젝트들을 순번 1를 사용해 순서대

로 접근하고 각각 1/3의 확률로 활성화합니다.

II (유30(1001우8096(0,3) 0)

01)518(:165[:니.581:슈01176(1016);

6156

01)5180165(11,561/\\01176(1:8156);

유80거이!!.우3096(0,3)은 0,1,2 중에서 한 숫자를 랜덤으로 반환합니다. 따라서 유30거0⑴.

으3096(0, 3)의 반환값이 0일 확률은 1/3입니다. 즉, 아)518(:168(;1고561:/\\(:1:176(11’1」6);가

13장 유니런 : 반판 반복 생성과 게임 완성 519

P:124

13.1,3 두기게(가'이의 0야0이118100타거:0흐20( ) 메서드

11(001.115100,00111(161‘.139

)

누 문 블록 내부에서는 점수를 추가하는 처리를 구현합니다.

520 5부 20 러너 게임 : 유니런

00(:01118100타11:720() 메서드에 플레이어 캐릭터를 감지하고 점수를 추가하는 코드를 작성

해봅시다.

실행되어 해당 장애물 게임 오브젝트가 활성화될 확률은 1/3입니다. 반대로 아3513(:168[기.

561슈01176 0=8186);가 실행되어 해당 장애물 게임 오브젝트가 비활성화될 확률은 2/3입니다.

이것으로 발판을 리셋하는 아1타131)16() 메서드를 완성했습니다. 이제 발판 게임 오브젝트가

비활성화된 후 다시 활성화될 때마다 밟힘 상태가 리셋되고 활성화될 장애물 수가 랜덤하게 변

경될 겁니다.

플레이어 캐릭터가 새로운 발판을 밟을 때마다 점수가 상승합니다. 플레이어 캐릭터가 가진

20 콜라이더와 발판의 20 콜라이더 간의 충돌은00^111510(1^161-20 () 메서드로 감지할수

있습니다.

작성한 코드를 봅시다. 먼저 푸 문에서 충돌한 상대방 게임 오브젝트의 태그가 이며.

!516유6(1이 참인지 검사합니다. 따라서 플레이어 캐릭터가 같은 발판을 두 번 이상 빏았을 때

점수가중복상승하는상황이 발생하지 않습니다.

〔 과정 이 ) 이3110”스크립트의 00601115100^(81-20() 메서드 완성하기

① ?18하000 스크립트의 00(201115100테"20() 메서드를 다음과 같이 완성

701(1 00001115100^11161-20(00111510020 001115100)|

// 충돌한 상대방의 태그가 이37이‘이고 이전에 플레이어 캐릭터가 밞지 않았다면

"아.8X61''’ 8& !516까6(1)

// 점수를 추가하고 밟힘 상태를 참으로 변경

5하6유|)6(1 그 11*06;

6306^808981‘,10513006

P:125

먼저 516이)해를 비기6로 갱신하여 이후에 같은 발판을 다시 밟았을 때 펴 문 블록이 실행되지 않

도록 막습니다. 그리고 게임 매니저를 싱글턴으로 접근하여 ^68^2 ( ) 메서드를 실행해 점수

를 1점추가합니다.

13.1,4 I가게(가'111 스크립트의 전체 코드

아1311=0때 스크립트를 완성했습니다. 완성된 유181주0때 스크립트의 전체 코드는 다음과같습니다.

05109 0011x^9106;

0)

01)51:3(: 165[:11.561^(:1:1760:1-116);

6156

01)518(: 165 [코].56하\\(너176(1:8156);

)

)

13장 유니런 : 발판 반복 생성과 게임 완성 521

// 장애물의 수만큼 루프

주0드 (101: 1 = 0;! 스 01)513(:165.1609나1; 1나)

// 현재 순번의 장애물을 1/3의 학률-로 팔성화

1^ (유30(1011)유31196(0,3)

51:6|3|36(1 그 1|”1』6;

63016씨30396드.111513006.^1165001-6 (1);

// 발판으로서 필요한 동작을 담은 스크립트

(301)110 01358 (가고버누이-⑴ : ^000061137100!’ (

|)나)110 68(116아〕]0(:10 아)51*162; // 장애물 오브젝트들

1)1*17316 1)001 516⑷6으 그 1=9156; // 플레이어 캐릭터가 밟았는가

// 컴포넌트가 활성화될 때마다 매번 실행되는 메서드

()1‘1781:6 701(1 0(1타181)16() (

// 밟힘 상태를 리셋

5흐6|꾸6어 그『3156;

P:126

)

)

완성된 스크립트를 [으러누8드로 저장하고 유니티 에디터로 돌아갑니다.

13.1,5 [기31101711 컴포넌트 설정하기

완성된 ?13버01111 컴포넌트를 설정합니다.

〔 과정 이 ;| 미8아071 컴포넌트 설정하기

① 하이어라키 창에서 기3뉴이171 게임 오브% 선택

② I기아0따 컴포넌트의 0=1*165 필드 펼치기〉8)28를 3으로 변경

③ 0으5|3이68에 013513이6 (가3813이6 10)(1 01)513제6 ^19111 할당

0 10(()*0101

00*0 5**1

7x1x10페

주〜

으 이3유4X01 컴포넌트 설정하기

522 5부 20 러너 게임 : 유니런

// 점수를 추가하고, 밟힘 상태를 참으로 변경

516유6(1 그 1016;

63106사803961-.10518006,사에5(:0!‘6(!);

③06813(:165에 003(3016 18유. 01)818016

01)518010 무911! 할당

’ 01)513X16 16(1

,/ 01)513(16 어1(1

01)513(1( 1119(11

I—-

브 8 부브으뜨— :

7*9(0x1*99*0

아하16 호

V)I하"〔 0사흐느

그 10#0#『

반으으띄인브^

븟으뜨으야세

드 바!6(‘3!‘다누

으르브 ’

;,오148|0‘

,; 세10 0=(도—

500 1*11(10('끄

: 063(120116

노 / 8201(9^01111(1

느 :'030735

’&헤

,: 08018 어308961’

6 고흐.

이 고혹 5포흐 요도호

조그조0 :

(2)005130168 필드 필치기〉

&2&를 3으로 변경

으 흐、

흐.?.'85휴|브르 —히"" 1 브 느 88으 0*10느" 20 ; 브%호으쁴뜨으브뜨즈뜻으으

〒~『헤죠구호구6

5(6기

하5535

이가

08—1 0

0001(0: 1

0001(01 2

I ①머서0⑴1 거;임 오브젝트 선로'

701(1 0(1으01115100타1161’20((:0111210112【) 001115100)(

// 충돌한 상대방의 태그가 이카"이고 이전에 플레이어 캐릭터가 밟지 않았다면

I조 (0011151()0.00111016드.하39 3 그 ”두시그아으드,’ 8& !516아|)6(1)

(

P:127

게임 오브젝트가 플레이어를 향해 다가옵니다. ?1자오01311 게임 오브젝트 위에는

0〜3개의 장애물이 랜덤으로 활성화됩니다.

로디미|듀(드2 |미

스 기게0071 게임 오브젝트의 동작 테스트하기

:대도의;기도^

장애물과 부딪혀 사망한 플레이어

13장 유니런 : 발판 반복 생성과 게임 완성 523

테스트했다면 플레이 모드를 해제합니다. 그리고 다음 절로 넘어가기 전에 ?뚜6나35 폴더의

1기2&1111 프리팹을 씬에서 완성한 1기사‘01111 게임 오브젝트로 갱신하겠습니다.

플레이어 캐릭터가 점프해서 다가오는 발판 위로 올라가는 데 성공하면 점수가 추가됩니다. 캐

릭터가 발판 위의 장애물과 부딪히면 사망하며. 이때 배경과 발판의 움직임이 멈추며 게임오버

니I 가 활성화됩니다.

1’121(1'이— 컴포넌트를 설정한 디음 플레이 버튼을 눌러 1기3⑴XIII 게임 오브젝트의 동작을 테

스트해봅니다.

P:128

[①미3아0끼 게임 오브젝트 선택 | | ②0노601거65〉사)유우 세 클릭 |

으 I가3유0” 프리떕 갱신하기

13.2 발판 생성기 만들기

발관 프리갭으로 발관을 무한 반복 생성해서 배치하는 발판 생성기를 구현합니다.

이러한 문제를 해결하기 위해 발판을 오브젝트 풀링 방식으로 생성하고 관리하겠습니다.

524 5부 20 러너 게임 으 유니런

무한 반복 생성되는 발판을 구현하는 가장 간단한 방법은 필요할 때마다 매번 새로운 발판을

생성하는 겁니다. 하지만 발판 오브젝트 수가 계속 늘어나기 때문에 메모리 사용량이 계속 증

가합니다. 또한 새로운 발판을 생성할 때마다 처리량이 늘어나 게임이 끊길 수 있습니다.

시기)누 스11 버튼을 누르면 게임 오브젝트의 수정사항이 I시시오01’111 프리개에 반영됩

니다. I가프리팹을 갱신한 다음 씬에 있는 1’1시〔0011 게임 오브젝트를 삭기I샜습니다.

게임 오브젝트를 미⑴조:⑴! 프리팹을 원본으로 게임 도중 실시간 생성힘 것이기 때

문입니다.

00^7

유35(0

( 과정 02)이31(0⑴1 프리팹 갱신하기

① 하이어라키 창에서 디3바01X0 게임 오브% 선택

② 인스펙터 창에서 0/61710168〉스이이V 시I 클릭

③ 우13110011 게임 오브젝트 삭제(하이어라키 창에서 I기3바이'01에 마우스 오른쪽 클릭〉0이616)

③[기8110011 게임 오브젝트 삭제

(마우스 오른쪽 클릭〉061616)

06031716

011이!03(6 니1내호호호히브

드 바10흐

0*1(( ’

V ③스기호 011X1(!’;!

/ 5110 여!"”

01(1200(

느 8*1(9으001X1

느 0411、하

후하115수하하" ――유0^9“

그저&바1",리1데—

P:129

13.2.1 오브젝트쭐링

오브젝트 플링율 사용하지 양는 경우

오브젝트 3잉읍 사용하는 경우

가지오기 ;

으 오브젝트 풀링

13장 유니런 : 발판 반복 생성과 게임 완성 525

오브젝트 풀링을 사용하면 생성할 오브젝트를 생성하지 않고 풀에서 가져다 쓰고. 파괴할 오브

젝트를 파괴하지 않고 풀에 반납합니다. 그리고 풀에 반납한 오브젝트는 나중에 다시 꺼내 재사

용할 수 있습니다. 따라서 오브젝트 풀링을 사용하면 게임 끊김 현상이 현저하게 줄어듭니다.

1051301181:6() 메서드처럼 오브젝트를 실시간으로 생성하거나, 06511-0X() 메서드처럼 오브

젝트를 실시간으로 파괴하는 처리는 성능을 많이 요구합니다. 또한 메모리를 정리하는 00(가

비지 컬렉션)를 유발하기 쉽습니다. 따라서 게임 도중에 오브젝트를 너무 자주 생성하거나 파

괴하면 게임 끊김 (프리즈) 현상을 겪게 됩니다.

풀에 오브젝트를 생성해둔 이후에는 새로운 오브젝트가 필요할 때 새로운 오브젝트를 생성하

지 않고 풀에 있는 오브젝트를 가져다 씁니다. 오브젝트를 필요 없을 때는 오브젝트를 파괴하

는 대신 오브젝트를 비활성화하고 풀에 반환합니다.

오브젝트 풀링이’※ 1’001때이란 초기에 필요한 만큼 오브젝트를 미리 만들어 ‘풀,,‘’이 (웅덩이)’에

쌓아두는 방식입니다.

P:130

게임화면

아동방향

그다음 게임이 시작되고 일정 시간이 지나면 순서대로 발판 배치를 시작합니다.

526 5부 20 러너 게임 : 유니런

오브젝트 풀링은 필요한 오브젝트를 게임 초반에 미리 생성힙니다. 따라서 로딩 시간이 길어질

수 있습니다. 로딩이 긴 게임이 대체로 게임 도중에 끊김이 없는 이유는 게임 초반에 필요한 오

브젝트를 미리 생성하기 때문입니다.

이 장에서 오브젝트 풀링의 모든 부분을 구현하지는 않습니다. 대신 오브젝트 풀링이 기존 오

브젝트를 재활용하는 방식을 사용해 간단한 발판 생성기를 완성합니다.

13.2.2 발판 무한 배치 과정

오브젝트 풀링의 개념을 사용해 미리 생성한 3개의 발판을 재사용하여 끊임없이 발판이 생성

되는 것처럼 보이게 합시다. 구체적으로는 다음과 같은 방법을사용합니다.

게임이 시작되면 필요한 만큼 발판 오브젝트를 생성하여 게임 화면에 보이지 않는 구석진 장소

(풀)에 배치합니다. 생성된 발판들은 각자 가지고 있는 5(X0111(1901^6(:1 컴포넌트에 의해 항

상 왼쪽으로 이동합니다.

( 과정 02)첫 번깨 배치 루프

① 일정 시간 후 1 번 발판을 리셋하고 화면 오른쪽에 재배치

② 일정 시간 후 다음(1 번 — 2번) 발판을 리셋하고 화면 오른쪽에 재배치

(3) 일정 시간 후 다음(2번 -3번) 발판을 리셋하고 화면 오른쪽에 재배치

( 과정 이 ) 발판풀생성

① 3개의 발판 오브젝트를 미리 만들어 풀에 배치

보이지 입는 구석진 곳

으 발판 풀 쌍성

P:131

① 게임화면

게임 화연

시-…1 발판1~~1

게임화연

바판1 | 식..…; 발판2 |

13장 유니런 : 반판 반복 생성과 게임 완성 527

그런데 과정 02의 ③에서 발판 3까지 재배치하면 다음 순번에 배치할 발판이 없습니다. 여기

서 발판 3이 배치될 때 발판 1은 이미 게임 화면을 벗어난 상태라는 점에 주목합니다.

발판 1은 이미 게임 하’면을 벗어났기 때문에 어떠한 쓸모도 없습니다. 따라서 쓸모없게 된 발

판 1을 리셋하여 발판 3의 다음 순번으로 사용합니다.

생성된 발판은 순서대로 일정 간격을 두고 게임 화면 오른쪽에 배치됩니다. 발판은 재배치되기

전에 상태를 리셋하는 과정을 거칩니다.

이렇게 게임 화면을 벗어난 발판을 다시 사용하는 방식으로 3개의 발판만 가지고 발판을 무한

생성하는 것처럼 만들 수 있습니다.

“발판 3

으 첫 번째 배치 루프

고.드%5

으…:[도파]가—

우…위 발판2 뉴-

P:132

① 게임화먼

뽀1

② 게임화면

으.... 바든2 -「표가

게임 화면

으 발판반복 배치하기

528 5부 20 러너 게잉 : 유니런

13.2.3 I기3뉴00718|33\\/\\『061‘ 작성하기

앞에서 다룬 원리를 이용해 발관을 생성하고 주기적으로 재배치하는 미3버이‘ 스크립

트를 게임 오브젝트에 추가하고 스크립트를 완성해봅시다.

(고!정 03)첫 번째 이후배치 루프

① 일정 시간 후 다음(3번 ― 1 번) 발판을 리셋하고 화면 오른쪽에 재배치

② 일정 시간 후 다음(1 번 — 2번) 발판을 리셋하고 화면 오른쪽에 재배치

③ 일정 시간 후 다음(2번 — 3번) 발판을 리셋하고 화면 오른쪽에 재배치

④ …반복

으—I 말만3 | ;

I’ 과정 미 ) 미스크립트열기

① 빈 게임 오브젝트 생성(하이어라키 창에서 01-6316〉01-8316 도01⑴V)

② 생성된 게임 오브젝트의 이름을 두1*0011 893X7001'로 변경

③ 8011^18 폴더의 미게이705|)3어081‘ 스크립트를 하이어라키 창의 우|3유0170 - 게임 오브젝트

로드래그&드롭

④ 주이’015|33뷰061‘ 스크립트를 더블 클릭하여 열기

느.…| 발한1 | 서

흐…I 발하 | ; 으….!" 할만3기

“…시 발먼1 I

수....! 발판?"]—

으.…I 나만치

P:133

?13버거떼아레씨" 스크립트를 열면 다음과 같이 구성되어 있습니다.

115109 110117타19:드16;

)

)

1 3.2.4 I기31((가'018으3\\/\\/06!'의 필드

미3버:이‘1!15아래70리’ 스크립트에서 변수를 선언한 부분(필드)을 먼저 살펴봅시다.

13장 유니런 : 발판 반복 생성과 게임 완성 529

701(1 0(3볘6() (

// 순서를 돌아가며 주기적으로 발판을 배치

// 초반에 생성한 발판을 화면 밖에 숨겨둘 위치

(31-17316 \\/6(:1:0으2 1)001?0811:100 그 06?/ 760101-2(0,~25);

|기”1781:6 51031: 18815^3^(111016; // 마지막 배치 시점

|31‘17316 631116아)]아히] 마.31주017115; // 미리 생성한 발판들

13(-1781:6 101 0“1’601:10(16스 그 0; // 사용할 현재 순번의 발판

하나)110 1=1031 11016861:51)8^10 드 1.255; // 다음 배치까지의 시간 간격 최솟값

유나)110 1=1031 11016661513=0아3소 그 2.255; // 다음 배치까지의 시간 간격 최댓값

(‘17816 주1031 11016861:5^3^0; // 다음 배치까지의 시간 간격

1X11)110 1=1031 1(1 그 -3.511; // 배치할 위치의 최소 X 값

휴나)110 11031: 애43〉《 그 1.5우; // 배치할 위치의 최대 V 값

하흐!7316 1=1031 아’05 그 205; // 배치할 위치의 X 값

701(1 5131*1:0 I

// 변수를 초기화하고 사용할 발판을 미리 생성

// 발판을 생성하고 주기적으로 재배치하는 스크립트

|3니기.10 (11355 유네주느)으015()8*16[‘ : ^000861137100^ (

|)나)110 63016(가)]6(:! 마스버이'까’!'버그느; // 생성할 발판의 원본 프리팹

13111)110 101 000(11 드 3; // 생성할 발판 수

P:134

그아래에는 생성 주기와관련된 변수가 선언되어 있습니다.

그다음 발판을 재배치할 위치를 결정하는 변수들이 선언되어 있습니다.

530 5부 20 러너 게임 : 유니런

마스터드까’1-6536에는 복제 생성할 발판 게임 오브젝트의 원본 프리팹이 할당됩니디-. (20기는

복제 생성할 발판 수를 결정합니다. 만약 발판 3개가 돌아가며 사용하기에 충분하지 않다면

(:0나01 값을 늘려도 됩니다.

그다음에 생성한 발판 게임 오브젝트를 저장할 배열과 배열에 할당된 발판 중 현재 사용할 발

판의 순번을 가리킬 변수가 선언되어 있습니다.

너1116861⑶)*0은 현재 순번의 발판이 배치된 후 다음번 발판을 배치할 때까지 소요되는 시간입

니다. 우리는 11016881애러때의 값을 발판을 배치할 때마다 매번 랜덤하게 변경할 겁니다. 그러

면 게임이 더 어렵고 재미있게 느껴질 겁니다.

위에 선언된 1111)68615|38^0^1(1,11(110861:5|〕3\\시가43〉《는 11016861:5|33\\1/【1의 최솟값과

최댓값을 결정합니다.

이’05는 발판을 배치할 X축 위치입니다. 발판을 배치할 가로 방향 X축 위치는 항상 게임 화면

오른쪽 20으로 고정입니다.

|)나)110 주1031 V사10 그 -3.511;

1)111)110 11031 아너노 그 1.5호;

?1-17316 11031 아’05 그 20주;

13013110 631116아이601: 미그11:00111’|’어:31);

나)110 101 000(11 그 3;

|3나)110 호1.031 11/068815^8^0^10 그 1.25호;

5)111)110 주1031 11|116661:5|)3^01‘18호 그 2.25주;

후1()31 11*86151)31*11;

높이(、'축)는 퍼과 려 사이어서 랜덤 결정합니다. 그러면 매번 배치되는 발판의 높이가 달

라겨 게임이 재미있게 느껴질 겁니다.

P:135

13장 유니런 : 발판 반복 생성과 게임 완성 531

아3「1 ( ) 메서드에서는 상태를 표현하는 변수를 초기화하고, 사용할 발판 게임 오브젝트를 미

리 생성함니다.

아001으051느00은 게임 시작 시 생성한 발판 게임 오브젝트를 배치할곳입니다. 생성한 발판 게임

오브젝트는 초반에는 게임 화면에 보여선 안되기 때문에 위치값을 (0,~25)로 할당했습니다.

18오아8711016은 가장 최근에 발판을 재배치한 시점입니다. 발판을 재배치할 때마다 매번 갱

신되며. 발판을 언제 재배치해야 하는지 계산할 때 사용합니다.

다18너1아1115는 프리팹으로부터 생성한 발판 게임 오브젝트를저장할 배열 변수이고, 00160110어6오

는 가13부0때5에 할당된 발판중에서 지금 사용할 발판을 가리키는 순번입니다.

마지막으로 발판 게임 오브젝트를 초반에 모아둘 장소와 마지막으로 재배치를 실행한 시점을

저장하는 변수가 선언되어 있습니다.

701(1 5181*1() (

// 00001만큼의 공간을 가지는 새로운 발판 배열 생성

131.31^0^015 그 06^ 68016아)5601[(:00111:];

// 00나01만큼 루프하면서 발판 생성

1=0호 (104 I 그 0; 1 스 00001; 1++)

(

( 과정 01) I가야아'0181)=1161'의 81311() 메서드 완성하기

① ?1케이116|33뷰061’의 51:31*1 ( ) 메서드를 다음과 같이 완성

아으173|:6 63(110아)]6으이] 으1311:0【‘‘1115;

13^17810 1(11 《:1』도느6(1110(16소 드 0;

[‘1781:6 \\/601이'2 ^001130511:100 그 (16?/ \\/601:01’2(0,~25);

()1*1781:0 11031 185^5^3^1111(116;

13.2.5 [기3150^7118133^/70^^1 81311( ) 메서드

아13버지15아3께이‘ 스크립트의 31:히나 ( ) 메서드를 완성합니다.

P:136

하131주0005 그 06하 0311)6065 601(000011;

이것으로 배열에 방들이 마련됐지만. 배열의 각 방(원소)에 입주민(오브젝트)이 없습니다. 따

라서 후0「문으로 (:0떼만큼 루프하면서 발판 게임 오브젝트를 생성하여 배열의 각 원소에 순

서대로 할당합니다.

()13110=(11 그 105=316(1)18하0**36, ()001?0511100, 00816171100.1(16011하);

)

주이' 문 블록에서는 10813011818() 메서드로 이커⑦드까 어가)에 할당된 1》101(01111 프리팹의

복제본을 생성합니다. 생성할 위치는 ?001?0811101\\ 회전은 011816자!011(1601117로 지정했습

니다(0031617)100.1(1601117는 오일러각의 (⑴ 0, 0)회전에 대응합니다). 아00나’081110(1 값이

(0, -25)이므로 복제 생성된 발관은 게임 화면에서 아래쪽으로 멀리 벗어나 보이지 않습니다.

으13110(’(115〔!그 그 10518011316 (|)18추우이11|1’드6우31),()001?0511100, ()11816드01.00교(1601:!1오);

532 5부 20 러너 게임 : 유니런

(01’ (101 1 그 0; 1 으 001101; 1++)

작성한 코드를 살펴봅시다. 먼저 발판 게임 오브젝트의 수 (:0001만큼의 공간을 가지는 68*0버 601

배열을 생성하여 이3후0께5에 할당합니다.

이렇게 복제 생성한 발판 게임 오브젝트를 0번째부터 6001-1번째까지 I를 사용해 아18부이11)5

의 각 원소에 하나씩 할당했습니다.

// 마지막 배치 시점 초기화

13815()3*(0111116 그 0호;

// 다음번 배치까지의 시간 간격을 0으로 초기화

11068618173*(0 그 0호;

// 이3비0(끼 히86을 원본으로 새 발판을 유0이?051110(1 위치에 복제 생성

// 생성된 발판을 이8히이꺼5 배열에 할당

()131^0005^3 그 10513011318(|1181후001)91-6조8노,후001?051흐!00, 0118^6(-(1100 ,16601117);

P:137

513(*1 () 메서드의 마지막 부분에서는 가장 최근의 재배치 시점을 나타내는 13515으3씨1!(118과

다음번 배치까지의 시간 간격인 111116861:5가3*1의 값을 0으로 초기화했습니다. 111110861:51)2^0

의 처음 값이 0으로 시작하면 게임이 시작되자마자 지연시간 없이 즉시 첫 번째 발판이 배치됩

니다.

13.2.6 [기3하(가'1118으3016흐의 1』그예6( ) 메서드

아노바!)제15아8까6드 스크립트의 1쎼310 ( ) 메서드에서는 513^1 ( ) 메서드에서 만든 발판 게임 오

브지I트를 돌아가며 사용하는 방식으로 발판무한 배치를 구현합니다.

으61111*0;

13장 유니런 : 발판 반복 생성과 게임 완성 533

1,3515|)3^011016 그 0주;

1!|068615|)87 그 0주;

// 사용할 현재 순번의 발판 게임 오브젝트믈 비활성화하고 즉시 다시 홤성화

// 이때 발판의 이그하⑴’⑴ 컴포넌트의 00타181)16 메서드가 실앵됨

// 배치할 위치의 높이믈 아1너과 아… 사이에서 랜덤 설정

후1.081 오1’05 드 1^3(160111.^8096(^^110,아사3〉();

// 기록된 마지막 배치 시점을 현재 시점으로 갱신

(과정 이 ) [가야아'018다애다" 스그립트의 0(X1316() 메서드 완성하기

① ?131^0^5^3*706스크립트의 0^)(1316 ( ) 메서드를 다음과 같이 완성

701(1 0^(13160 (

// 게임오버 상태에서는 동작하지 았음

(680161180896^-111518006.15631116076(‘)

// 마지막 배치 시점에서 11*664515=0 이상 시간이 흖렀다면

II (711118.1101618515|)8^011016 +

// 다음 배치까지의 시간 간격을 110)686151)8*0^10, 11(11686흐5|)3쑤!13소 사이에서 랜덤 설정

11016861:5^81*0 그 유3(1어0111오3(19으에"1으므르후드I)레이141|느 11|1168615|?3바0사3)();

P:138

(:니후으으유흐드유어으보 그 0;

)

)

작성한 코드를 살펴봅시다. 먼저 0(X1거6() 메서드 최상단에서 푸 문으로 게임오버 상태에서는

더 이상 처리가 진행되지 않게 막고 있습니다.

1우 (63016^808961"-10513006,15630160761’)

)

6801애3089라’.10512006.15680160761'로 싱글턴 게임 매니저에 접근하여 게임오버 상태를 확인

행됩니다.

그다음 푸 문에서는 발판을 재배치한 가장 최근 시점에서 지금까지 시간이 얼마나 지났는지 확

인합니다.

(11106.111116 그드 195151)8*01111*6 + 110168615|)3^)

534 5부 20 러너 게임 : 유니런

71^.1개6은 유니티 라이브러리에 내장되어 있으며. 게임 시작 후 시간이 몇 초 지났는지 출력

하는 변수입니다. 따라서 도꾸네뚜을 ‘현재 시점’으로 취급할 수 있습니다.

합니다. 1868(1160761’7^ 바‘06인 경우 이곳에서 뗴316 ( ) 메서드가 매번 종료되어 발판 재배치

가 완전히 멈춥니다. 156=6076으가 1=8156라면 11^316() 처리가 여기서 종료되지 않고 계속 진

1)1311011115^111-1-80110(16x3.58^0^176(^3156) ;

15181101-105(0111“1-60110(18x3.56^01176(1: (’06);

// 마지막 순번에 도달했다면 순번을 리셋

I주(00“80110(16오 스 00001)

(

// 현재 순번의 발판을 화면 오른쪽에 재배치

1)181^01^05(00(-^8011(1(16x3.^^80510^.130511100 느 06바 V휴05);

// 순번 넘기기

0111〒60110(16호++;

P:139

13515^3^011(116 + 11(1166615|?8쑤의 값은 가장 최근에 발판을 배치한 시점 13515아케⑴11(116에서

다음번 배치까지의 시간 간격 11*86151)=0만큼 시간이 더 지났을 때의 시점입니다. 따라서

13515아371111116 + 11|!)68615아8기은 다음번 배치가 예약된 시점입니다.

11010.1:1016 스 13515133^071016 + 1±!168615|3캐11은 현재 시점(11(116.11(116)이 다음번 배치가 예

약된 시점(13515|3러7011010 + 1±1108615|33씨)과 같거나 그 이상의 시간이 지났는지 검사하는

겁니다.

0 11(1168615^3^0

시간의 흐름

배치 실행

으 재배치 시점을 표현한 타임라인

해당 조건을 만족하면 포 문 블록이 실행되어 가장 최근 배치 시점을 갱신하고 발판을 실제로

배치합니다.

먼저 1851아을현재 시점 111116.11(06으로 갱신하고. 다음번 발판 배치까지의 시간 간

격 11016861:51)*0을 누쭈므애애허시가41아과 11016861:5아3\\7가18/ 사이의 랜덤 값으로. 변경합니다.

그리고 발판을 재배치할 높이를 랜덤 값으로 설정합니다.

51081 \\4’05 그 1^80(10(11.^8(196 (V에유, 애녀소);

13장 유니런 : 발판 반복 생성과 게임 완성 535

13515^3^(1111116

1101686(:5|38^0

13515^3^0111116

+ 1171166615하3쌔

13515?8^(171016

+ 1111168615휴3유0

1.38^5()8^011(116 그 11016.1:10)6;

11(116861:5^8^0 그 유30으0111.^3096 (111116861:5^3^0^1(1,11(1168615아3*7가18〉《);

710)6, (1016

(현재 시점)

711116.11186 (현재 시점)

갱신된

18515^3?|1111016

스〈배치 불가

P:140

재배치할 발판 게임 오브젝트를 리셋했다면 위치를 변경하고 순번을 넘깁니다.

그리고 순번의 마지막에 도달하면 순번을 리셋합니다.

(:!」드고6011(1(16소 그 0;

)

536 5부 20 러너 게임 : 유니런

1주 (01』1”1’60110(38오 으그 001X11)

(

아131조00115 [(:00‘60110어6)0.56흐슈011760:8156);

^01-1-601:10(16x3.561^01170(1(’116);

그다음 재배치할 현재 순번의 발판 게임 오브젝트를 비활성화하고 즉시 다시 횔-성회합니다. 현

재 사용할순번의 발판 게임 오브젝트는 다13베[(:0—60110(16X1로 접근힙니다.

발판 게임 오브젝트를 껐다 켠 것은 해당 발판 게임 오브젝트의 상태를 리셋하기 위해서입니

다. 발판 게임 오브젝트에 추가한 미3벼0「까 스크립트는 발판의 상태를 리셋하고 자신의 장애

물 게임 오브젝트를무작위로 활성화하는 0(1타131)16 ( ) 메서드를 가지고 있습니다.

00타131316() 메서드는 컴포넌트가 활성화될 때마다 매번 실행됩니다. 즉. 게임 오브젝트를 껐

다 켜는 방식으로 미3버0때 컴포넌트의 00타131)16 ( ) 메서드를 실행하여 발판 게임 오브젝트를

리셋한 겁니다.

배열의 순번은 0부터 셉니다. 따라서 배열의 마지막 발판을 가리키는 순번은 00001-1입니다.

너’로 값이 1 증가한 이“이즈페으소가 000이보다크거나 같다는 것은 방금 재배치

했던 발판이 배열의 마지막 발간이었다는 의미입니다. 이 경우 를 0으로 리셋해

순번을 0부터 다시 시작합니다. 그러므로 미리 생성한 발판 게임 오브젝트를 순번을 돌아가며

무한 반복 사용할 수 있습니다.

발관을 배치할 위치의 X 값 아’05는 고정이지만. V 값 아308는 랜덤이기 때문에 배치되는 발판

의 높이가 매번 달라진다는 점에 주목합니다. 발판을 배치한 다음에는 00“601페6)아+로 다음

번 배치에 사용할 발판의 순번을 증가시켰습니다.

|)131호00115[(:017’6011(1(16〉《구1(’305주011114)05111011 드 06?/ V헤0드2(〉《?05, 7유08);

(:111‘1‘611110|56오누’;

P:141

13.2.7 I기게0까18아8106후 스크립트의 전체 코드

지금까지 으13버0떼우376구 스크립트를 완성했습니다. 완성된 스크립트의 전체 코드는 다음과

같습니다.

05109 0011x^91^5

)

13장 유니런 : 반판 반복 생성과 게임 완성 537

// 변수를 초기화하고 사용할 발판을 미리 생성

701(1 51:31-1:0 (

//(20001만큼의 공간을 가지는 새로운 발판 배열 생성

이3바01‘1115 그 06?/ 63018아누601[(:0110흐];

// 초반에 생성한 발판을 화면 밖에 숨겨둘 위치

9(‘17316 760^01*2 ^001?05111011 그 06?/ \\/6(:1:이’2(0,“25);

[가'17316 51081 13515|?817071016; // 마지막 배치 시점

13^17316 68016아)56(:1:0 하13혀017115; // 미리 생성한 발판들

(3^17316 10^ 001하‘60후페6소 그 0; // 사용할 현재 순번의 발판

하나)110 1=1031: 아410 X -3.511; // 배치할 위치의 최소、/ 값

|)나)110 1=1031 애43소 그 1.511; // 배치할 위치의 최대 V 값

|기‘:178^6 조1081 아’05 그 20우; // 배치할 위치의 X 값

아나)110 1=1031 1117)686151)3^10 그 1.255; // 다음 배치까지의 시간 간격 최솟값

|3나)110 조1031 11(068615|3캐가13소 그 2.25주; // 다음 배치까지의 시간 간격 최댓값

(‘1731:8『1031: 흐!(116861:51)3유0; // 다음 배치까지의 시간 간격

// 마지막 배치 시점 초기화

13515()3^011(116 그 0주;

// “기만금 루프하면서 발판 생성

주01‘ (101 1 = 0; 1 00001; 1+0

(

// 으13나0으까’오하가을 원본으로 새 발판을 하001?0511:!00 위치에 복제 생성

// 생성된 발판을 1)131:1=0^01 배열에 할당

아.헤0[‘까이!] 그 1051:3거:고개으에헤#까》!‘어해, |)00나’0511100, ()08하71100.1어6『1111:7);

// 발판을 생성하고 주기적으로 재배치하는 스크립트

|)나)II으 01.855 I기.911:0(‘1115|03유1161’ : 이0008아137101』드 (

(3나)110 63016아)]601 이그벼이'까수6'뎨); // 생성할 발판의 원본 프리팹

9나)110 101 00001 그 3; // 생성할 발판 수

P:142

)

)

(시드드으규느그유어으노 그 0;

)

)

)

이제 아.3부00!15아3#10으 스크립트를 [(게+81로 저장하고 유니티 에디터로 돌아갑니다.

538 5부 20 러너 게임 : 유니런

// 다음번 배치까지의 시간 간격을 0으로 초기화

1101686151)8^0 드 0호;

// 배치할 위치의 높이를 아1버과 3스 사이에서 랜덤 설정

후1081 아?05 그 유80(10끼.!《3096(오시10, 우슈3노);

// 다음 배치까지의 시간 간격을 11111686151)3^10, 110168이유3”이8소 사이에서 랜덤 설정

11*8615흐87 그 유80(10!11우3096(11(11686151)8170사10,110160615하8*70유9)();

// 기록된 마지막 배치 시점을 현재 시점으로 갱신

18815^3*(1111116 그 11018.11(116;

// 사용할 현재 순번의 발판 게임 오브젝트를 비할성화하고 즉시 다시 감성화

// 이때 발판의 미게0때 컴포넌트의 09타181316 메서드가 실행됨

이게이705 [(:0도1‘60흐10(16〉《구861^(:1176(13156);

이3바017=5 [《:0(‘(‘60110(16〉《구561슈에76(하’06);

// 마지막 순번에 도달했다면 순번을 리셋

11 (001'드60하10(16소 〉그 00001)

(

// 마지막 배치 시점에서 11*561애340 이상 시간이 흘렀다면

1호 11(118 13515휴8—11(06 + (10166615^8유0)

// 현재 순번의 발판을 화면 오른쪽에 재배치

()181^0015(00^1‘60110^1,11‘305^001),^0511100 그 06^ 7601이‘2(x70&, 오유05);

// 순번 넘기기

0⑴〒6(111(1(16소슈;

701(1 1)()(13160 (

// 게임오버 상태에서는 동작하지 않음

II (6811)6이8039&두.!05하80(:6그868피6076드)

(

P:143

13.2.8 I기3바아7118으3\\/\\/07 컴포넌트 설정하기

완성한 으13^0=5^=07 컴포넌트를 설정하고 동작시켜봅시다.

[ ①으13((01771 8그3우꾸6(~ 게임 오브젝트 선택-!

3 녀V#!’「07니【

스 으쁴브이

드 발판 생성기와 발판의 동작

13장 유니런 : 발판 반복 생성과 게임 완성 539

이하0071

, ~, 스. 그,소4

오 I기31(0「018으3\\사00드 컴포넌트 설정하기

긍’"!

‘] 050110 ”’

이제 완성된 발판 생성기를 테스트해봅시다. 플레이 버튼을 눌러 게임을 시작합니다. 플레이하

는 동안 발판이 일정 주기로 화면 오른쪽에 배치되는 것을 확인할 수 있습니다.

배치되는 발판의 높이와 활성화된 장애물 수는 매번 달라집니다. 씬 창에서 게임의 전체 모습

을 잘 관찰해보면 발판을 무한 생산하지 않고 3개의 발판 게임 오브젝트를 계속 돌려쓰고 있는

것을 확인할 수 있습니다.

(2)9131(01711 프리땁을(기31(0(X11 아이313

민드로 드래그&드뽑

|6 느 ;쉬으이3해이70

〔 과점 01 ) 기아아‘⑴에3씨" 컴포넌트 설정하기

① 하이어라키 창에서 두13하아711 8우310이' 게임 오브전투 선택

② I가'913% 폴더의 I기3하이711 프리팹을 우13버께대3)16후 컴포넌트의 우13하이'끼 우!'0(3브 필드로 드래

그우드롭

드| 느 드4느

프고흐

더고 히

| 0 105^60101’ I

55 의3하이711 5하히사0호'

730 ( 네499*11

느 스. 773051(X70으^—

V - (퍼 이3하01711 5^3^*001’

501()1 드131(005으,1\\700흐

I가3((이'01 유'이36

《:0011흐느- ''-

-1’!;두)6 8#1 5유3\\우0 세0 ‘1.25

71016 8(( 5유3유0서‘2.25

V이10 그5?토

아우즈 포흐—

P:144

13.3 빌드하기

빌드하기 전에 완성한 게임의 주요 기능을 확인해봅시다.

’%미;3프치미

도@히% 시〕 너드:디;#보 : 즈

스 유니런의가능

540 5부 20 러너 게임 : 유니런

이것으로 게임의 모든 코드와 게임 오브젝트를 완성했습니다. 충분히 테스트한 다음 플레이 모

드를 해제합니다. 이제 게임에 배경음악을 추가하고 최종 출력물을 빌드하겠습니다.

플레이어 캐릭터는 상황에 따라 뛰고. 점프하고. 사망하는 애니메이션을 재생합니다. 게임이

시작되면 배경이 반복되고 새로운 발판이 주기적으로 게임 화면 오른쪽에 배치됩니디-.

그리고 플레이어 캐릭터가 다가오는 발판을 향해 점프하고 무사히 착지할 때마다 점수가 1 점

씩 증가합니다. 증가한 점수는 ⑴로 확인할수 있습니다.

만약 플레이어 캐릭터가 낙사하거나 장애물을 밟으면 게임오버되어 사망 애니메이션과 효과음

이 재생되고 게임오버 VI가 활성화됩니다. 게임오버 상태에서는 점프 버튼에 해당하는 마우스

왼쪽 버튼을 클릭해 다시 게임을 시작할 수 있습니다.

즈 휴즈 -";

느— ,

P:145

13.3.1 배경음악추가하기

빌드하기 전에 마지막으로 게임에 배경음악을 추가합니다.

〔과정 이 ) 배경믐약추가하기

① 프로젝트 창의 히0 폴더에서 0103)0 오디오 클립을 하이어라키 창으로 드래그&드롭

② 생성된 010510 게임 오브젝트의 이0 8001*00 컴포넌트의 느0야? 체크

그느2그그」

'그.’.-.',

’] 05(311( 다

2〕13아8흐 (흐프^

'만의으-.

아씨' I사“110 세〜요0브이—..

아'I아1하

나.9*1

70)111110

하!

5((『00 유211

5^31111 81&0(1

, - I

1《0노"유 20이세X

으 배경음악 추가하기

오디오 클립은 반복 재생할 배경음악 파일입니다. 오디오 클립을 하이어라키 창으로 드

래그으드롭하면 해당 오디오 클립을 사용하는 오디오 소스 컴포넌트가 주가된 게임 오브젝트가

자동 생성됩니다. 오디오 소스 컴포넌트의 1X)0유는 오디오 클립을 반복 재생하는 설정입니다.

이것으로 유니런에서 반복 재생할 배경음악을 추가했으며. 게임의 모든 부분을 완성했습니다.

【001+81로 씬을 저장합니다.

13장 유니런 : 방판 반복 생성과 게임 완싱 541

〜01115(0

으55615 느 X11^10

(116 \\

001아1(

서0((

8^215 타주(13

8x^235 0

8우1수" 2000 (그

의8아 0() 사8누8 0

1*00유 호

1 I 11)08,’0 오디오 글립을 하이어라키 창으로

드래그&드롭

'/ ’.니/'55615

―11008 819표뾰네

':그 바!""(유아

&01( ’I

V ⑶ 이3||구

사310 01(710

513(1 에3하0(10

0(3(1200(

이;IV히

으 53(1;91’0110(1

느 00735

후'0015우5호프

6.1^16 사13030((’

(’1—01 5오~0(으

| I그 주거아:

.-.11 어0(161&

시I 하〈유가)5[하

5호호 0 고유

0105^60^0? |

; 56 1*^11*10

739 I 0"으08해

흐 X、 1유111*10도01

V 노、호사11으|0 5011

슈100(:11흐

브 30 50110(1 5후11(191

② 010510 게임 오브젝트의 /⑴⑵0 801X06

컴포넌트의 100으 치|크

111115규:

P:146

13.3.2 유니런 빌드하기

게임을 최종 빌드합니다. 빌드하기 전에 빌드를 저장할폴더를 적당한 경로에 미리 만들어둡니

다. 저자는 VIII니《에이라는 이름의 폴더를 바탕 화면에 미리 준비했습니다.

[과정 미) 유니런 빌드하기

⑤ (가능한 경우) 저장할 빌드명을 110)사가⑴으로 설정〉8376 클릭

| ① 빌드 설정 창 열기"〉&" 56^95—『|

00*4 &

으?

으. 14*( 4 11*1(11

0@오흐히!011 14*11*0(1

3-

'- I 흐1?1…스케 느' 0&아 0=1

0*00*1

유니티 2018 이상 버전에서는 윈도우에서 빌드할 경우 빌드를 저장할 폴더 이름이 곧 빌드 파

일 이름이 됩니다. 따라서 윈도우에서는 저장할 폴더만 지정하고 빌드명을 따로 지정하지 않는

다는 점을 유의합니다.

542 5부 20 러너 게잉 : 유니런

0X8 후 01느“느. 50%100

③ 811116 306 000 클릭

(4) 탐색 창에서 빌드를 저장할 폴더로 이동

① 빌드 설정 창 열기(상단 메뉴의 대16〉801101 86111095...)

② 빌드 설정 창에서 사(히 0아90 809065 클릭

⑤ (가능한 경우) 저장함 빌드명을

0구‘000으로 설정〉5876 클릭

느((0느

도프3110 요

I쮀쫴쮀톄라 드||빼느 『그제스’ ?055801~" 느 0=1 유'0호#..

시 5^뀨나

부^^^^^^^ 80.(1 & 아

네게부스 - 쑤7*10*1 아(00으

|(1쓰

누 애써^]

I & : ^0( 50600

----- 095080흐.

I ④탐석 창에서 빌드톱 저장함 폴더로 아동 I

느 유니런 빌드하기

계;

I쇼--그시

I&0

|뷰 으

I 하 수/1(소0(4

후아 으0.0유

즈、’"

V

| 5아서'나81*1

―2쓰I 나쓰뉴 —―

"우0 유0!아. !

| ③81111어 30그 000 클릭

6히 슈&56(5 63(1%

X、! : 히이

| ②슈거거 0(360 806068 클릭

5하후800003 하8

5=06 85— 0X8

11-" 서 4—0고히-

P:147

빌드가 끝나면 실행 파일이 지정한 폴더에 저장됩니다. 그리고 유니티 런처가 실행되며, I가2/

버튼을 눌러 게임을 플레이할 수 있습니다.

!1!』취미I류;!를 3 ‘〔I

으 빌드된 게임

13.4 마치며

이것으로 두 번째 예제 게임 유니런을 완성했습니다. 6부에서는 30 프로젝트를 활용해 더 높

은 난이도의 슈터 게임을 개발합니다.

이 장에서 배운 내용요약

13장 유니런 : 발판 반복 생성과 게임 완성 543

- 00타18610 ( ) 메서드는 컴포넌트가 활성화될 때마다 매번 실행됩니다.

- 오브젝트 풀링은 필요한 오브젝트를 미리 생성하여 사용하는 방식입니다.

- 오브젝트 풀링에서는 오브젝트를 실시간 생성하지 않고 풀에 있는오브젝트를 가져다 씁니다.

- 오브젝트 풀링에서는 오브젝트를 실시간으로 파괴하지 않고 파괴할오브%를풀로 반환합니다.

- 오브젝트풀링을 사용하면 초기 로딩은 길어지지만 실시간 생성/파괴에 의한 성능 저하를 막을 수 있습니다.

- 오디오 소스 컴포넌트의 10013를 체크하면 오디오가 반복 재생됩니다.

레트로의 유니티 게임 프로그래밍 에센스 (2024)
Top Articles
Latest Posts
Article information

Author: Tuan Roob DDS

Last Updated:

Views: 5309

Rating: 4.1 / 5 (42 voted)

Reviews: 89% of readers found this page helpful

Author information

Name: Tuan Roob DDS

Birthday: 1999-11-20

Address: Suite 592 642 Pfannerstill Island, South Keila, LA 74970-3076

Phone: +9617721773649

Job: Marketing Producer

Hobby: Skydiving, Flag Football, Knitting, Running, Lego building, Hunting, Juggling

Introduction: My name is Tuan Roob DDS, I am a friendly, good, energetic, faithful, fantastic, gentle, enchanting person who loves writing and wants to share my knowledge and understanding with you.