괴물이 튀어나오는 인터랙션 오브젝트 설계

괴물이 튀어나오는 인터랙션 오브젝트 설계

이전에 인터랙션 오브젝트 설계 (1), 인터랙션 오브젝트 설계 (2) 인터랙션 오브젝트 설계 (3)에 걸쳐 두 가지 상태만 있는 단순한 인터랙션 오브젝트가 어떻게 동작하는지 알아봤습니다. 이미 게임을 플레이 하며 뼈무더기 이외에도 거의 같은 요소가 게임에 여러 번 나온다는 것을 보셨을 겁니다. 가령 인터랙션 해서 닫아야 하는 지옥 차원문, 인터랙션 하면 열리며 보상을 토해내는 보물상자, 인터랙션 하면 효과를 주는 신단 같은 것들입니다. 이들은 이전에 다룬 단순한 인터랙션 오브젝트와 거의 같으면서도 보상 대신 효과를 주거나 다음 상태로 전환하는 대신 사라지는 식으로 동작이 아주 조금씩 다릅니다. 하지만 핵심 동작은 똑같으니 비슷한 요구사항이 나올 때 아주 조금씩만 바꿔 가며 대응할 수 있습니다.

이번에는 조금 더 특이한 사례를 알아보겠습니다. ‘검은 안개’인데요, 현상금 사냥 퀘스트를 하다가 만났습니다. 필드에 검은 안개가 있고 이것과 인터랙션 하는 것이 퀘스트 목표입니다. 당연히 이전에 다룬 단순한 인터랙션 오브젝트일 거라고 생각했습니다. 그런데 인터랙션을 하자 안에서 괴물이 튀어나옵니다. 퀘스트 목표는 이 괴물들을 처치하는 겁니다. 인터랙션 오브젝트는 똑같지만 그 안에서 괴물들이 튀어나오려면 어떻게 해야 할까요.  좀 더 똑똑한 방식으로 이미 개발된 여러 요소를 조립해 만들 수 있을 겁니다. 하지만 여기서는 전통적인 대규모 개발팀에서 이런 메커닉을 데이터로만 정의할 수 있게 만들 겁니다. 그러면 언리얼 에디터를 배치 도구로 사용하고 엑셀을 데이터 입력 도구로 사용하는 환경에서 여러 사람이 편하게 작업할 수 있습니다. 먼저 검은 안개를 정의해 봅시다.

  • 인터랙션 오브젝트
    • 이름: ‘검은 안개’
    • 상태:
      • 상태1: ‘스폰됨’
        • 애니메이션: ‘검게 일렁이는 애니메이션’
        • 인터랙션가능?: ‘가능’
        • 다음상태이름: ‘상태2’
      • 상태2: ‘곧 사라짐’
        • 애니메이션: ‘1초동안 유지된 다음 안개가 줄어들어 사라지는 애니메이션’
        • 인터랙션가능?: ‘불가능’
        • 다음상태이름: ‘없음’
    • 인터랙션:
      • 인터랙션 거리: ‘2미터’
      • 인터랙션 버튼:
        • 버튼 에셋 경로
        • 버튼 이름: ‘살펴보기’
      • 인터랙션 시간: ‘2초’
      • 플레이어 애니메이션: ‘공용 인터랙션 애니메이션 경로’

검은 안개는 퀘스트에 의해 스폰됩니다. ‘스폰됨’ 상태로 일렁이고 있다가 캐릭터가 다가와 인터랙션 하면 사라집니다. 이 검은 안개는 다시 퀘스트에 의해 스폰되기 전에는 다시 필드에 나타나지 않을 겁니다. 그러면 이 안에서 괴물이 튀어나오는 동작을 붙여야 하는데 이는 썩 단순하지 않습니다. 개발 환경에 따라 검은 안개와 튀어나올 몬스터를 어떻게 연결할 것인지 결정해야 합니다. 팀에 따라 에디터에서 필드에 검은 안개로부터 튀어나올 몬스터를 배치한 다음 이들을 그룹핑해 검은 안개에 연결하도록 만들 수도 있습니다. 그런데 에디터 상에서 보면 필드에 스폰될 몬스터와 검은 안개로부터 스폰될 몬스터가 뒤섞여 보일테니 썩 편리한 환경 같아 보이지 않습니다. 여기서는 검은 안개 안에서 튀어나올 몬스터도 모두 데이터로 정의한다고 해보겠습니다. 인터랙션 오브젝트에 다른 타입을 만들겠습니다.

  • 인터랙션 오브젝트
    • 이름: ‘검은 안개’
    • 타입: 스포너
    • 상태:
    • 인터랙션:
    • 스포너 옵션:
      • 스폰될 상태: ‘상태2’
      • 스폰될 괴물 세트1: ‘괴물 세트1’
        • 달려갈 위치1: ‘상대좌표1'
      • 스폰될 괴물 세트2: ‘괴물 세트2’
        • 달려갈 위치2: ‘상대좌표2’

인터랙션 오브젝트에 타입을 만들어 이 타입에 따라 추가 옵션이 붙도록 했습니다. 가령 ‘스포너’ 타입 인터랙션 오브젝트는 ‘스포너 옵션’을 추가로 입력해야 합니다. 만약 엑셀이라면 스포너 타입 인터랙션 오브젝트일 때만 사용하는 칼럼이 인터랙션 오브젝트 엑셀 파일 끝부분이 있을 겁니다. 여기에 이 안에서 튀어나올 괴물 세트를 넣습니다. 검은 안개에서 튀어나오는 괴물을 살펴보면 괴물이 두 줄로 달려나와 서로 다른 두 지점에 도착한 다음 캐릭터를 공격하기 시작합니다. 같은 검은 안개로부터 괴물이 튀어나오지만 괴물은 두 그룹으로 구분되어 있고 이들은 서로 다른 위치를 향해 달려간다고 가정할 수 있습니다. 이제 검은 안개에서 튀어나올 괴물 세트를 정의하겠습니다.

  • 괴물 세트
    • 괴물 세트 1
      • 괴물1, 1마리
      • 괴물2, 2마리
      • 괴물3, 1마리
    • 괴물 세트 2

괴물 세트는 괴물 종류와 각 종류 별 수량만 입력합니다. 괴물 세트 데이터 입장에서는 이 세트가 어디에 어떻게 사용될 지 모릅니다. 그저 상황에 따라 출격할 괴물의 목록과 수량만 알고 있을 뿐입니다. 이렇게 데이터에 따라 동작을 완전히 구분해 두면 이를 입력하는 사람이 괴물의 강함이나 보상에 따른 데이터에만 집중할 수 있습니다. 이 작업을 하는 사람이 이 괴물들이 두 줄로 달려나가 서로 다른 지점에 도착하는 동작을 알 필요가 없고 이에 관여할 필요도 없으며 이런 동작을 필수로 알게 해서도 안됩니다.

이제 위쪽 인터랙션 오브젝트 데이터와 아래쪽 괴물 세트 데이터를 합쳐 동작을 예상해 봅시다. ‘스포너 옵션’은 ‘상태2’가 될 때 실행됩니다. 괴물 세트 1과 2는 각각 ‘상대좌표1’과 ‘상대좌표2’를 향해 달려가는데 이는 괴물의 정규 AI를 일시적으로 퀘스트에서 제어해야 합니다. 달려가는 도중에는 공격을 받아도 대응하지 않으며 필요에 따라 일시적인 무적 상태로 만들어야 할 수도 있습니다. 이런 예외가 들어가므로 검은 안개에서 몬스터들이 뛰어 도착할 위치는 아주 가까이에 있어야 합니다. 달려나온다는 느낌을 받을 수 있는 가장 가까운 위치인 편이 좋습니다. 또 상대좌표 두 곳은 검은 안개로부터 미리 약속된 자리인 것을 추천하는데 누군가는 지형에 따라 검은 안개로부터 튀어나올 괴물이 조금씩 다른 위치를 향해 달려가기를 원할 수도 있습니다. 하지만 이를 허용하면 플레이어 입장에서 괴물이 어디로 튀어나올 지 예상할 수 없고 또 검은 안개를 배치할 때마다 괴물이 튀어나올 위치를 별도로 지정해야 하므로 검은 안개의 배치 난이도가 높아집니다. 때문에 검은 안개 아래쪽에 벽이 있다면 벽으로부터 충분히 먼 거리에 검은 안개를 배치해야 한다는 규칙을 두고 검은 안개로부터 나오는 괴물은 항상 약속된 위치를 향해 달려나간다고 해 두는 것을 추천합니다.