<정리·문제 출제> 최성
게임시스템 설계 및 연출
<게임엔진설계>
게임엔진이란 어떤 게임에도 사용할 수 있는 핵심 기술을 포함한 API·애플리케이션프레임워크·네트워크·데이터베이스·그래픽스 등 게임 로직 하부의 영역에 해당하는 것을 모아 놓은 것을 의미한다.
유명 게임회사들은 게임엔진을 라이선스 형식으로 판매하고 있으며 이런 상품에는 언리얼엔진, 네틀머스NDL, 샤크3D 등이 있다. 그러나 보통 게임엔진은 그 회사에서 나오는 특정 게임장르에 맞도록 설계돼 있는 경우가 많아서 확장성이 떨어지고 수정될 때마다 교육을 다시 받아야 하는 어려움이 있다.
게임엔진 설계는 크게 ‘그래픽엔진’ ‘사운드엔진’ ‘입력엔진’ ‘인공지능엔진’ ‘이벤트엔진’으로 구분된다.
◇그래픽엔진=각 엔진이 갖고 있는 각각의 요소와 그 기능을 살펴보면 그래픽엔진에서는 5가지 요소를 볼 수 있다.
첫째는 ‘2D 화면처리’ 방법은 현재 보여지고 있는 화면을 ‘주버퍼’로 사용하고 실제로 그림을 그리게 되는 곳은 ‘백버퍼’로 사용한다. 다른 말로 프레임 버퍼라고도 하며 그래픽 및 텍스트를 이곳에 블리트한다. 블리트라는 것은 주로 BMP 데이터를 화면으로 가져올 때 축소 등을 하면서 임의의 위치를 지정하는 기능을 하는 것이다. 일반적으로 다른 버퍼의 4각형 영역 호출시 사용된다. 또 다른 버퍼로 플리핑 이라는 것이 있는데 이는 백버퍼와 보조버퍼의 내용을 주버퍼로 한꺼번에 옮겨오는 역할을 한다. 디스플레이하는 속도가 비디오 메모리에 담겨져 있는 화면이 변하는 속도를 따라잡지 못할 때 티어링 현상이 발생하는데 이 현상을 방지하기 위해 사용하는 방법이다.
두번째로 3D 화면처리기술 중 ‘월드변환’이라는 방법은 모델을 실제 세계로 위치시키는 것이다. 월드변환을 거쳐서 나온 정점을 카메라 공간에 배치시키는 작업을 하게 되는데 그 작업 과정을 ‘뷰 변환’이라 부른다. ‘프로젝션 변환’은 카메라 내부를 제어하는 일을 해주는 개념으로 카메라를 위해 교환렌즈를 선택하는 것으로 이해하면 된다. 이 과정은 변환타입 중 가장 까다로운 처리과정을 거치게 된다. 3D 화면처리에서 ‘라이트와 질감’의 요소를 빠뜨릴 수 없는데 질감은 객체의 표면에서 빛이 어떻게 반사됐는지를 정의하고 직접광과 주변광 레벨은 그렇게 반사되는 빛을 정의한다. 중요한 것은 장면에 객체의 윤곽만 보이는 결과를 방지하기 위해 꼭 라이트 처리를 거쳐야 한다는 점이다. 3D로 세밀한 입체효과까지 표현하려면 작업도 번거롭고 많은 시간과 공이 필요하기 때문에 보통은 객체의 컬러패턴과 그 패턴의 거침과 부드러움을 표현할 때 사용되는 ‘텍스처’ 방법을 주로 사용한다.
세번째로 ‘애니메이션’ 그래픽 엔진이다. 기능 중 ‘모핑’이라는 것은 한 형태가 다른 형태로 변형되는 것을 말하며 각각의 객체 정점이 위치를 조정하는 것과 두 개의 객체를 보관하는 것 등 두 가지 방법을 주로 쓴다. 인간이나 동물의 움직임을 만들기 위해 ‘본’이라는 기능을 사용하는데 뼈나 나무로 된 작게 제작한 동물 및 인간 인형을 사용해 움직임을 애니메이션하는 방법이다.
네번째로 ‘지형그리기’ 기능은 보통 4가지 요소가 있다. 맵을 그릴 때 사용하는 방법으로 ‘타일’ 기능을 사용하는데 통맵보다 타일맵이 중복되는 비트맵에 의해 낭비되는 메모리를 최소화할 수 있기 때문에 주로 쓰인다. BSP(Binary Space Partition) 기능은 이진으로 공간을 분할해 미리 공간을 계산한 후 실제 게임에서 빠르게 렌더링되도록 하는 방법으로 사용된다. ‘복셀(voxel)’이라는 기능이 있는데 볼륨(volume)과 픽셀(pixel)의 합성어로 지형지물 데이터를 만들 때 주로 쓰이며 대상물은 부피를 갖게 된다. 작은 정육면체 또는 부피요소로 나눠질 수 있는 오브젝트를 렌더링하는 기술이다. 그외 실내 환경에 대한 장면관리를 처리하는 데 효과적인 ‘포털 렌더링’ 기능이 있다.
마지막으로 ‘특수효과’ 그래픽 엔진은 필요한 연출을 극대화하는 중요한 요소다. 그 세부기능을 살펴보면 ‘알파 블렌싱’ 기능으로 픽셀을 뿌릴 때 투명 또는 반투명하게 뿌리는 데 사용되는 효과로 투명도는 알파값으로 조절할 수 있다. 무기나 아이템을 보게 될 때 혹은 숲속 이미지나 나무를 렌더링할 때, ‘빌보드’ 기법을 사용하는데 이는 2D 객체를 3D 객체로 보이게 렌더링함으로써 성능 측면에서 유리함을 얻기 위한 방법이다. 또 다른 특수효과로 불규칙적으로 움직이는 연기나 폭포 또는 중력의 영향을 받는 문제 등을 빠르고 멋지게 표현하고자 할 때 ‘파티클’ 시스템이 사용된다. 그외 배경에 움직이는 객체의 속도를 표현하거나 주변 이미지를 흐리게 만들어 실제감을 확장시키기 위해 ‘안개’나 ‘모션블러’와 같은 효과를 사용할 수 있다.
◇사운드엔진=‘사운드 엔진’은 각각의 상황에 맞는 음악을 채택하므로 부족한 게임 연출의 보충역할 또는 게임의 완성도를 높이는 역할로 유용하게 사용되는 부문으로 두 가지 형식이 있다. 하나는 ‘WAV 출력’ 형식으로 다양한 파일 형식이 중첩될 수 있는 일반 헤더·데이터 구조를 사용해 인코드될 수 있도록 노력하는 표준으로 정의할 수 있다. 또 다른 하나는 현재 시선이 모아지고 있는 ‘3D 사운드’다.
시장은 3D 사운드의 개발이 확산되고 이 기법은 진폭·주파수·사운드의 팬 변경 및 사운드가 양쪽의 귀에 도달하는 시간의 차를 주는 방법으로 개발한다.
◇인공지능엔진=‘인공지능 엔진’ 시스템은 보편적으로 사용되는 기능으로 ‘길찾기’ ‘유한상태 오토마타’ ‘게임물리학’으로 구분된다.
‘길찾기’는 장애물을 피하고 막다른 골목에 빠지지 않도록 하는 것으로 쉽게 생각하면 스타크래프트의 각 지상군 공격 유닛을 컨트롤할 때를 예로 들 수 있다.
‘길찾기’ 알고리듬의 종류로 ‘BFS(Breath First Search)’ ‘DFS(Depth First Search)’, ‘A*’ 등 3가지가 있다. ‘BFS’는 가장 철저한 탐색법으로 방향을 정하고 목표까지 거리를 계산하며 가장 빠른 길을 선택하는 것이다. 모든 방향을 검색하기 때문에 게임에 사용하기에는 너무 느려진다는 단점이 있다. 한정된 노드나 스텝을 가지고 있을 때 유용한 ‘DFS’ 방법은 길을 무작위로 선택해 목적지까지 랜덤한 방향으로 진행된다. 쉽게 말해 무조건 목표를 지향하며 나아가는 방법이다. 이 방법은 벽과 부딪히게 될 때 바로 이전 노드까지 되돌아가 다른 방향으로 탐색해 나아가게 된다.
‘A*’는 인접한 상태를 조사해 나아가면서 목표까지 가장 싼 비용의 경로를 찾는 알고리듬으로 이해하면 된다.
‘유한상태 오토마타’라는 인공지능 엔진은 유한한 개수의 상태로 구성된 하나의 간단한 기계로 FSM(Finite-State Machine)을 의미한다. 유한한 개수의 상태는 조건을 뜻하므로 예스 또는 노, 1 또는 0으로 반복적인 상태전이를 일으키게 된다.
이것은 감정을 흉내내기 위한 도구가 될 수 있고 게임의 상태를 관리하거나 플레이어로부터 입력을 해설하거나 어떠한 객체의 조건을 관리하는 도구로도 쓰일 수 있다.
다음으로 ‘게임 물리학’에 사용되는 인공지능 엔진에서 ‘실제 시뮬레이션’이나 또 다른 하나는 ‘과장된 게임’으로 분류할 수 있다. 과장된 게임의 경우 도무지 말이 되지 않아 물리학적으로 의미가 없어지는 경우인데 개발자가 임의로 그 법칙을 만들었을 때를 말한다.
시뮬레이션의 경우 정통 레이싱 게임으로 예를 든다면 실제 물리학 법칙이 적용돼야 한다. 기초적 물리법칙으로는 질량·시간·위치·속도·가속도·점·운동량 등이 있으며 추가로 중력효과 및 모형화로 사실적 충돌검사·단순운동학·마찰 등을 들 수 있다.
◇이벤트엔진=‘이벤트엔진’ 시스템의 여러가지 요소 중 ‘스크립트’는 게임의 어떠한 행동방식을 프로그램 코드 밖에서 정의하기 위한 하나의 수단이다. 보통 캐릭터 위치에 따른 이벤트 발생, 미션 완수, 실패, 판정 등에 사용되는데 시스템의 설계를 단순화할 수 있는 반면 스크립트에 너무 의존해 스크립트가 복잡해져 프로그래머가 엔진만 만들어 놓은 채 외면해 버리고 나머지 모든 프로그래밍은 스크립트 작성자가 떠맡는 상황이 발생할 위험이 있기 때문에 스크립트는 일을 편하게 하고자 하는 것이지 어렵게 만들기 위한 것이 아니라는 것을 인지하고 있어야 한다.
또 다른 요소로 일정한 상황을 각 캐릭터에게 인지시키는 작업을 하는 ‘메시지 처리’ 기능이 있는데 까다로운 작업 중 하나로 꼽힌다. 보다 수월하게 작업하기 위해 메시지에 의한 이벤트 핸들러를 구동하게 하는 방법이다. 상황에 따른 캐릭터의 처리를 정의해준 함수를 사용해 게임 제작의 편의성에 상당한 도움을 주게 되는 방법이다.
이벤트의 일부분인 ‘화면 인터페이스’ 설계시 유용성과 아름다움 두 가지를 모두 가지고 있어야 하며 게임을 즐기는 데 방해가 되지 않도록 구성하고 사용자가 처음에도 쉽게 사용할 수 있게끔 이런 요소를 고려해 설계해야 한다.
이벤트 엔진에서 가장 중요하다고 할 수 있는 ‘충돌 검사’ 기능이다. 예를 들면 비행기 슈팅게임을 하면 아군의 총알이 적군을 맞출 때 충돌이 일어나게 된다는 부분이다. 2D와 도트, 3D로 구분할 수 있다. 2D 충돌 체크는 충돌검사 할 부분의 영역을 사각형으로 미리 정한 다음 사각형이 충돌하는 여부를 검사한다. 2D 충돌 체크의 문제점에는 캐릭터가 대각선으로 배치돼 있을 경우 부자연스러운 충돌을 일으킬 우려가 있는데 해결방안으로 한 이미지 안에 복수의 사각형을 설정해 놓고 충돌검사를 하는 것이다.
도트 단위의 충돌검사는 점을 한 개씩 비교하며 충돌하는지 여부를 결정하는 것으로 가장 정확한 충돌검사인 반면, 충돌 체크할 캐릭터가 많아짐에 따라 기하급수적으로 느려지게 되는 단점이 있다. 3D 충돌 체크의 경우 경계구 충돌 검출법을 사용하는데 객체를 감싸는 구들의 반지름을 비교함으로써 객체와 개개의 충돌 여부를 판정하는 방식으로 가장 간단하고 이해하기가 쉽다. 삼각형 단위의 충돌 검출방법도 있는데 이 방법은 하나의 삼각형과 대상 삼각형의 평면사이 교점을 결정하고 그 점들이 대상 삼각형 안에 존재하는지를 검사함으로써 충돌을 판단한다.
◇입력엔진=‘입력엔진’ 시스템은 키보드와 마우스, 조이스틱 및 여러가지 주변기기를 사용해 사용자들에게 보다 나은 편의를 제공하는 데 의의를 둘 수 있다.
관련 통계자료 다운로드 네트워크 엔진 기능