이제 게임들이 어떤 장르로 이루어져 있고, 어떤 기술이 사용되는지 이름 정도는 들어본 고등학생 K군. 그동안 들어온 풍월을 토대로 게임을 만들어 보려고 합니다. 그런데 게임을 만들려면 어떤 능력들이 필요할까요? 프로그램을 만드는 능력? 그림을 그리는 능력? 그리고 게임을 만들면서 공부할 것은 무엇일까요? 게임만 만들면 될 것 같은데, 다른 게임들을 보면 여러 가지 이상한 프로그램들이 필요한 것 같습니다. 전부 구입해야 하는지, 아니면 어떻게 구해야 하는지 정말 답답하기만 할 뿐입니다.
결국 K군은 예전 게임 개발자의 홈페이지에 다시 들렀습니다. “게임을 만들려면 어떤 프로그램이 필요한가요? 혹시 구할 곳이 있으면 알려주세요”라고 글을 남겼더니 개발자는 “만들어서 쓰세요”라고 짧게 답글을 달아 주었습니다. 역시 도움이 안되는군요. 과연 게임은 어떤 기술들을 사용해서 어떤 프로그램으로 어떻게 만들어야 할까요?
게임에 사용되는 기술
게임에 사용되는 기술은 여러 가지가 있으며 게임 장르에 따라 다르게 사용됩니다. 코드가 복잡한 여러 가지를 여기서 자세히 설명하긴 힘들겠지만, 개념적으로 어떤 것들이 필요한지 알려주고자 합니다.
그래픽 출력 기술
게임은 그 내용을 모니터를 통해 사람들에게 알려줘야 합니다. 이왕 보여준다면 좀 더 멋지게 보여주어야 하는데, 그러기 위해서는 많은 그래픽 기술이 필요합니다. 그래픽 기술은 기본적인 그래픽 데이터를 출력하는 기술과 특수효과를 출력하기 위한 특수효과 기술이 있습니다.
2D 방식이냐 3D 방식이냐에 따라서 그래픽 출력 방식은 많이 바뀌는데, 2D인 경우 2D 그래픽 데이터를 화면에 조합하여 출력시켜주는 단순한 역할을 하지만, 3D의 경우에는 수학적으로 만들어진 3D 모델 데이터를 각종 수학연산으로 2D화시켜서 모니터에 출력해야 합니다. 예전에는 이런 일들을 프로그래머가 직접 처리해야 했지만, 요즘은 그래픽 API라는 것들이 나와서 훨씬 편하게 작업할 수 있도록 도와주고 있습니다. 대표적인 것이 다이렉트X이며, 그외에도 오픈-GL과 같은 그래픽 API가 있습니다.
애니메이션
그래픽을 단순히 출력만 한다면 정지화상, 즉 그림을 한 장 보여주는 것밖에 되지 않는데, 앞에서 소개한 비주얼 노벨과 같은 경우에는 그림을 한 장 보여주고 명령어를 입력하는 방식이기 때문에 크게 상관이 없습니다. 하지만 캐릭터와 배경이 움직여야 하는 경우에는 단순한 그래픽 출력 기술 외에 다른 기술이 필요합니다.
만화나 영화를 보면 초당 프레임 수라는 것이 나옵니다. 영화의 경우에는 초당 24프레임, 만화의 경우에는 12프레임을 주로 사용하는데, 이것은 1초에 24장 혹은 12장의 조금씩 변화되는 그림을 연속 출력함으로써 잔상 효과에 의해 움직이는 것처럼 보이게 하는 기술입니다. 학창 시절 교과서 옆 자투리 공간에 연속되는 그림을 그려서 빠르게 책을 넘기면 그림이 움직이는 것처럼 보이던 장난과 같은 원리입니다.
2D의 경우에는 교과서 낙서처럼 그림을 여러 장 준비해서 연속적으로 보여주기만 하면 됩니다. 즉 애니메이션처럼 배경 위에 움직이는 캐릭터를 계속 교체하면서 출력해주면 됩니다. 큰 배경을 조금씩 움직여 주면서 캐릭터를 연속적으로 보여준다면, 캐릭터가 배경에서 움직이는 것처럼 보이게 할 수도 있습니다.
3D의 경우는 조금 다른데, 3D 모델 데이터들이 수학의 집합이었듯이 애니메이션 데이터도 수학의 집합입니다. 그래서 애니메이션을 만들기 위해서는 수학적 계산을 통해 이동한 이미지를 만들어 주어야 합니다. 즉 연속된 여러 장의 그림을 준비하는 것이 아니고, 연속된 수학 데이터로 애니메이션을 표현하는 것입니다. 2D 그래픽의 경우에는 애니메이션을 위해서는 프레임 수만큼의 그래픽 데이터가 더 필요하지만, 3D의 경우에는 수학적으로 변위만 저장하면 됩니다. 상대적으로 용량이 작고 2D처럼 최초에 그려진 그림 밖에 출력하지 못하는 것이 아니기 때문에 좀 더 부드러운 애니메이션을 표현할 수 있습니다.
지형 기반 기술
캐릭터가 있으려면 당연히 배경도 있어야 합니다. 배경은 여러 가지 방법으로 만듭니다. 2D의 경우에는 그림 파일들을 타일이라는 조각으로 나눠서 맵에디터란 툴로 찍어서 만드는 타일맵 방식이 있습니다. 예전에 그래픽 데이터들을 많이 사용하지 못하는 게임들이 넓은 배경을 만들기 위해 사용한 방법입니다. 요즘은 그래픽 데이터를 많이 사용할 수 있기 때문에 배경을 큰 그림 한 장으로 만들어서 출력하는 통맵 방식이라는 방식도 쓰입니다. 타일맵 방식은 RPG 게임들에서 많이 쓰이고, 통맵 방식은 어드벤처 게임과 같이 배경이 크지 않은 경우에 많이 사용됩니다. 물론 요즘 같은 대용량 PC가 많이 나오면서 대부분의 게임이 제작하기 어려운 타일맵 방식보다 통맵 방식을 선호하고 있습니다.
3D의 경우에는 외부배경과 내부배경으로 나눕니다. 즉 산과 강이 있는 외부배경의 경우에는 Height Field 방식으로 배경을 만드는데, 마치 등고선과 같이 그려진 그림으로 높낮이를 알아내서 3D 배경 모델을 만드는 방식입니다. 물론 배경이 무척 넓기 때문에 메모리 사용이나 렌더링 시간을 줄이기 위해 여러 가지 최적화 방법이 쓰입니다. 내부배경인 경우에는 자연물보다는 구조물이 많기 때문에 단순한 높이맵 같은 것보다는 3D 모델링 데이터 자체를 가지고 만들게 됩니다. 이 내부배경도 상당히 많은 메모리를 사용하기 때문에 다양한 최적화 방법을 사용합니다. 외부 지형을 가장 먼저 사용한 게임들은 플라이트 시뮬레이션 게임이었고, 내부맵을 많이 사용한 게임들은 FPS 게임입니다.
지형 기반 기술 중에 중요한 것은 어떤 식으로 공간을 나눌 것인가 하는 문제입니다. 큰 배경일 경우에 게임에서 한번에 보여지는 것은 상당히 작은데, 이 작은 부분을 빨리 골라내고 이 부분만으로 충돌, 렌더링 등의 처리를 해야 하기 때문에 공간을 분할하는 문제는 상당히 중요한 문제입니다. 지금은 여러 가지 연구가 되어 많은 솔루션이 존재합니다.
충돌 구현
배경과 캐릭터가 있을 경우 배경에서 캐릭터가 움직일 수 있는 곳이 있고 없는 곳이 있을 것입니다. 그렇다면 이 움직일 수 있는 곳과 움직일 수 없는 곳을 어떻게 처리해야 할까요? 이것이 충돌 기술입니다. 2D의 경우나 3D의 경우 마찬가지로 구현되는데, 3D의 차이라면 3차원이기 때문에 처리하는 값이 하나 정도 더 있어서 조금 복잡해진다는 정도일 것입니다.
첫번째 방법은 배경에 움직일 수 있는 곳과 움직일 수 없는 곳의 속성 정보를 담고 있어서 이 속성에 의해 충돌을 구현하는 것입니다. 즉, 움직일 수 없는 곳에 충돌을 하면 멈춥니다. 이 방식의 경우에는 2D와 3D 충돌이 그리 큰 차이를 가지지 않습니다. 대부분의 RPG 게임은 이 방식으로 배경과의 충돌을 구현하고 있습니다.
두번째 방법은 속성이 아니라 이미지 자체를 사용하는 것으로 이미지가 배경 이미지와 겹쳤는지를 검사하는 것입니다. 배경 이미지와 겹쳤으면 충돌한 것이므로 움직이지 못하게 됩니다. 3D의 경우에는 단순히 이미지가 아니기 때문에 수학적으로 표현된 물체가 서로 겹쳤는지를 검사합니다. 2D의 점을 검사하는 방법에 비해 3D에서 면을 검사하는 방법은 대단히 복잡합니다. 물론 이미지를 사용하는 방식은 2D 게임에서도 대전액션 게임 같이 캐릭터가 많이 나오지 않는 게임에만 사용되는 대단히 느린 충돌 방법입니다. 역시 3D에서도 계산이 많기 때문에 FPS 등의 캐릭터가 적게 나오는 게임에서 주로 사용됩니다.
그외에는 배경과 캐릭터가 아니라 캐릭터간의 충돌이나 캐릭터와 오브젝트간의 충돌 등이 있으나, 대부분 같은 충돌 방식을 사용하기 때문에 여기서는 제외하겠습니다. 이것 외에도 충돌 후에 어떤 일이 일어나는지, 움직이고 있는 캐릭터간의 충돌은 어떻게 구현하는지 등의 여러 가지 복잡한 처리가 남아있습니다. 이러한 처리는 뒤에 소개할 물리학 프로그래밍에서 언급하겠습니다.
사운드 출력
그래픽 출력만이 게임에서 중요한 요소는 아닙니다. 게임은 멀티미디어를 사용하는 애플리케이션입니다. 즉, 시각과 청각이 모두 즐거워야 합니다. 그렇기 때문에 사운드 출력 기술은 상당히 중요합니다. 사운드 출력 기술 중에 중요한 것은 배경음악과 효과음의 두가지입니다. 배경음악은 예전에는 미디나 CD 음원을 사용했는데, 요즘에는 mp3 등의 압축 음원을 사용하는 방법으로 바뀌고 있습니다. 배경음악을 출력하는 기술은 이러한 압축된 음원을 얼마나 잘 출력하느냐에 따르는데, 다이렉트X에서 미디어 코덱을 이용한 방법으로 구현이 가능합니다.
효과음은 음악과 달리 짧은 사운드로 이루어지는데, 2D일 경우에는 단순하게 처리될 수 있었지만, 요즘은 3D 게임이 많이 등장함으로써 사운드도 3D 음원을 사용하게 되었습니다. 캐릭터와의 거리나 위치에 따라 사운드가 주위에서 서로 다르게 출력되는 것인데, API에 따라 5.1채널 스피커까지 지원합니다. 다이렉트X의 기능 중 하나인 DirectSound를 이용해 구현이 가능합니다.
동영상 출력
게임을 시작하면 당연히 동영상으로 게임회사 로고나 게임의 타이틀 동영상이 나옵니다. 예전에는 단순히 타이틀 동영상이나 오프닝, 엔딩 동영상을 보여주는 수준이었지만, 지금은 게임 내 전광판 같은 곳에서 동영상이 나오거나, 동영상이 흐르는 가운데 캐릭터가 움직입니다. 3D 화면상에서 동영상을 출력하는 기술은 상당히 어려운 기술이었지만, 다이렉트X 9.0이 발표되면서 VMR 기능을 강화하면서 보편화되고 있습니다.
물리학 프로그래밍
당구공과 같은 물체가 벽면에 충돌하거나 당구공끼리 충돌한 경우에는 당연히 동역학 시뮬레이션을 통해 결과를 알아낼 수 있습니다. 게임에서도 이러한 일이 비일비재하게 일어나다보니 이러한 것들을 계산하여 적용할 필요가 있는데 이것이 Physics 즉, 물리학 프로그래밍입니다. 물리학은 단순한 충돌뿐만 아니라 차량의 주행역학, 비행기의 항공역학과 같은 것도 처리하게 됩니다. 학술적인 목적으로 만들어지는 시뮬레이션이 아니기 때문에 아주 정밀한 계산이 요구된다기보다는 적당한 계산량으로 실제와 비슷한 결과를 나타내는 것이 관건입니다. 그래서 많은 트릭들이 사용되는 기술 분야입니다. 물리학은 3D 게임에서 좀 더 많이 사용되기는 하지만, 2D 게임에서도 상당히 오래 전부터 사용되었습니다. 단지 2D와 3D의 축 개수 차이 때문에 3D 물리학은 상당히 고난이도입니다.
스크립트 기술
RPG 게임들을 보면 상당히 많은 대사와 연출을 가지고 있습니다. 이런 경우 프로그래머가 직접 프로그램 내에 대사나 연출을 집어넣는 것이 아니라 스크립트라는 데이터에 어떤 대사가 어떤 시기에 어떤 방식으로 출력되는지, 어떤 행동을 하는지에 대한 사항들이 저장되고 이 저장된 데이터를 게임 프로그램에서 읽어서 지정한 행동을 합니다.
해당 행동을 하기 위해서는 많은 조건을 판별해야 하는 경우가 있기 때문에 조건문이라든가, 반복문과 같은 프로그램의 기초적인 문법을 사용할 수 있어야 쉽게 작성이 가능합니다. 많은 RPG 게임이나 어드벤처 게임에서는 간이 언어 수준의 스크립트 언어를 작성하여 게임의 거의 모든 사항을 컨트롤하도록 하고 있습니다.
하프라이프와 같은 경우에는 이러한 스크립트만을 수정하여 카운터 스트라이크라는 완전히 다른 게임을 만들어 낼 정도로 강력한 스크립트 엔진을 탑재하고 있습니다. 이러한 스크립트 기술은 간이 언어를 만들고, 컴파일하고 이것을 다시 읽어서 게임 내에서 구동시키는 기술을 필요로 하며, 컴파일러론과 같은 학문의 도움을 많이 받고 있습니다. 물론 앞에서 설명한 것처럼 좀 더 쉽게 작성된 스크립트를 사용하고 있으며, 자바, 파이썬이나 Lha와 같은 기존의 스크립트 언어를 게임 내에서 사용하는 경우도 있습니다.
입력 시스템
출력에 관한 기술에 대해서 중점적으로 알아보았는데, 게임이란 것은 인터랙티브한 것으로 사용자의 입력이 게임에 중요한 역할을 합니다. 즉, 다양한 입력 방법을 제공하고 좀 더 쉽고 단순하고 조작하기 편리한 인터페이스를 제작할 필요가 있습니다. 게임의 인터페이스는 PC인 경우에는 마우스와 키보드, 게임패드, 조이스틱 등이 있으며, 게임기의 경우에는 게임패드, 레이싱 휠, 컨트롤러 등의 일반적인 입력 인터페이스와 게임 전용의 컨트롤러가 따로 있는 경우도 있습니다(전용 컨트롤러를 사용하는 게임으로는 대표적으로 DDR이나 비트매니아, 철기와 같은 게임이 있습니다). 요즘에는 진동을 지원하는 게임 인터페이스들이 많이 제공되기 때문에 이러한 인터페이스들을 게임에 맞게 활용하고 제어하는 기술이 필요합니다.
지금까지 많은 기술에 대해 알아보았습니다. 게임을 만들기 위해 기본적으로 필요한 기반 기술이라고 할 수 있습니다. 이러한 기술들이 갖추어진 상태에서야 게임을 제작할 수 있습니다. 하지만 이러한 기반 기술을 전부 갖추기까지는 많은 기간이 필요하며, 혼자의 힘으로 모든 것을 만들기는 매우 힘듭니다. 앞의 요소들은 대부분 엔진이란 이름으로 판매되고 있는 것들이 많습니다. 렌더링 엔진, 물리학 엔진, 사운드 엔진, 동영상 엔진, 스크립트 엔진 등 각각의 분야별로 엔진이 판매되고 있으며, 이러한 엔진들의 기능을 한꺼번에 제공하는 게임 엔진들도 많이 판매되고 있습니다. 하지만 이러한 엔진들의 가격은 상당히 고가의 엔진이라 공부하는 입장이나 처음 게임을 만드는 입장에서는 생각하기 힘듭니다.
게임을 구성하는 요소
지금부터는 게임에 필요한 요소들을 짚어보도록 하겠습니다. 필요한 요소들을 안다면 먼저 어떠한 것을 만들지, 그것들을 만들기 위해 무엇이 필요한지를 알게 될 것입니다.
프로그램
컴퓨터 게임은 컴퓨터 위에서 돌아가는 일종의 애플리케이션 프로그램입니다. 어쩌면 가장 기초적인 부분이라고 할 수 있습니다. 그러므로 게임 프로그램이 필요하고 이것을 만들기 위해 컴파일러가 필요합니다. 컴파일러는 컴퓨터 프로그래밍 언어로 작성된 프로그램 소스를 컴퓨터에서 구동되는 실행 파일로 만들어주는 프로그램입니다. 대표적인 컴파일러는 비주얼 C, 델파이, C 빌더 등이 있습니다. 이 컴파일러 프로그램을 사용해서 프로그램을 작성하고 구동할 수 있도록 합니다. 국내에서는 C 계열의 컴파일러로 작업을 많이 하는데, 구입하기 편하고 다이렉트X 등과 연계 작업이 편한 마이크로소프트 계열의 컴파일러를 선호합니다.

그래픽 데이터
게임 속에 들어가는 다양한 그림들은 무엇으로 만들어지는 것일까요? 필자가 처음 게임을 만들 때는 그 그래픽들이 전부 프로그램 소스 속에 있는 줄 알았습니다. 지금 생각하면 미련하기 그지 없는 생각이지만, 컴맹이었던 그 시절에는 그렇게 생각할 수밖에 없었습니다. 그래서 게임을 처음 만들 때는 게임의 그래픽을 전부 코딩해서 집어넣었습니다(삼각함수나 원을 그리는 함수를 가지고 캐릭터를 만들었습니다). 지금도 그렇게 생각하는 사람들이 간혹 있을지도 모르겠습니다. 게임 에 들어가는 다양한 그림들은 대부분 그래픽 툴이라는 프로그램을 사용해서 그린 것입니다.
그래픽 데이터는 앞에서 언급한 바와 같이 크게 2D 데이터와 3D 데이터로 나눌 수 있습니다. 2D 데이터는 보통 볼 수 있는 일반적인 그림을 컴퓨터에서 작업한 것을 말합니다. 3D 데이터는 3D 그래픽 툴을 통해서 만들어진 입체적인 그래픽으로, 그림이라기보다는 수학적 데이터의 집합이라고 볼 수 있습니다. 이 3D 데이터를 만들고 보여주기 위해서는 2D보다 좀 더 많은 기술을 필요로 합니다. 2D로 만들어진 그림이나 3D로 만들어진 모델링 데이터, 그리고 애니메이션을 위해 필요한 애니메이션 데이터 등을 모두 총칭하여 그래픽 데이터라고 부릅니다.
만약 일반적인 그림이라면 포토샵 등을 이용해서 그린 그림을 게임 내에서 불러와서 보여줄 수 있을 것입니다. 하지만 3D 캐릭터가 나오는 게임에서는 어떤 것으로 만들까요? 물론 3D 그래픽 툴이 있습니다. 들어봤는지 모르겠지만, 3D STUDIO MAX, MAYA, SOFT IMAGE 등의 프로그램을 이용해서 게임 내에 들어가는 3D 그래픽들을 만듭니다.

캐릭터 데이터
그래픽 데이터 중에 움직이는 것들을 캐릭터라고 하는데, 이 캐릭터를 만들기 위해서는 애니메이션처럼 움직임을 모두 그림으로 그려놓고 이것을 애니메이터와 같은 프로그램으로 조합해야 합니다. 물론 3D는 그림으로 하는 것이 아니기 때문에 애니메이션을 수학적 형태로 저장해 놓고 이것을 연산하여 사용합니다. 이것 역시 애니메이션을 지정하고 저장해야 하는 것은 마찬가지입니다.
캐릭터 데이터는 여러 개의 그래픽 데이터들을 하나의 캐릭터에서 사용하도록 연관성을 지워주는 데이터로, 상황에 따라 보여줘야 할 애니메이션 등을 지정하여 저장하는 역할을 합니다. 즉 각 그래픽 데이터가 어떤 상황에 출력되어야 하는지, 어떠한 그래픽 효과가 어느 시점에서 출력되어야 하는지, 상황에 따라 어떤 효과음이 출력되어야 하는지 등을 캐릭터 에디터 또는 캐릭터 애니메이터라고 불리는 커스텀 툴을 사용해서 지정합니다. 보통 캐릭터에 사용되는 그래픽 포맷은 게임회사마다 자체적으로 만든 포맷을 사용하기 때문에 이 툴도 자체 제작합니다. 포토샵이나 3D 그래픽 툴에서 제작된 그래픽 데이터는 자체 포맷으로 변환한 후에 캐릭터 에디터를 통해서 상황별로 애니메이션이 조합됩니다.


맵 데이터
실제 게임은 캐릭터가 돌아다니면서 놀아야 할 공간이 필요합니다. 그 공간을 저장한 데이터를 맵 데이터라고 부릅니다. 일단 맵도 보여주어야 하는 것이기 때문에 그래픽 데이터를 가지고 만들어야 합니다. 맵 또한 2D와 3D로 크게 나누며, 2D에서도 여러 가지 방식으로 맵을 만들 수 있습니다. 일반적인 탑뷰라고 불리는 방식과 아이소매트릭뷰, 즉 쿼터뷰라고 불리는 방식, 옆모습이 나오는 사이드뷰 등 상황에 따라 맵을 만드는 방식은 달라집니다.
3D의 경우에는 시점이 자유롭기 때문에 보여지는 방향에 따라 맵을 나누는 것이 아니라 지형을 나타내는 맵인지, 아니면 실내를 표현하는 방식인지를 나눕니다. 이를 아웃도어, 인도어라고 구분하여 부릅니다. 맵은 같은 장르라도 게임의 성향에 따라 그 형식이 많이 바뀝니다. 디아블로와 이스는 맵의 형식이 다른 예입니다. 맵 에디터는 자신이 제작하려는 게임의 성향에 맞추어서 만들어진다고 볼 수 있습니다. 요즘의 맵 에디터를 보면 단순히 맵을 만들고 꾸미는 기능 외에 오브젝트를 배치하고, 각 오브젝트가 어떠한 기능을 가지는지를 지정하거나 맵 상에 존재하는 몬스터나 NPC 등을 배치하기도 합니다.


게임 내 테이블 데이터
게임을 하다보면 매우 많은 캐릭터와 아이템을 만나게 됩니다. 물론 그래픽은 캐릭터 데이터 등으로 이루어져 있지만, 해당 캐릭터의 이름이나 능력과 같은 부분은 캐릭터 데이터에 포함되지 않는 경우도 많습니다. 아이템 또한 마찬가지입니다. 그래서 아이템이나 캐릭터 또는 마법 등의 각종 테이블에 의해 작성되는 데이터들이 사용됩니다. 이 데이터들에는 그래픽 데이터가 포함되기도 하지만, 보통은 그래픽보다는 실제적인 수치가 중요한 데이터들입니다.
게임마다 사용되는 데이터가 다르기 때문에 이 DB 툴도 자체 제작하는데, 보통은 엑셀이나 액세스에서 만들어진 데이터를 읽어서 컨버팅하는 툴도 많이 제작됩니다. 또는 직접 ODBC를 사용해서 DB에 입력하고 이것을 게임에 맞게 출력하게 하는 툴을 제작하기도 합니다. 이 DB 툴은 게임마다 다른 툴을 제작하는 게 일반적인 경우이며, 범용성을 가진 툴을 만들기는 매우 힘듭니다.

스크립트
게임을 보면 NPC들이 적절한 곳에서 적절한 행동과 어울리는 대사를 합니다. 또는 플레이어가 보스를 쓰러뜨리면 멋진 이벤트씬이 연출됩니다. 이러한 일련의 이벤트들은 거의 모든 경우 스크립트라는 게임 내의 언어로 구성됩니다. 게임 내에 간단한 전용 컴파일러를 넣어놓고, 프로그래머가 아닌 기획자 등이 구성한 스크립트를 컴파일하여 이벤트를 연출하는 것으로, 대부분의 게임이 이러한 스크립트 기능을 가지고 있습니다.
퀘이크나 언리얼 등의 게임도 이러한 스크립트를 가지고 몬스터의 A.I라든가, 이벤트 또는 게임 룰 등을 조절합니다. 게임의 거의 모든 것을 조작하는 것이 바로 이 스크립트이며, 이 스크립트로 게임을 구성하는 것이 게임 제작의 대부분을 차지합니다. 이 스크립트 언어는 직접 제작하거나 이미 존재하는 Lua, 파이썬 등의 스크립트 언어를 사용하고 있습니다. 간단히 구현하기 위해서는 스크립트 언어를 직접 설계하는 편이 낫다고 할 수 있습니다. 스크립트 에디터는 직접 구현하기도 하지만 대부분 텍스트 에디터를 사용해서 작성하고, 컴파일러를 작성하여 컴파일하곤 합니다. 물론 상용화된 엔진 등에서는 스크립트 에디터와 컴파일러, 테스트 프로그램까지 제공합니다.

음악과 효과음
얼마 전까지만 해도 음악이나 효과음이 게임에서 차지하는 비중은 그리 크지 않았습니다. 그러나 게임들이 점점 방대해지고, 연출이 강화되면서 효과음의 비중은 매우 높아지고 있습니다. 음악의 경우에는 스토리성이 강한 RPG나 어드벤처 게임에서 큰 비중을 가졌으나, 지금은 거의 모든 게임의 음악이 많은 비중을 가지며 가까운 일본의 경우, 게임 음악만으로 이루어진 음반이 시중에 판매되기도 합니다.
게임은 멀티미디어 저작물에 속합니다. 멀티미디어라면 화면에 멋진 그림이 나오고 귀를 즐겁게 해주는 음악이나 소리가 나와야 합니다. 즉 사운드 편집 툴과 작곡 툴이 필요합니다. 간단히 제작하기 위해서는 비교적 가격이 저렴한 사운드 편집 툴과 작곡 툴이 있으나, 대부분 고가의 프로그램으로 일반적인 게임회사에서도 구입을 꺼려합니다. 일단 간단히 사운드를 편집하려면 윈도우에 내장된 녹음기 정도로도 충분하다고 생각하긴 하지만, 실제로 게임에 쓰이는 효과음 사운드와 음악은 상당히 고가의 장비와 소프트웨어를 사용한 전문 스튜디오에서 작업되고 있습니다.
게임을 만드는 사람들
게임 제작은 매우 많은 작업을 요구합니다. 각 작업에서 요구하는 덕목도 상당히 틀리기 때문에 모든 작업을 혼자 하는 것은 거의 불가능에 가깝다고 할 수 있습니다. 각자 전문 분야를 살려 작업하는 것이 최고라고 할 수 있습니다. 그렇다면 게임을 만드는 사람들은 어떤 사람들이 있고 그 사람들이 하는 작업은 무엇일까요?
기획자
기획이란 말의 의미에서 알 수 있듯이, 게임의 전체적인 모습을 구상하고 구체화하는 사람들입니다. 맵 편집, 사운드 배치, DB 입력 등 실제적으로 거의 모든 게임에 사용되는 실제적인 데이터를 가공하는 역할을 수행합니다.
총괄 기획자
모든 기획의 총괄적인 진행을 맡는 사람으로 게임의 진행 방향과 개념을 정립하고, 이에 알맞게 업무를 조율하고, 결과물을 검토하는 작업을 합니다. 실제적인 실무를 한다고 할 수는 없지만, 게임을 만드는 데 가장 중요한 역할을 수행하는 사람입니다.
시나리오 작가
게임의 스토리를 작성하는 사람입니다. 게임의 이야기를 만들어내고, 그 이야기를 구성하는 대사들을 창작해 냅니다. 일정한 시나리오가 없는 온라인 게임에도 시나리오 작가가 투입되어 작업을 진행하는 등 시나리오 작가의 중요성이 높아지고 있지만 전문 인력은 거의 없다고 해도 과언이 아닙니다.
수치 기획자
시스템이 구축되고 게임이 만들어지면, 가장 중요한 밸런싱 작업이 남습니다. 이 밸런싱 작업에서 수치 기획자의 의도대로 난이도가 설정됩니다. RPG 등의 성장 개념이 있는 경우에는 수치 기획자의 역할이 매우 커지는데, 방대한 아이템과 성장에 의한 변수, 많은 몬스터 등으로 인해 난이도를 컨트롤하기 힘들기 때문입니다. 특히 온라인 게임에서 중요한 업무입니다.
레벨 기획자
레벨 기획자는 캐릭터 레벨이 올라가는 경험치를 기획하는 사람이 아니라 월드를 설계하는 사람입니다. 지형이나 지역을 설계하고 그에 맞는 조형물을 구상하고 배치를 하는 역할을 수행합니다. 레벨 기획을 어떻게 하느냐에 따라 게임 자체의 퀄리티가 달라 보일 만큼 매우 중요한 부분입니다. 특히 지형지물을 많이 사용하는 게임인 액션이나 FPS 게임들은 레벨 기획자의 몫이 매우 크다고 할 수 있습니다.
시스템 기획자
게임의 시스템을 구상하고 구체화시키는 역할을 하는 사람입니다. 게임에 스크립트로 이루어진 부분을 제외하고는 대부분이 이 시스템적인 요소로 만들어집니다. 타격 시스템, 액션 시스템, 대화 시스템, 아이템 시스템, 회복 시스템 등. 게임을 이루는 기초 요소이면서 특화시키는 요소를 만들어내는 업무를 하는 사람으로, 게임의 특성을 만드는 중요한 역할을 한다고 할 수 있습니다. 특히 요즘처럼 장르의 다변화 및 통합 현상이 두드러질 경우에 이러한 시스템 기획자의 기획이 더욱 중요해 집니다.
설정 기획자
보통은 시나리오 작가가 겸임하는 경우도 많은데, 게임의 기초적인 설정인 세계관, 배경 스토리, 캐릭터 설정 등의 작업을 합니다. 다양한 적들의 외형과 특성을 설정하고 이것을 게임 시스템에 접목시키는 역할도 수행합니다. 시나리오 작가와 다른 점은 시나리오 작가는 말 그대로 작가인 반면, 설정 기획자는 스토리텔러(이야기꾼)에 가깝다는 점입니다. 시나리오 작가처럼 치밀한 구성을 필요로 하지는 않지만 많은 아이디어가 필요합니다.
프로그래머
두 말할 필요가 없겠죠. 기획자들이 구상한 여러 가지 기획과 그래픽 디자이너가 만들어낸 그래픽 데이터, 사운드 엔지니어가 만들어낸 효과음과 음악을 컴퓨터에서 구현하는 사람들입니다.
툴 프로그래머
프로그래머가 게임계에 첫발을 내딛으면 맨 처음하는 일이 바로 툴을 만드는 일일 것입니다. 사실 툴은 게임 전체적으로 굉장히 많이 사용되고, 꼭 필요하면서 누구도 작업하기 꺼려하는 물건입니다. 그만큼 인터페이스란 것을 만들기 까다롭기 때문인데, 상용 게임 엔진들도 모든 툴이 제대로 구비된 엔진은 그리 많지 않고, 그 대부분은 인터페이스가 별로 좋지 않습니다.
툴 프로그래머는 게임에서 자체적으로 개발해야 하는 다양한 툴들을 작성합니다. 특히 DB 툴과 같은 경우에는 기획서에 맞게 작성돼야 하며, 만약 게임 엔진이 따로 있는 경우 엔진에 맞는 데이터 포맷으로 데이터를 가공할 줄도 알아야 합니다. 툴 프로그래머는 엔진과 기획, 게임 모두의 연결고리가 되는 만큼 한번 작업을 하면 게임의 전체적인 구조를 파악하기 쉽습니다.
엔진 프로그래머
툴을 만들거나 게임을 만들기 위한 하부 구조를 만드는 작업이 바로 엔진 작업입니다. 앞에서 설명한 많은 기술들을 모아 게임에 맞게 수정하여 쓰기 좋게 포장한 것이 바로 엔진입니다. 물론 이러한 각각의 구성 요소가 서로 이질감 없이 조화되어야 좋은 엔진입니다. 앞에서도 설명한 바와 같이 엔진 작업은 혼자서 전부 작업하기 굉장히 까다롭고 분량도 많기 때문에 보통 여러 파트의 전문가들이 모여서 작업하곤 합니다.
게임 프로그래머
엔진과 툴에서 만들어진 데이터들을 가지고 실제 게임을 만드는 작업입니다. 툴과 엔진만 있으면 게임을 만들 수 있을 것 같지만 실제로 가장 중요한 것은 게임 프로그래밍으로, 아무리 기술이 좋고 데이터가 견고하고 방대하더라도 게임이 재미없으면 그만입니다. 게임 프로그래머는 프로그래밍도 중요하지만, 기획자가 의도하는 게임의 재미를 충실히 재현하는 능력이 있어야 합니다. 이는 프로그래밍 능력이라기보다 게임에 관한 감각이라고 할 수 있습니다. 게임에 관한 감각은 몇 년 정도 게임업계에서 일하다보면 자연스럽게 익히게 되는 것입니다(사실 게임만 많이 해봐도 알 건 다 알게 됩니다).
그래픽 디자이너
게임의 얼굴인 그래픽을 만드는 사람들입니다. 요즘엔 거의 3D 관련 작업이 주를 이루기 때문에 3D 관련 작업자들만 예를 들어 보겠습니다.
원화 디자이너
캐릭터나 배경의 디자인을 하는 사람들입니다. 기획에서 주어진 여러 가지 특이사항을 가지고, 디자인하여 실제 작업자들이 작업이 가능하도록 만드는 역할을 합니다. 실제 데이터가 어떻게 제작되고, 제약사항이 어떠한지 파악하는 능력이 있어야 게임 내에서 제대로 소화되는 디자인을 창출할 수 있습니다.
캐릭터 모델러
3D 모델링 툴을 사용해서 캐릭터를 만드는 사람들입니다. 게임에서 사용할 수 있는 폴리곤 수 등 여러 가지 제약 조건을 가지고 캐릭터를 만드는데, 이때 한정된 제약 조건에서 가장 좋은 퀄리티의 작업물을 만들기 위해서는 상당히 많은 수련이 필요합니다.
캐릭터 애니메이터
캐릭터 모델러가 제작한 모델 파일을 가지고 애니메이션을 작업하여, 캐릭터의 생명력을 불어넣는 역할을 합니다. 하나의 모델에 여러 가지 애니메이션이 적용되므로 대단히 많은 분량의 작업을 합니다.
배경 모델러
배경 전체 또는 배경에 사용되는 다양한 오브젝트들을 제작하는 역할을 합니다. 애니메이션이 필요한 경우, 복잡한 애니메이션이 아니라면 간단한 애니메이션은 직접 하기도 합니다.
레벨 디자이너
레벨 기획자가 레벨을 기획하면, 이것을 직접 그래픽으로 만드는 역할을 합니다. 레벨 기획에 맞는 여러 가지 장치들을 편집하고, 배경 모델러들이 작업한 각종 오브젝트들을 배치하는 작업을 합니다. 실제 거의 모든 데이터들은 레벨 디자이너의 손에 의해 게임에 배치된다고 할 수 있습니다.
일러스트 작가
게임을 홍보할 때 많이 사용되는 일러스트를 작업하는 사람들로, 게임의 첫 얼굴을 만드는 역할을 합니다. 실제 게임 데이터와는 조금 다르게 작업이 될 수도 있으나, 한눈에 게임의 이미지를 심어줘야 하는 만큼 게임의 이해도가 높아야 합니다.
사운드 엔지니어
게임을 생동감 있게 만드는 효과음과 음악을 만드는 사람들입니다. 현재 일반적으로 외주업체들에서 작업을 합니다. 크게 효과음 전문가와 작편곡 전문가 등으로 나뉘는데, 워낙 전문직종이라 필자도 파악이 잘 되지 않습니다.
게임 제작 과정
지금까지 게임을 만드는 기술과 만드는 사람들에 대해서 알아보았습니다. 그렇다면 게임은 어떤 순서로 만들어질까요? 마지막으로 게임은 어떤 순서로 어떻게 만들어지는지 알아보도록 하겠습니다.
초기 기획
게임을 만들기 위한 초기 상태의 기획을 합니다. 게임의 차별성, 특이점, 게임성 등 게임의 기본 요소들을 가지고 초기 기획을 합니다. 컨셉 수준에 머무르는 경우도 있고 좀 더 깊은 분야까지 기획하는 경우도 있습니다. 이때는 게임 개발진, 프로듀서, 경영진, 마케팅 담당자 등이 모여서 게임의 타겟층 분석과 시장 분석 등의 다양한 기초 자료를 통한 장르 및 소재 선택을 합니다. 물론 이러한 작업 없이 초기 기획을 마무리하기도 합니다.
프로토 타입 제작
초기 기획에서 돌출된 게임의 특성과 게임성 부분을 샘플로 만들어보는 기간입니다. 게임의 전체 모습보다는 특수한 몇 가지 부분만을 먼저 만들 수도 있는데, 게임 엔진을 전체 제작하고 만들지 않기 때문에 게임의 대강의 모습을 알 수 있도록 하는 목적입니다. 이때 게임성 등의 검증을 통해 해당 프로젝트를 어떤 식으로 수정할지 아니면 계속 진행할지 검토하는 단계를 거칩니다. 하지만 게임 개발사의 사정에 따라 축소되거나 생략되기도 합니다.
툴, 엔진 작업
초기 기획이 끝나고, 프로토타입 제작이 끝나면 실제 게임에서 사용될 툴과 엔진을 만듭니다. 보통 세부 기획 작업과 병행하는데, 엔진을 자체 제작하지 않고 구입하게 될 경우 엔진 연구 기간으로 사용되기도 합니다. 이 작업은 세부 기획 종료까지 진행되며, 데이터 작업 전까지 마무리되도록 조율합니다. 툴 작업의 경우에는 최초의 버전 작업 후 사용자의 요구에 따라 계속 기능이 추가되기 때문에 추가 작업이 계속됩니다. 엔진 또한 구입한 경우가 아니라면 기획에 따라 필요한 요소를 계속적으로 추가, 수정합니다. 게임 제작 중에도 요구에 따라 수정되지만, 이 기간 동안 전체적인 틀을 잡아나가는 기간이라고 보면 됩니다.
세부 기획
프로그램에서 툴 및 엔진 작업을 진행하는 동안 프로토타입을 통해서 얻은 결과를 토대로 게임의 세부적인 사항을 기획합니다. 이때 각종 설정이라든가 원화, 엔진의 테스트에 사용될 샘플 데이터 등 많은 사항이 진행됩니다. 이 때 게임의 최종적인 장르나 스펙이 결정됩니다. 물론 이러한 결정은 나중에 여러 가지 상황에 맞추어 변화되기도 합니다.
데이터 작업
세부 기획이 끝나면 게임에 사용될 각종 데이터들(앞에서 설명한 그래픽, 맵, DB 등 많은 데이터들)을 실제로 제작하게 됩니다. 툴 작업이 완료된 경우에는 바로 게임에 사용될 데이터로 만들기도 하지만, 툴 작업이 완료되지 않은 경우에는 그래픽 프로그램의 데이터 원본 상태까지만 작업하기도 합니다.
게임 프로그래밍
툴 작업이 완료된 시점부터 게임 자체를 만드는 작업에 들어가게 됩니다. 툴 작업이 완료되지 않으면 미리 만들어진 데이터들을 불러와서 사용할 수 없기 때문에 반드시 툴 작업이 끝난 후에 작업에 착수해야 합니다. 엔진의 경우에는 작업하면서 필요에 따라 부분적으로 계속적인 수정을 가하기도 합니다. 게임 프로그래밍의 순서는 다음과 같습니다.
데이터 입출력
툴에서 만들어진 각종 데이터를 읽고 화면에 출력하거나 게임에서 사용하는 기능을 만듭니다.
이동
그래픽 데이터와 캐릭터 데이터를 사용해서 만들어진 맵 위에 캐릭터를 생성하여 게임의 룰에 따라 움직여 봅니다. 각종 충돌 처리 등 기본적인 처리도 여기서 처리해야 할 몫입니다. 이 부분이 끝나면 게임의 기초적인 부분은 완료된 것입니다.
전투
게임의 가장 핵심적인 부분이 바로 전투입니다. 그 외에 전투에 파생된 각종 시스템들이 있는데, 이러한 부분을 작업하게 됩니다. 게임의 게임성에 직접 영향을 주는 부분이므로 이때부터는 기획자와의 조율이 상당히 많이 필요합니다.
인공지능
어떠한 게임이건 인공지능 캐릭터가 나와서 유저들을 괴롭히게 마련입니다. 기획자가 요구하는 바대로 움직이는 놀라운 인공지능까지는 아니라도 여러 가지 가능성을 가지고 있는 인공지능을 설계하고 적용시켜야 합니다. 인공지능의 경우에는 게임마다 적용 범위가 틀리므로 작업기간이 상황에 따라 매우 다릅니다.
인터페이스
인공지능 작업까지 마치면 게임의 인터페이스 작업이 진행됩니다. 이때 게임을 저장하고 불러오는 루틴 등도 작업합니다.
스크립트
게임의 연출이 필요한 부분에 사용되는 각종 스크립트를 작업하게 됩니다. 미리 약속된 규정에 의해 스크립트 파일들이 생성되어 있다면 이것을 게임에 적용시켜 게임에서 스크립트 명령어들을 구현하는 작업합니다.
효과
마지막으로 게임에 화려한 옷을 입혀줍니다. 각종 효과들로 게임을 치장하게 되는데, 효과를 사용하면 게임이 상당히 느려지므로 적당한 조율이 필요합니다.
알파 테스트
데이터 작업과 프로그래밍 작업이 종료되면 버그를 잡기 위한 알파 테스트가 실시됩니다. 일반인보다는 회사 내에서 실시하는데 각종 버그들을 찾고 그 버그 사항을 고칩니다. 국내보다 외국에서 상당히 발전했으며 게임의 전반적인 부분에 대한 버그 리포트를 받고 이것을 수정합니다.
밸런스 조절
알파 테스트가 종료되면 게임의 밸런스를 조절합니다. 처음 만들어진 밸런스를 게임에 맞도록 조율하는데 이 때 전체적인 게임성과 난이도가 결정됩니다.
베타 테스트
밸런스 조절까지 마치면 일반인이나 전문 테스터들을 대상으로 마지막 베타 테스트를 가지게 됩니다. 이때는 알파 테스트 때 진행됐던 버그 테스트와 밸런스 테스트를 병행하여 진행합니다. 베타 테스트를 충실하게 거쳐야 게임의 완성도가 높아진다고 할 수 있습니다.
구체적인 목표를 위한 지식
2회에 걸쳐서 게임이 과연 무엇이고 어떤 종류가 있으며 어떤 기술이 사용되고 어떠한 데이터들을 가지고 만들어지는지 그리고 실제 게임을 만들려면 어떠한 개발자들이 필요하고 그들이 어떠한 순서로 작업하는지 알아보았습니다.
사실 이러한 것들은 게임을 실제로 만들어보지 않으면 왜 이런 식으로 구분하는지, 왜 이렇게 진행하는지 알기 어렵습니다. 하지만 이러한 기초적인 지식을 가지고 자신이 어떠한 항목을 공부하고 차후에 어떠한 일을 하게 될지 알게 된다면, 게임을 만든다는 추상적인 목표가 아니라 좀 더 구체적인 목표가 생길 것이라는 생각에 이러한 지리한 지면을 꾸며 보았습니다. 게임을 공부하려는 학생들에게 조금이라도 도움이 되었으면 하는 작은 바람입니다.
추후에 기회가 된다면 자그마한 게임이라도 같이 만들어 보면서 게임에 대한 기술과 구현 방법에 대해 짧은 지식이나마 알려 줄 수 있는 시간이 생긴다면 좋겠습니다. @