NPC가 지나가면 닫히는 문 사례

바로 이전에 그래픽에 타협해도 개발기간은 줄어들지 않아요를 쓰면서 ‘문 문제’에 대해 이야기한 김에 최근 플레이한 갓오브워에서 본 문 문제 사례를 설명하면 재미있겠다는 생각을 했습니다. 이전에 문 문제에 대해 들어본 적이 없다면 이 영상을 보면 됩니다. 겉보기에는 별 것 아닌 것 같은데 실제로 만들려고 보면 항상 빡치게 만드는 문제로 게임 개발자들이 이런 문제로 고통 받고 있다고 생각하면 웃긴 이야기이기도 합니다.

갓오브워는 방과 방으로 구성된 전통적인 레벨디자인을 채택했습니다. 널직이 트여 있어 오픈월드처럼 보이는 공간도 실은 그냥 커다란 방입니다. 커다란 방이나 방을 구성하는 당어리를 인식하는 방법은 천재 수학자들이 만들어 낸 미로를 탈출하는 방법들 영상이 재미있게 설명하고 있으니 참고하세요. 방과 방 사이를 구분하는 방법은 문을 통과하는 것입니다. 좌우로 밀어 여는 문과 쓰러진 기둥을 등으로 받쳐 길을 낸 다음 지나가는 것이 있는데 이들은 달라 보이지만 레벨디자인 관점에서는 모양이 다른 문입니다.

방과 방을 문으로 구분하는 이유는 기술적인 이유와 레벨디자인 측면의 이유가 있습니다. 현대에는 과거에 비해 기계 성능이 좋아져 커다란 공간을 한 번에 로딩해 사용하는데 제약이 줄어들고 있습니다. 또한 레벨을 한 번에 로딩하는 대신 이동함에 따라 레벨을 실시간으로 로딩하기도 하고요. 하지만 레벨 안에 상태가 변하는 물건이나 상호작용할 요소가 많다면 이들을 위해 한 번에 로딩될 레벨 크기를 제한하기도 하는데 문은 한 번에 로딩 할 레벨 크기를 제한합니다.

레벨디자인 측면에서는 방 하나 안에서 일어나는 사건이 방 바깥에 영향을 줘 복잡한 문제를 일으키지 않도록 하고 유저가 집중된 플레이를 마치고 잠깐 쉬어갈 수 있는 틈을 만들어 줍니다. 방 안에 갑자기 나타난 여러 적과 정신 없이 전투 한 다음 그 끝에 문이 나오면 잠깐 동안은 바로 이어서 이런 밀도 높은 전투가 나오지 않으리라는 신호입니다. 플레이어는 문 앞에서, 혹은 문을 지나자 마자 패드를 내려놓고 뭘 좀 먹거나 화장실에 다녀오거나 새 메시지를 확인할 수도 있습니다.

방 안에서 일어난 사건이 다음 방에 영향을 주지 않도록 하는 장치이기도 합니다. 과거에 심리스 레벨을 사용하는 MMO 게임에서 종종 먼 곳에 있는 몬스터를 마을까지 끌고 와 문제를 일으키기도 했습니다. 게임의 자유도를 활용한 창발적인 플레이라고 평가할 수도 있지만 게임 내 상황을 통제해야 하는 게임디자인 입장에서는 재미있긴 하지만 썩 달가운 상황은 아닙니다. 만약 보스 몬스터가 죽을 때 주변에 있는 플레이어들에게 높은 경험치를 뿌리는 규칙이 있다고 합시다. 이 몬스터가 필드나 던전에서 죽을 때는 별 문제가 생기지 않겠지만 이 몬스터를 마을까지 끌고 와서 죽이면 게임 전체의 경제 관점에서 경험치 복사에 가까운 사고가 일어날 수도 있습니다. 그래서 이런 규칙을 채용할 때는 몬스터가 죽을 때 경험치를 줄 사람 수를 제한하거나 자신이 던전 안에서 죽는지 확인하거나 태어난 장소로부터 너무 멀리 나가지 않도록 제한하기도 합니다.

갓오브워 사례에서 만약 방 사이가 문으로 구분되지 않으면 한 방의 몬스터를 다 죽이지 않고 다음 방으로 이동할 수 있고 이 때 앞 방의 몬스터가 다음 방으로 이동할 가능성이 있습니다. 만약 방 안의 몬스터를 다 죽여야 방을 클리어 한 것으로 판정하고 경험치를 부여하고 퀘스트를 다음으로 진행시키는 로직이 있다고 해 봅시다. 이전 방의 몬스터를 죽이지 않은 채 다음 방으로 이동하면 일단 이전 방이 클리어 되지 않았고 퀘스트가 다음으로 넘어가지도 않았을 겁니다. 그러면 다음 방이 정상 동작하지 않을 수 있고 다음 방 몬스터를 다 죽였지만 이전 방 몬스터가 죽지 않아 다음 방 역시 클리어 되지 않거나 죽은 몬스터의 경험치를 잘못 부여할 수도 있습니다. 방 사이에 문을 만들고 방의 클리어 상태에 따라 문을 열 수 있게 만들면 이런 귀찮은 문제를 크게 완화할 수 있습니다.

갓오브워에서 좌우로 밀어 여는 문의 동작을 살펴봅시다. 먼저 문은 상호작용 가능한 상태와 잠긴 상태가 있습니다. 잠긴 상태라면 먼저 잠긴 상태를 해소해야 하는데 해소 조건은 주로 퀘스트 진행이나 방 안의 몬스터 처치, 방 안의 퍼즐 메커닉 풀기 같은 것이 있습니다. 상호작용 가능한 문에 다가가 상호작용 버튼을 누르면 먼저 문을 조작하기 시작하는 위치까지 자연스럽게 이동합니다. 문은 정확한 위치에 서서 좌우로 미는 애니메이션을 재생해야 하는데 플레이어 캐릭터가 문과 상호작용 할 때 그 정확한 위치에 서 있지 않을 수 있습니다. 그래서 모든 문에는 문을 조작하기 시작할 정확한 위치가 정해져 있고 문에 상호작용을 시도한 위치부터 조작하기 시작할 위치까지 자연스럽게 이동합니다. 이 때 잠시 동안 유저의 이동 조작을 막는데 문을 여는 동작을 망가뜨릴 수 있기 때문입니다.

이동할 때 거리가 멀다면 걸어서 이동하지만 이 게임에서는 문에 다가갈수록 카메라가 플레이어 캐릭터 상반신을 더 크게 잡아 발이 보이지 않고 또 상호작용 가능한 범위가 좁게 설정되어 있어 걷기 보다는 자연스럽게 플레이어 캐릭터를 밀어 정확한 위치로 이동 시키는 것 같습니다. 만약 멀티플레이 게임이어서 다른 사람이 문 여는 사람의 모습을 볼 수 있다면 상호작용 가능한 범위를 더 넓게 설정하고 이동할 때 걸어서 이동하게 합니다.

다음으로 문을 잡고 양쪽으로 밀어 여는 애니메이션을 재생합니다. 이 때 재미있는 점은 플레이어 캐릭터가 문을 여는 애니메이션과 문이 열리는 애니메이션 및 사운드가 잘 맞게 플레이 되어야 한다는 점입니다. 문은 부드럽게 열릴 수도 있지만 기합 소리를 내며 힘을 줘 문을 열고 있다면 이에 맞춰 문 역시 힘 주는데 맞춰 열려야 자연스럽습니다. 게임에 따라 문과 플레이어를 컷씬으로 묶어 한 번에 제어 하기도하고 플레이어 애니메이션과 문 애니메이션을 잘 맞춰 제작한 다음 별도로 플레이 하기도 합니다. 특히 멀티플레이 게임에서는 문을 함부로 컷씬으로 묶어 제어하기 어려울 때가 많은데 이유는 문 상태가 다른 플레이어들에게도 동기화되어야 해서 문을 별도로 제어해야 하는 상황이 많기 때문입니다.

여기서는 일행이 통과해야 할 때는 문을 열고 열린 문을 몸으로 미는 단계가 있습니다. 이 사이에 일행이 문을 통과하고 완전히 통과한 다음에야 플레이어가 문을 통과하고 문이 닫히는 소리가 납니다. 만약 멀티플레이 게임이어서 문을 통과할 때 나머지 플레이어들이 문을 통과한 상태를 확인해야 한다면 문을 직접 닫지 않고 문을 지나 한참 전진한 다음에 문을 닫게 만들기도 합니다. 여기서는 문을 통과하는 나머지는 NPC들이므로 NPC들이 문을 모두 통과한 다음에 문을 미는 애니메이션을 마치고 문을 통과한 다음 문이 닫힙니다.

NPC들이 문을 통과했는지 판단하는 방법은 곧이곧대로 모든 NPC가 문 너머의 위치에 있는지 판단하는 방법과 약속한 시간 동안만 문을 열고 있고 그 안에 NPC들이 AI나 수동 제어를 통해 문을 통과하기를 기대한 다음 문을 닫는 방법이 있습니다. NPC들의 현재 위치를 판단하는 것이 가장 일반적이기는 하지만 NPC 수가 늘어나거나 NPC가 멈춰 서서 대사를 하며 다른 NPC의 길을 막는 등 경우의 수가 늘어나는 상황을 감안해 타임아웃으로 처리하는 것도 그리 나쁜 아이디어는 아닙니다. 특히 이 게임은 싱글플레이로 카메라 바깥의 구성요소가 불연속적으로 행동하기 때문에 만약 NPC가 카메라 밖에서 문을 통과하지 못했더라도 문이 닫히는 순간 문 안쪽에 스폰 시켜 주면 되기 때문에 복잡하게 모든 NPC의 현재 위치를 확인할 필요가 없을 수 있습니다.

결론. 문은 방과 방을 나누는 역할, 기술적으로 로딩을 나누는 역할, 일행의 이동을 보여주는 스토리텔링의 역할, 그리고 방과 방 사이에 영향을 주고 받지 않도록 격리하는 역할을 합니다. 문을 통과하는 과정은 상호작용 시도, 여는 애니메이션 재생, 플레이어 캐릭터 및 일행 통과, 문을 닫는 애니메이션 재생 순으로 진행되는데 일행이 문을 통과했는지 여부는 싱글플레이 게임에서 더 단순하게 처리할 수 있습니다. 특히 이 게임에서는 카메라 바깥의 구성요소의 상태가 불연속적으로 처리되므로 카메라 밖에 일행의 현재 상태를 정확히 판단해 이 상태에 따라 문을 처리하지 않아도 되니 상대적으로 편합니다.