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