책 소개
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
요약
게임 제작에서 중복 코드를 줄이는 것은 개발자들의 수고를 덜어줄 뿐만 아니라 자질구레한 일에서 해방시켜 더 많은 시간을 창조적인 작업에 힘쓰게 해준다. 맵의 자동 생성, NPC 동작, 아이템 랜덤 발생과 조합 등이 좋은 예라고 할 수 있다. 이러한 자동화 기법은 최근 인공지능과 결합되면서 엄청난 잠재력을 보여주고 있다. 이 책은 그런 자동화 기법인 절차적 콘텐트 생성(PCG) 기술에 대한 전반적인 지식과 실전 예제를 다룬다.
이 책에서 다루는 내용
■ PCG 이론의 이해
■ 의사 난수 사용 학습
■ PCG용 재사용 가능한 알고리즘 제작
■ PCG의 데이터 구조 평가
■ 막대한 양의 콘텐트가 들어간 작은 게임의 개발
■ 일상적인 설계에 시간을 허비하지 않게 하는 콘텐트 생성
■ 게임에 PCG 추가 시기와 방법에 대한 학습
■ PCG의 기초 기술 학습
이 책의 대상 독자
이 책은 유니티 개발 초보자를 염두에 두고 쓰긴 했지만 중급 유니티 개발자에게 가장 알맞다. 유니티 개발과 C# 언어에 익숙하다면 이 책을 최대로 활용할 수 있다. 하지만 초보 사용자에게도 도움이 되는 많은 이론과 프로그래밍 기법 정보가 들어 있다. 이 책 도처에 참조 링크와 정보 팁을 뒀으므로 지식이 부족한 사용자는 참고 자료를 통해 학습 진행에 도움을 받을 수 있다.
이 책의 구성
1장, ‘의사 난수’에서는 절차적 콘텐트 생성(PCG) 이론에 관해 배운다. PCG가 무엇이고 비디오 게임에서 어떻게 사용되는지 살펴본다. 그런 다음 의사 난수(PRN)라는 유용한 무작위 컴포넌트에 관해 학습한다. PRN이 무엇이고 어떻게 사용되고 어떻게 PCG 알고리즘 구현에 도움이 되는지를 다룬다.
2장, ‘로그라이크 게임’에서는 절차적 콘텐트 생성의 우수한 예제인 로그라이크 게임에 관해 배운다. PCG의 기원과 로그라이크 게임의 역사를 다룬 후, 우리가 만들 로그라이크 게임의 유니티 프로젝트 토대를 마련한다.
3장, ‘끝없는 세계의 생성’에서는 2D 로그라이크 게임 구현을 시작한다. 플레이어가 돌아다니는 동안 실시간으로 생성되는 레벨을 만든다. PCG 알고리즘 디자인과 유용한 데이터 하부구조(substructures)를 다룬다. 그런 다음 그것을 합쳐서 게임 세계를 구현해본다.
4장, ‘무작위 던전 생성’에서는 로그라이크 게임의 서브 레벨을 구현한다. 실시간으로 전체 레벨 레이아웃을 생성할 때, 다른 방법으로 레벨 생성에 접근할 것이다. 이 기술에 대해 몇 가지 일반 접근법에 관해 배우고 직접 하나를 구현해본다.
5장, ‘무작위 아이템’에서는 아이템 무작위 생성에 관해 배운다. 여러분이 생성한 아이템에는 각기 다른 특성이 있어서 몇 가지 기술을 사용해 플레이어에게 이런 특성을 알게 한다. 아이템 생성, 상호작용, 인벤토리 저장을 다룬다.
6장, ‘모듈식 무기의 생성’에서는 무작위 모듈식 무기 시스템 지식과 구현 방법에 관해 배운다. 이전 장에서 배운 것에다가 아이템 생성에 대한 더 많은 복잡도를 부여한다.
7장, ‘적응형 난이도’에서는 인공지능(AI) 분야로 넘어가서 AI와 PCG가 얼마나 비슷하고 관련돼 있는지를 배운다. 적응형 난이도에 대한 PCG 아이디어를 배우는데, 한 부분씩 AI와 PCG를 알아본다. 그러고 나서 여러분의 로그라이크 게임에 대해 적응형 난이도 시스템을 구현해본다.
8장, ‘음악 생성’에서는 PCG가 어떻게 게임의 음악과 사운드 콘텐츠에 기여할 수 있는지 보여준다. 음악 이론도 약간 배우게 되는데, 다만 음악 생성에 대한 PCG 알고리즘을 디자인할 정도다. 그러고 나서 실시간으로 음악을 생성할 수 있는, 여러분의 로그라이크 게임용 음악 생성기를 구현해본다.
9장, ‘3D 행성의 생성’에서는 2D 기반 PCG를 3D 기반 PCG로 주제를 전환한다. 우리의 핵심 2D 로그라이크 기능을 끝내고 새 프로젝트로 작업할 것이다. 이 장에서는 3D 객체 생성의 기본을 소개한다. 그러고 나서 3D 행성 생성기를 구현해본다. 게다가 보너스로 최초 인간 제어기를 구현해 여러분이 생성한 세계를 가까이서 살펴본다.
10장, ‘미래의 생성’에서는 오늘날 사용되는 PCG의 가장 일반적인 방법과 이 주제에서 향후 학습에 대한 몇 가지 길을 논의한다. 또한 이 책을 통해 배운 것과 이것이 이 PCG 방법과 어떻게 관련이 있는지에 대해 핵심 몇 가지를 정리해본다. 마지막으로 미래를 위해 이런 PCG 방법을 향상시킬 수 있는 몇 가지 길을 알아본다.
목차
목차
- 1장. 의사 난수
- __PCG 소개
- __PCG 사용법
- __PCG의 적용
- __의사 난수
- __무작위 대 의사 난수
- ____PCG에서의 PRN
- __도전
- __요약
- 2장. 로그라이크 게임
- __로그라이크 게임 소개
- __왜 로그라이크인가?
- __직접 만들어보는 로그라이크 프로젝트
- __프로젝트 셋업
- ____기반 프로젝트의 임포트
- ____파일 개요
- ____애니메이션
- __요약
- 3장. 끝없는 세계의 생성
- __데이터 구조 선택
- ____배열
- ____링크트 리스트
- ____딕셔네리
- __PCG 알고리즘 개요
- __신 셋업
- ____플레이어 위치
- ____카메라 이동
- ____레이어
- __초기 게임 보드
- ____연결 코드
- ____PCG 게임 보드
- __요약
- 4장. 무작위 던전 생성
- __알고리즘 설계
- ____알고리즘 개요
- ____그리드
- ____필수 경로
- ____무작위 경로와 챔버
- ____그리드의 나머지 채움
- ____입구와 출구 제작
- ____알고리즘 정리
- __데이터 구조
- ____원래 위치로의 복귀
- ____큐
- ____프리팹 셋업
- ____출구 표시
- __DungeonManager
- __BoardManager
- __Player
- __GameManager
- __유니티 편집기에서 할 작업
- __던전 시드
- __도전
- __요약
- 5장. 무작위 아이템
- __게임 세계에서의 헬스 아이템 생성
- ____헬스 아이템 생성 구현
- __던전에서의 아이템 생성
- ____Chest 프리팹
- ____Chest 구현
- ____아이템 상자 생성
- ____Item 프리팹
- ____Item 코드
- ____플레이어에 아이템과의 상호작용 추가
- __요약
- 6장. 모듈식 무기의 생성
- __모듈이 있는 PCG
- ____모듈식 PCG의 통계
- ____새 스프라이트의 제작과 설정
- ____여러 개의 이미지 프리팹 제작
- __모듈식 무기 스크립트
- __생성 지점 추가하기
- __무기 획득
- __스크립트를 통한 무기 애니메이션 추가
- __캐릭터의 방향 추가
- __요약
- 7장. 적응형 난이도
- __스프라이트 셋업
- __세계 보드에서의 적 추가
- __던전 보드에서의 적 추가
- __적과의 전투
- __적응형 난이도
- ____적 AI
- ____완료
- __요약
- 8장. 음악 생성
- __음악 개념
- ____템포
- ____멜로디
- __반복
- ____베이스 라인
- ____긴장감의 추가
- __요약
- 9장. 3D 행성의 생성
- __세 번째 차원의 추가
- ____3D 대 2D
- ____기하학 지식
- ____유니티 프리미티브 구 작업
- ____구의 생성
- ____무작위화 추가
- ____좋지 않은 시간 복잡도와 공간 복잡도
- __멀티 메쉬 행성
- __행성 탐험
- __요약
- 10장. 미래의 생성
- __모델
- __아이템
- __레벨
- __텍스처
- __지형
- __물리학
- __애니메이션
- __AI
- __스토리
- __플레이어 샌드박스
- __요약
도서 오류 신고
정오표
정오표
[p.123 : 코드 17번행]
string t
→
TileType t
[p.129 : 코드 88번행]
Vector2(tile.Value.x, tile.Value.y);
→
Vector2(tile.Key.x, tile.Key.y);
[p.130 : 코드 105번행]
(newRPathPos, newRPathPos);
→
(newRPathPos, TileType.empty);
[p.131 : 위에서 2행]
여기 점검은 필수 PathTile로부터 경로를 생성할 것인지 1/5 확률로 결정한다.
→
여기 if 문에서는 1/5 확률로 필수 PathTile에서 경로를 생성할 것인지 결정한다.
[p.134 : 코드 146번행]
[p.134 : 코드 148번행]
(tile.Value.x, tile.Value.y, 0f)
→
(tile.Key.x, tile.Key.y, 0f)
[p.191: 코드 26번행]
다음 코드 추가
}
[p.211: 코드 11번행]
다음 코드 추가
private SpriteRenderer spriteRenderer;
[p.211: 코드 22번행]
protected override void AttemptMove
→
protected override bool AttemptMove
[p.211 코드 18번행]
다음 코드 추가
spriteRenderer = GetComponent
[p.211: 코드 30번행 바로 아래]
다음 코드 추가
return true;
[p.212: 코드 50번행 바로 아래]
다음 코드 추가
[p.215: 1번행]
편집하기 위해 BoardManager.cs 스크립트를 연다.
→
편집하기 위해 GameManager.cs 스크립트를 열어 위쪽에 public int enemySpawnRatio = 20;를 추가하고 나서 BoardManager.cs 스크립트를 연다.
[p.216 : 코드 9행]
(추가 설명) public bool checkValideTile 함수는 GameManager가 아니라 BoardManager에 속해 있어야 한다.
* 아래 내용은 원문에는 없지만 내용이 생략돼 있어 독자의 이해를 돕기 위해 역자가 추가한 문장이다.
[p.141: 아래에서 5행]
다음 문장 추가
▶ 4. Exit 타일을 드래그해 inspector 탭에 있는 Board Manager의 Exit 필드에 놓는다.
[p.219: 위에서 10행]
'이제 적과 세계 보드 생성 구현에 대해 충분히 작업했다.' 문장 앞에 아래 문장 추가
▶ Enemy 프리팹을 드래그해 inspector 탭에 있는 Board Manager의 Enemy 필드에 놓는다.
[p.226: 코드 위쪽 3행]
'이것은 그리 어렵지 않을 것이다.' 문장 뒤에 아래 문장 추가
▶ 먼저 MovingObject.cs에서 boxCollider 변수의 접근 모드를 private에서 public으로 변경한다.
* 유니티 2017.1.x 버전의 경우 2장에서 No cameras rendering 오류, 4장에서 Exit 트리거가 안 먹히는 오류가 발생할 수 있다.
유니티 버그로 추정되며 유니티에서는 패치 버전을 내놓고있지만 그래도 해결이 안되면 다운로드 소스 파일에 해결책 txt 파일을 포함시켰으니 참고하기 바란다.