지역 타이틀은 언제 보여주고 언제 안 보여줄까요?
바로 앞에서 약간 민감할 수도 있는 이야기를 했으니 이번엔 가벼운 이야기를 해보죠. 지역 타이틀. 프로젝트마다 부르는 이름이 다를 것 같습니다. 제가 속한 프로젝트에서는 지역 타이틀이라고 불렀습니다. 플레이어캐릭터가 이동하다가 어느 지역에 진입할 때 화면 중앙 상단에 이 지역 이름과 지역의 상태를 보여주는 인터페이스입니다. 간단한 장치처럼 보이지만 설계하는 사람 신경을 긁는 자잘한 디테일이 있습니다.
가장 간단한 단계부터 시작하겠습니다. 지역에 진입하면 지역 타이틀 인터페이스를 띄우는 거니까 간단히 에디터에서 레벨을 열어 미리 약속한 볼륨을 친 다음 볼륨에 지역 이름, 상태 데이터를 연결해 두고 런타임에 플레이어가 이 볼륨에 들어갈 때 인터페이스를 띄우면 될 것 같습니다. 동기화할 필요도 없으니까 클라이언트에서만 처리하면 되겠어요. 지역 타이틀 인터페이스는 이런 인터페이스가 나타났다 사라지는 공통 규칙에 따라 일정 시간 동안 유지되다가 사라질 겁니다. 이 공통 규칙 역시 단순하지는 않은데 이건 다음에 기회가 되면 이야기해보죠. 오늘은 지역 타이틀 인터페이스가 나타나면 별 문제 없이 평화롭고 안전하게 사라질 거라고 가정하겠습니다. 자. 이제부터 이 간단한 상태에 문제를 하나 씩 제기해 보겠습니다.
만약 플레이어캐릭터가 뭔가의 이유로 혹은 아무 이유 없이 볼륨 가장자리를 오가면 어떻게 될까요. 위 스크린샷에서 ‘중앙 광장’에 해당하는 영역에 볼륨을 쳐 놨다고 가정하겠습니다. 플레이어캐릭터가 볼륨 바깥쪽과 안쪽을 짧은 시간 안에 오락가락 하는 겁니다. 그럼 방금 정의한 규칙만으로는 좀 꼴사납게 동작할 겁니다. 볼륨에 새로 진입할 때마다 지역 타이틀이 반복해서 나타나겠죠. 만약 인터페이스 공통 시스템이 잘 구축되어 있다면 꼴은 좀 사납겠지만 어쨌든 지역 타이틀 인터페이스 자체는 안전하게 나타날 겁니다. 하지만 그렇지 않다면 같은 지역 인터페이스가 여러 개 겹치거나 같은 UI 위젯의 나타나고 사라지는 애니메이션이 꼬여서 이상하게 보이는 등의 문제가 생길 겁니다. 그럼 어쩌죠? 지역 타이틀 인터페이스에는 쿨타임이 있는 것이 좋겠습니다. 지역 타이틀을 한 번 표시하면 10초 동안은 다음 지역 타이틀을 표시하지 않는 거죠. 이제 지역 타이틀은 한 번에 하나만 나타나고 UI 시스템이 견고하지 않아도 망가질 일이 줄어들겠네요. 하지만 이 쿨타임은 지역 타이틀 측면이 아니라 UI 시스템 측면에서 접근해야 합니다. 안 그러면 지역 타이틀 데이터 어딘가에 쿨타임을 따로 입력하는 안타까운 결과로 끝날 수도 있습니다. 이게 왜 안타까운지 역시 다음에 기회가 되면 이야기해 보겠습니다.
이렇게 만들어 두면 QA로부터 오동작 보고가 올 겁니다. 순간이동 해서 중앙 광장에 도착했는데 지역 타이틀이 뜨지 않는다고요. 사실 요구한 대로 구현된 상태이기 때문에 버그라고 볼 수는 없습니다. 애초에 요구사항이 부족한 결과입니다. 분명 볼륨에 진입할 때 지역 타이틀을 띄우기로 했습니다. 그런데 볼륨 진입 이벤트는 실제로 볼륨에 걸어서 진입할 때 발생합니다. 때문에 순간이동을 통해 볼륨 안에 플레이어캐릭터가 나타나면 진입 이벤트가 일어나지 않아 지역 타이틀이 나오지 않습니다. 앞선 문제보다는 훨씬 간단해 보입니다. 요구사항을 정의할 때 이 지역에 진입할 수 있는 경로를 조사해 이들 모두를 처리하면 됩니다. 사실 기획자가 이 모든 경로를 파악하지 못하고 있을 수도 있습니다. 이 때는 담당 엔지니어와 상담하거나 만약 코드를 읽을 수 있는 환경이라면 진입을 호출하는 곳들을 기계적으로 검색해볼 수도 있습니다. 참고로 걸어 들어가는 경우, 순간이동을 통한 경우, 전투 등에 의한 물리연산에 의해 이동 당하는 경우 등이 있고 이동 형태 역시 걸어서 이동처럼 틱 연속적인 것과 순간이동, 빠른 속도로 이동처럼 틱 불연속적인 것도 있음에 유의해야 합니다.
앞에서 간단히 넘어간 쿨타임도 조금은 더 신경 써야 합니다. 이건 지역 타이틀이 아니라 UI 시스템에서 다룰 문제여서 지역 타이틀을 담당자를 따로 설정했다면 난이도가 낮지는 않은 업무가 될 겁니다. 각 존 별로 지역 타이틀이 뜨도록 설정해 놨다 칩시다. 레벨디자이너는 존 전체를 덮는 볼륨을 쳤을 겁니다. 이제 이전 존에서 지역 타이틀을 보고 쿨타임 10초가 지나기 전에 로딩을 거쳐 다음 존에 도착했습니다. 어. 지역 타이틀이 안나오네요. 이 역시 요구사항대로 동작했으므로 버그는 아닙니다. 하지만 마음이 불편하죠. 해결 방법은 여러 가지입니다. 반사적으로 생각하면 존을 이동할 때는 UI 쿨타임을 초기화할 수도 있습니다. 이는 UI 시스템 관점에서 평가되어야 합니다. 또 정책적으로 존 전체를 덮는 지역 타이틀 볼륨을 만들지 않는 것도 방법입니다. 로딩이 끝나자마자 다른 지역 타이틀 볼륨 안에 들어간 상태라 바로 지역 타이틀 인터페이스를 띄우는 것은 썩 좋은 아이디어는 아닙니다. 이유는 기기에 따라 로딩 직후 프레임이 떨어진 상태일 수 있어요. 내 테스트 장비에서는 아무 문제 없겠지만 누군가의 장비에서는 로딩 직후 나타나는 인터페이스들이 전부 다 버벅거리고 있을 수도 있습니다. 그래서 볼륨을 실제 존보다 작게 쳐서 로딩이 끝난 다음 플레이어캐릭터를 이동시켜 몇 발자국 걸은 다음에야 존 타이틀이 나타나게 설정할 수 있고 이는 문제를 부드럽게 해결합니다.
실은 아직 이야기하지 않은 문제들이 더 있지만 그럼 지역 타이틀 같은 간단한 주제를 다루는데 텍스트가 너무 길어져 지금보다 훨씬 지루해질 것 같으니 여기서 끊겠습니다. 어느 날 심심하면 이 다음 이야기도 해볼께요. 미래의 저를 위해 힌트를 조금 남기자면 ‘볼륨은 볼록다각형 모양인가?’, ‘큰 지역 안에 작은 지역이 중첩되어있다면?’, ‘복층 레벨이라면?' 같은 문제들이 있습니다.