게임을 만들기에 앞서 간단하게 게임의 구성에 대해 알아보자. 여기서는 잠시 플레이어의 관점 대신 게임을 만들 개발자의 시선으로 살펴볼 예정이다. 크게 게임의 구성은 게임 세계에 해당하는 부분과 정보 전달을 위한 UI로 구분한다.
세상엔 정말 다양한 형태의 게임이 있다. 평면 그림으로 그려진 2D 게임, 3D 모델로 만들어진 3D 게임, 텍스트만으로 이루어진 게임도 있고, 음성으로만 이루어진 게임도 있다. 어떠한 형태를 하고 있든 간에 플레이어의 상호작용과 이에 따른 피드백이 존재하고, 그것으로 재미를 느낄 수 있다면 그건 게임이라고 부를 수 있다. 이런 광범위한 개념 안에서 먼저 얘기하고 싶은 내용은 2D, 3D 그래픽으로 이루어진 게임이다.
게임을 구성하는 요소는 특별히 정해져 있지 않다. 배경이나 캐릭터가 있을 수 있고, 몬스터나 아이템이 있을 수 있다. 무엇이 구성품에 들어갈지는 정해져 있지 않지만 반드시 무언가는 게임을 구성하고 있게 된다. 그럼 이 구성 요소들이 지녀야 할 속성에는 무엇이 있을까? 게임 세계를 표현하기 위해서는 무엇이 필요할까? 지금부터 천천히 짚어보자.
어릴 적 즐겼던 도트 게임을 떠올려보자. 너무 추상적이라면 다음 이미지를 머릿속에 그려보는 것도 좋다. 어린 시절 도트 게임이 없던 시대에 태어난 독자들은 다음 그림을 참고하자.
평면의 캐릭터가 평면의 세계 위에 놓여 있다. 쉽게 말하면 ‘그림’으로 이루어진 게임 세계다. 이러한 형태를 2차원 공간이라고 한다. 깊이감 없이 표현되는 공간이다. 이런 공간에서 각 요소들의 위치는 가로, 세로 두 축을 이용해 표현할 수 있다. 어릴 적 수학 교과서에서 본 x와 y축으로 이루어진 좌표평면을 게임 위에 올려보면 더 쉽다.
2차원 게임 세계는 위치의 표현에 깊이가 필요 없는 경우 많이 채택된다. 현실 세계와는 다른 차원을 다루기 때문에 좀 더 다양한 방식의 플레이를 구현할 수도 있고, 좀 더 심플한 룰로 게임 플레이를 구성할 수도 있다. 예를 들어 캐릭터의 외관에서 예상되는 질량을 극단적으로 작거나 크게 표현해도 어색하지 않고, 중력 외의 힘을 무시해도 문제가 되지 않는다. 물론 3차원 게임에서도 똑같은 게임적 허용이 가능하지만, 2차원 게임은 우리가 사는 공간과는 다른 형태의 공간이라는 점이 현실감이 떨어지는 구성을 쉽게 받아들일 수 있게 만든다.
2차원 그래픽 게임에서 사용하는 개별 2D 이미지를 스프라이트sprite라고 칭한다. 스프라이트는 일반적으로 PNG, JPEG 등의 이미지 포맷을 사용해 관리한다. 통상적인 스프라이트는 2차원 이미지를 표현하는 방식이기 때문에 각 이미지는 z축을 거의 사용하지 않고 x, y축으로 위치를 표현한다. 무엇이 앞에 그려지는지는 레이어 등의 우선순위priority 시스템을 따르는 것이 일반적이다. 다만 유니티 등의 게임 엔진에서는 레이어가 같을 경우에 z축을 사용하거나, 카메라에 그려지는 범위를 z축을 사용하여 결정하는 등의 시스템을 제공하기도 한다.
당연한 얘기지만 평평한 이미지인 스프라이트를 사용하는 2차원 그래픽 게임에서는 그림을 잘 그리는 것만으로는 깊이감을 표현하기 어렵다. 이때 사용할 수 있는 다양한 기법이 있다. 멀리 떨어진 것처럼 보이는 이미지를 사용하거나(흐린 색상, 큰 물체를 작게 표현하는 등) 속도에 변주를 주는 방식이다.
그중에 수학과 관련 있는 속도에 변주를 주는 방식을 살펴보자. 위에서 잠깐 언급한 레이어라는 개념을 이해했다면 받아들이기 쉽다.
이 방식은 버스나 승용차에서 바라보는 창문 밖 풍경과 비슷하다. 가까이에 있는 나무는 빠르게 움직일 것이고, 멀리 있는 산은 천천히 움직일 것이다. 나와 가까울수록 빨리 움직이는 것처럼 보인다. 이를 레이어 개념을 사용하는 게임에 적용해보자면, 가까이 있는(우선순위가 높은) 그림일수록 가로 방향의 이동에 예민하게 만들 수 있다.
이렇게 2차원 그래픽 게임은 깊이감이 없는 만큼 표현하는 데 상상력이 필요하지만 비교적 계산이 간단하고 가볍다.
반면에 3차원 게임은 현실 세계와 유사한 형태다. 땅이 있을 것이며 상하좌우로 이동할 수 있고 점프를 하면 위, 아래 방향으로 움직일 것이다. 2차원 게임보다 하나의 차원이 늘었다고 보면 된다. 이동의 관점에서 바라보면 ‘높이’가 추가되는 개념에 가깝겠지만 게임 개발과 좌표평면의 관점에서 바라보면 2차원 게임에 ‘깊이’가 추가되는 개념이 될 것이다. 즉 화면의 안쪽, 바깥쪽 방향이다.
3차원 공간을 사용한 게임은 대체로 현실 세계와 굉장히 유사한 물리 규칙을 공유하고 있으며 현실에서 느낄 수 있는 공간감을 줄 수 있다. 요즘 유행하는 VRVirtual Reality(가상 현실), ARAugmented Reality(증강 현실) 게임 또한 3차원 게임에 속하고 유명한 FPSFirst-Person Shooter(1인칭 슈팅 게임) 게임들도 3차원인 경우가 많다. 또한 깊이의 표현이 가능해져 탁 트인 느낌을 줄 수 있고, 사용자가 이동할 수 있는 범위 또한 넓어진다.
3차원 게임은 2차원 게임 구현에 깊이가 추가된 형태다. 리소스의 차이 없이 각 객체의 위치에만 깊이 값이 추가되는 경우도 있겠지만 많은 경우에는 리소스 제작 단계부터 차이가 생긴다. 2차원 게임에서 사용하는 스프라이트는 평면만 표현할 수 있기 때문에 3차원 게임의 경우에는 3D 모델을 그래픽 리소스로 주로 채택한다.
3D 모델은 정점vertex으로 이루어진 그래픽이다. 각 정점을 이어서 모서리edge를 만들 수 있고, 모서리는 하나의 표면face을 만들 수 있다(이해하기 어렵다면, 정육면체와 같이 정점과 모서리로 이루어진 모형을 생각해보자). 이 표면들이 모이면 하나의 덩어리를 만들 수 있는데 이 덩어리를 3D 모델이라고 부른다.
3차원 게임은 2차원 게임과는 다르게 화면에 표현되는 방식부터 복잡하다. 카메라로부터 각 정점까지의 거리, 빛으로부터 얼마나 영향을 받는지, 가려지는 점인지 아닌지 등 수없이 많은 문제를 나열할 수 있을 것이다.
현실 세계의 카메라나 눈으로 보는 것과 비슷한 효과를 내기 위해 3차원 그래픽의 게임은 셰이더shader의 힘을 자주 빌린다. 셰이더는 3차원 그래픽만을 위한 것은 아니지만(당연히 2차원 그래픽에서도 사용 가능하다), 2차원 그래픽보다 요구되는 상황이 많기 때문에 언급하고 지나간다. 이에 대해 자세히 알고 싶다면 GPU나 그래픽스graphics, 셰이더 관련 서적들을 참고하면 좋다.
게임 개발자에게 필요한 것은
화려한 포트폴리오가 아닌 체계적인 이론 지식!
이 책은 특정 엔진이나 기술에 국한되지 않고 게임 개발의 전반적인 개념과 지식을 다룬다. 이를 통해 게임 세계가 어떻게 만들어지는지 이해하고, 다양한 게임 장르와 플랫폼에 적용하는 능력을 기를 수 있다. 게임 개발을 처음 접하는 이도 쉽게 이해할 수 있게 어려운 수학이나 알고리즘은 최대한 간단하게 설명하고, 다양한 예제 코드를 활용해 접근성을 높였다. 단순 엔진 사용법이 아닌 게임 개발의 본질을 이해하고 자신만의 게임을 창작하는 데 필요한 자신감을 얻게 될 것이다.
최신 콘텐츠