14.1 게임월드의 구조

14.1.1 게임 월드의 요소

대부분의 비디오 게임들은 2차원 또는 3차원의 가상 게임월드에서 이루어지는데, 이 가상 월드는 여러 가지 개별적인 요소들로 구성된다. 일반적으로 이 요소들은 크게 정적요소와 동적요소로 나눌 수 있다.

정적 요소는 지형, 건물, 도로, 교량 등과 같이 움직이지 않거나 게임플레이와 적극적인 상호작용을 하지 않는 것들을 의미한다.

나머지들은 다 동적 요소이다.

 

일반적으로 게임플레이는 주로 동적 요소를 다루게 된다.

게임월드의 동적요소 전체를 나타내는 용어로서 게임 상태 (game state)라는 용어를 사용하기로 하자

 

정적요소와 동적요소를 구분하게 되면 최적화에 활용할 수 있다. 예를 들어 어떤 메쉬가 정적이어서 움직이지 않는다면 정적 정점 조명, 조명 맵, 그림자 맵, 정적 환경 차폐 정보, PRT, 구면 조화 함수 계수를 사용한 방식으로 조명을 미리 계산할 수 있다.

 

14.1.1.1 정적 기하

정적 요소의 기하는 주로 마야(Maya)와 같은 도구를 사용해 만드는데, 커다란 하나의 삼각형 메시로 만들거나 또는 여러 개의 작은 조각으로 분해하여 만들게 된다. 화면의 정적인 부분은 인스턴싱된 기하를 이용해 만드는 경우도 있다.

 

정적 시각요소와 충돌 데이터(충돌 기본 단위)는 브러시 기하를 이용하여 만들 수 있다. 브러시는 여러 볼록 다면체들이 모여서 만들어진 모양을 의미하며, 브러시 기하는 빠르고 만들기 쉬우며 BSP 트리를 기반으로 하는 렌더링 엔진에 잘 통합될 수 있다. 

 

14.1.2 월드 청크

게임 월드는 메모리의 제한, 게임흐름 조절의 필요성, 개발 과정에서 분업의 필요성 등의 이유에 따라 청크로 나누어진다.

 

14.1.3 하이레벨 게임흐름

하이레벨 게임흐름이란 플레이어의 목표를 선형적으로 또는 트리나 그래프와 같은 형태로 정의하는 것이다.

 

14.2 동적요소 구현하기 : 게임 객체

게임 월드 내의 동적요소들을 게임 객체라고 부르기로 한다.

게임 객체는 개체(entities), 액터(actors), 에이전트 (agent) 등 여러 가지 이름으로 불리고 있다.

 

게임 객체는 보통 타입에 따라 분류된다. 타입이 다른 객체들은 속성 스키마와 행위도 서로 다르다.

 

14.2.1 게임 객체 모델

게임 객체 모델은 특정 게임을 구성하는 개체들을 시뮬레이트하기 위하여 사용되는 구체적인 객체지향 프로그래밍 인터페이스다.

 

게임 객체 모델은 게임 엔진을 만들 때 사용한 프로그래밍 언어를 확장하는 경우가 많다.

ㄴ C++언어와 같은 객체지향 언어로 만들어진 게임의 경우에도 리플렉션, 지속성, 네트워크 복제 같은 고급 기능들을 추가할 수 있다.

ㄴ 게임 객체 모델은 여러 언어의 기능들을 혼합하기도 한다. 예를 들어 C언어 C++ 언어같이 컴파일이 필요한 프로그래밍 언어와 Python, Lua, Pawn 같은 스크립트 언어를 통합하여 양쪽 언어에서 모두 사용할 수 있는 단일화된 객체 모델을 제공할 수도 있다.

 

14.2.2 툴 측면 설계와 런타임 설계

기획자가 월드 에디터를 통해 보는 객체 모델이 런타임에 게임을 구현하기 위해 사용되는 객체 모델과 다를 수도 있다.

ㄴ 툴 측면 게임 객체 모델은 런타임에 C언어와 같은 객체지향 기능이 없는 언어로 구현될 수도 있다.

ㄴ 직관적으로는 하나의 툴 측면 게임 객체가 런타임에 하나의 클래스로 구현되어야 할 것 같지만 필요에 따라 여러 클래스의 모음으로 구현될 수도 있다.

ㄴ 툴 측면 게임 객체는 런타임에 고유한 id 하나가 되는 경우도 있다.

 

툴 측면 객체 모델은 기획자가 월드 에디터를 사용하면서 보게 되는 게임 객체 타입들이다.

런타임 객체 모델은 프로그래머가 툴 측면 객체 모델을 구현할 때에 사용한 프로그래밍 언어와 소프트웨어 시스템으로 규정된다.

 

14.3 데이터 주도 게임 엔진

데이터 주도 게임 엔진이라는 것은 게임의 전체 혹은 일부가 프로그래머가 개발한 소프트웨어 보다는 아티스트나 기획자가 만들어 낸 데이터에 의해 조정된다는 것을 의미한다.

ㄴ 모든 팀원들의 잠재력을 최대한 이끌어내고, 엔지니어들의 부담을 경감시킬 수 있기 때문에 개발팀의 효율을 개선할 수 있다.

ㄴ 게임 기획자와 아티스트들에게 데이터 주도적인 방식으로 게임 콘텐츠를 만들 수 있는 툴이 제공되어야 한다.

ㄴ 게임 기획자와 아티스트들이 자신들의 작업을 게임 속에서 미리 살펴보고 문제를 해결할 수 있는 도구도 제공되어야 한다.

 

데이터 주도 구조가 특정 게임을 기획하는데 미치는 영향이나 팀원들의 구체적인 요구사항들을 고려해보지도 않은 채 데이터 주도 구조를 만들려고 시도한다면 필요 이상으로 목표를 높게 잡거나, 너무 복잡하고 사용하기 힘든 툴과 엔진 시스템을 만들게 될 수 있다. 

 

14.4 게임월드 에디터

게임 플레이 공간에서 게임 월드 청크를 정의하고, 정적 요소와 동적 요소들을 생성하는 툴에 해당하는 것이 게임월드 에디터이다.

모든 상용 게임엔진에는 어떤 형태로든 월드 에디터 툴이 포함되어 있다.

일반적으로 게임월드 에디터에서는 속성값과 같은 게임 객체의 초기 상태를 지정할 수 있다. 또한 사용자가 게임월드 내에서 동적요소의 행동을 조절할 수도 있다. 이러한 작업은 데이터 주도적 설정 파라미터를 이용할 수도 있고, 스크립트 언어를 이용할 수도 있다.

14.4.1 게임월드 에디터의 일반적인 기능

 

14.4.1.1 월드 청크의 생성과 관리

게임월드는 보통 청크 단위로 만든다.

게임월드 에디터를 사용하여 새로운 청크를 생성할 수 있고, 기존의 청크에 대하여 이름을 바꾸거나 분해하거나 합치거나 없앨 수 있다. 각 청크들은 여러 개의 정적 메시나 AI 네비게이션 맵, 잡을 수 있는 물체에 대한 정보, 방어 지점에 대한 정보 등과 같은 여러 정적요소들과 연결될 수 있다.

 

하나의 청크를 하나의 배경 메쉬로 정의하는 엔진에서는 배경 메쉬가 없이는 청크를 만들지 못한다.

어떤 게임 엔진에서는 청크를 AABB, OBB, 임의의 다격형 영역과 같은 경계 볼륨으로 청크를 정의하고 그 안에 여러 개의 메시를 넣는다.

월드 에디터 중에는 지형이나 물과 같은 특별한 정적요소들을 저작하기 위한 전용 도구가 있는 것도 있다.

 

14.4.1.2 게임월드의 시각화

게임월드 에디터의 사용자(기획자, 아티스트)에게는 게임월드 콘텐츠를 시각화 하는 것이 중요하다. 그래서 대부분의 게임 월드 에디터에서는 3차원 투영기능이나 2차원 직각투영 기능을 제공한다.

 

어떤 에디터에서는 전문 렌더링 엔진을 직접 포함하고 있어서 이러한 시각화 기능을 직접 제공하기도 하고, 또 다른 에디터는 maya나 3ds Max와 같은 3D기하 에디터의 뷰포트 기능을 이용하여 시각화 기능을 제공하기도 한다.

 

14.4.1.3 네비게이션

사용자가 게임월드 내에서 물체를 배치하기 위해서는 카메라를 이동시킬 수 있어야 한다.(네비게이션)

직각 투영, 스크롤, 줌인/아웃, 특정 객체 주위 회전 기능이 필요할 수 있다.

 

14.4.1.4 선택

한 번에 하나의 객체를 선택할 수 있는 에디터도 있지만 더 발전된 에디터는 여러 객체들을 한번에 선택할 수 있다.

 

객체를 선택할 때는 직각 투영 화면에서 고무줄 박스를 이용할 수도 있고, 3D 화면에서 레이 캐스트 선택 기능을 이용할 수도 있다.

 

3D 화면에서 레이 캐스트를 이용하여 객체를 선택할 때 가장 가까운 객체를 선택하여 주는 대신 레이와 교차되는 객체들을 순서대로 번갈아 가면서 선택하여 주는 기능을 제공하는 에디터도 있다.

 

모든 월드 요소들의 이름을 스크롤 할 수 있는 형태의 리스트나 트리 형태로 보여주어 객체를 선택할 수 있도록 하는 에디터들도 있다.

 

14.4.1.5 계층

게임 객체들을 모아서 계층별로 관리하면 게임 월드의 컨텐츠들을 잘 정리할 수 있다.

계층별로 화면에서 보이거나 보이지 않게 설정할 수도 있고, 계층별로 색깔을 부여해 구별할 수도 있다.

분업을 할 때도, 계층을 이용할 수 있다.

각 계층들을 개별적으로 불러오거나 저장할 수 있는 에디터에서는 여러 사람이 동시에 하나의 월드 청크에 대한 작업을 하더라도 충돌이 발생하지 않도록 할 수 있다.

 

14.4.1.6 속성 그리드

게임 월드 청크에 있는 정적 및 동적요소에는 사용자가 수정할 수 있는 여러 가지 속성이 있다.

단순한 키-값의 쌍으로 정의되며 대부분의 에디터에서는 스크롤 할 수 있는 속성 그리드 창을 이용하여 현재 선택된 객체의 속성들을 보여준다. 사용자는 속성 그리드 창에서 직접 타이핑을 하거나 체크박스, 드롭다운 콤보박스를 이용하거나 스피너 컨트롤을 상하로 드래깅하여 값을 수정할 수도 있다.

 

14.4.1.7 객체의 위치 정하기와 정렬시키기

객체의 이동, 회전, 크기 변화 기능을 제공해야 한다.

객체를 특정위치에 배치하거나 정렬시키는 기능을 제공한다.

ㄴ 자석 기능 (snap to grid)

ㄴ 객체 기준으로 정렬하기 (align to object)

 

14.4.1.8 특수 객체 타입

조명

ㄴ 조명에는 메시가 없기 때문에 대개 특수한 아이콘을 이용하여 조명을 표현한다.

 

파티클 이미터

ㄴ 렌더링 엔진이 에디터와 독립되어 있다면 에디터에서 파티클을 시각화하는데 문제가 있다. 때문에 아이콘만을 사용해서 파티클 이미터를 보여준다.

 

음원

ㄴ 3D 렌더링 엔진은 음원도 3차원 입체로 모델링한다. 이러한 작업을 위해서 월드 에디터에서 전용 편집 툴을 제공하는 경우가 많다.

 

영역(트리거)

ㄴ 게임에서 객체가 어떤 공간에 들어가거나 나오는 등의 일이 발생했을 때에 이를 감지하거나 여러 가지 목적으로 공간을 나눌 때에 사용하는 입체 공간이다.

 

스플라인

ㄴ 스플라인이란 여러 개의 조절점들과 그 점에서의 접선 벡터로 정의되는 3차원 곡선이다. 

ㄴ 대개는 접선 벡터 없이 조절점으로만 정의되고 곡선이 모든 조절점들을 지나는 특성을 가지는 Catmull-Rom 스플라인이 많이 사용된다.

ㄴ 월드 에디터에서는 스플라인을 구성하는 개별 조절점을 선택하여 조정할 수 있는 기능과 객체(곡선) 전체를 선택하는 기능이 필요하다.

 

AI를 위한 네브 메시(nav meshes)

ㄴ 많은 게임에서 NPC들은 경로 찾기 알고리즘을 사용하여 게임월드의 탐색 가능 영역을 돌아다닌다. 이 때 AI 설계자들이 월드 에디터를 사용하여 탐색 가능 영역을 생성, 시각화, 수정한다. 예를 들어 네브 메쉬는 탐색 가능 영역의 경계를 쉽게 정의할 수 있도록 하는 2D 삼각형 메시로서 경로 검색기에게 연결 정보를 제공한다.

 

14.4.1.9 월드 청크의 저장 및 불러오기

불러오고 저장하는 월드 청크의 단위는 엔진마다 크게 다르다.

ㄴ 월드 청크 하나를 하나의 파일로 저장하는 엔진

ㄴ 계층을 개별적으로 저장하는 엔진

 

데이터 포맷도 엔진마다 다르다.

ㄴ 이진 포맷

ㄴ XML이나 JSON같은 텍스트 포맷

 

14.4.1.10 빠른 반복작업

어떤 에디터는 게임 속에서 직접 수행되면서 사용자가 수정한 효과를 즉시 확인할 수 있게 해준다.

 

오프라인으로 동작하는 에디터는 마야의 플로그인 형태로 동작하는 프로그램을 예로 들 수 있다.

'읽은 책 > 게임 엔진 아키텍처' 카테고리의 다른 글

15. 런타임 게임플레이 기반 시스템  (0) 2022.08.20
12. 충돌과 강체 역학  (0) 2022.08.17
11. 애니메이션 시스템  (0) 2022.08.13
10. 렌더링 엔진  (0) 2022.08.12
9. 디버깅과 개발 도구  (0) 2022.08.10

+ Recent posts