인터랙션 오브젝트 설계 (1)

인터랙션 오브젝트 설계 (1)

모바일 MMO 게임에 자주 등장하는 가상의 인터랙션 오브젝트를 설계하는 과정을 설명하려고 합니다. 바로 이전에 2022년 7월 블로그 요약 (1)을 시작할 때도 비슷한 이야기를 했는데 이 이야기를 한번에 처음부터 끝까지 작성하면 쓰는 사람도 읽는 사람도 고통스러울 것 같으니 제가 쓰고 싶은 만큼 씩 진행할 겁니다.

먼저 이 가상의 인터랙션 오브젝트가 게임 상에서 어떻게 동작할지 생각해 봅시다. 다른 게임의 사례를 사용해 동작을 상상하면 일하기 편해집니다. 요즘 플레이 하고 있는 디아블로 이모탈에 등장하는 뼈무더기 사례를 떠올려 봅시다. 필드에서 플레이 하다 보면 뼈무더기가 등장하는데 다가가서 인터랙션 하면 뼈무더기가 무너지고 작은 보상을 줍니다. 이 뼈무더기가 바로 인터랙션 오브젝트입니다. 동작을 살펴보면 무너지기 전 상태와 무너진 후 상태가 있고 무너질 때 무너지는 애니메이션과 무너지는 소리를 냅니다. 또 무너진 다음에는 보상을 주고요. 그리고 무너진 상태에서는 더 이상 인터랙션 할 수 없는데 이 상태를 계속해서 관찰하고 있으면 무너지기 전 상태로 돌아갑니다. 이 때 다시 인터랙션 하면 똑같이 무너지고 보상을 줍니다.

이 뼈무더기의 중요한 특징은 멀티플레이 환경에서 모든 플레이어에게 동기화된다는 점입니다. 뼈무더기가 나에게 무너진 상태로 보인다면 다른 사람에게도 무너진 상태로 보여야 합니다. 또 내가 먼저 인터랙션 해서 뼈무더기가 무너지기 시작했다면 이 모습이 다른 사람에게도 똑같이 보여야 합니다. 다른 사람이 먼저 뼈무더기를 무너뜨리기 시작했다면 나는 뼈무더기가 무너지는 모습을 볼 뿐 내가 뼈무더기를 무너뜨릴 수 없어야 합니다. 뼈무더기가 멀티플레이 환경에서 동기화될 때 가장 중요한 점은 보상이 동기화될지 여부를 결정하는 것입니다. 뼈무더기를 무너뜨렸더니 안에서 골드가 튀어나왔는데 나를 향해 달려오던 다른 플레이어캐릭터가 이 골드를 먹어버리면 기분이 좋지는 않을 것 같습니다. 하지만 골드가 나에게만 드랍되도록 하는 것도 만족스럽지는 않습니다. 다른 사람이 나를 볼 때 내가 뼈무더기를 무너뜨렸는데 아무것도 얻지 못하는 것처럼 보일테니까요.

이런 사례를 고려해 우리가 만들 뼈무더기 인터랙션 오브젝트의 주요 동작을 나열해 보겠습니다.

  1. 뼈무더기는 ‘무너지기 전’, ‘무너진 후’의 두 가지 상태가 있다.
  2. 플레이어가 인터랙션을 하면 일정 시간 후 뼈무더기가 무너진다.
  3. 무너지기 전 상태에서 무너진 후 상태로 변할 때는 ‘무너지는 애니메이션’을 재생한다.
  4. 무너진 상태가 되면 미리 설정해 둔 아이템을 바닥에 떨어뜨린다.
  5. ‘무너지기 전’ 상태일 때 인터랙션 할 수 있다. ‘무너진 후’에는 인터랙션 할 수 없다.
  6. 무너진 후 상태가 된 다음 60초가 지나면 ‘무너지기 전’ 상태로 돌아간다.
  7. 뼈무더기의 상태는 멀티플레이 환경에 동기화된다. 드랍된 보상 역시 동기화된다.

먼저 뼈무더기에는 두 가지 상태가 있습니다. ‘무너지기 전’, ‘무너진 후’ 입니다. 이 상태는 뼈무더기의 겉모양을 결정합니다. 또 인터랙션 가능한지, 그리고 멀티플레이 환경에서 뼈무더기를 동기화 하는데 사용됩니다. 이 두 가지 상태는 겉모양을 결정하기 때문에 각 상태에 따른 애니메이션을 지정할 수 있어야 합니다. 만약 뼈무더기가 무너지기 전 상태일 때 신경 쓰이게 조금씩 움찔 거리게 하고 싶다면 이 상태에 움찔 거리는 애니메이션을 지정하고 이를 반복 재생하면 됩니다. 무너진 후 상태일 때에도 동일하게 애니메이션을 지정할 수 있어야 합니다. 애니메이션에 움직임이 필요 없다면 한 프레임을 반복해서 재생하고 움직임이 있다면 이를 반복 재생하도록 하면 되는데 이는 게임 엔진의 애니메이션 시스템을 통해 제어하도록 해야 합니다. 그래야 에셋을 제작할 아티스트들이 기획 데이터에 접근하지 않고 엔진 워크플로우 내에서 작업을 처리할 수 있습니다.

다음으로 두 상태 사이를 변화하는 과정을 정의해야 합니다. 뼈무더기는 ‘무너지기 전’ 상태에서 ‘무너진 후’ 상태로 전환하는데 이 중간 과정을 ‘전환상태’라고 합니다. 명시적인 상태 이름으로 정의되지는 않지만 한 상태에서 다른 상태로 변할 때 항상 두 상태의 ‘전환상태’를 거칩니다. 여기서 전환상태 도중에 할 일은 뼈무더기가 무너지는 애니메이션을 재생하는 것입니다. 동작 시나리오에 따라 이 시간 동안 다음 상태로 전환을 지연 시켜야 할 때도 있는데 복잡하니 여기서는 생각하지 않을 겁니다. 무너지기 전 상태에서 무너질 때까지 0.5초 짜리 애니메이션을 한 번 재생한 다음 무너진 후 상태가 됩니다. 실제로는 플레이어가 인터랙션 한 직후 지연 없이 무너진 상태가 되지만 겉보기에는 애니메이션을 재생하고 0.5초 후에 무너진 상태가 되는 것처럼 보입니다. 이렇게 두면 작은 장점이 생기는데 인터랙션 직후 무너진 후 상태가 되므로 무너지는 애니메이션을 재생하는 사이에 다른 플레이어캐릭터가 나타나 인터랙션을 시도할 일이 없어집니다. 전환상태는 두 상태 사이를 전환하는 묵시적인 상태이며 애니메이션이 대응됩니다.

각 상태마다 인터랙션 오브젝트와 인터랙션 할 수 있는지 여부를 설정할 수 있어야 합니다. 뼈무더기는 무너지기 전 상태일 때 인터랙션 할 수 있고 무너진 후 상태일 때는 인터랙션 할 수 없습니다. 이제 인터랙션 오브젝트에는 상태가 있고 각 상태마다 반복 재생할 애니메이션을 지정할 수 있어야 하고 또 각 상태마다 인터랙션 가능한지 여부를 지정할 수 있어야 하게 됐습니다. 대략 이런 구조가 필요할 것 같습니다.

  • 인터랙션 오브젝트
    • 이름: ‘뼈무더기’
    • 상태:
      • 상태1: ‘무너지기 전’
        • 애니메이션: ‘애니메이션 경로’
        • 인터랙션가능?: ‘가능’
        • 다음상태이름: '상태2'
      • 상태2: ‘무너진 후’
        • 애니메이션: ‘애니메이션 경로’
        • 인터랙션가능?: ‘불가능’
        • 다음상태이름: ‘없음’
    • 전환상태
      • 상태1 → 상태2
      • 애니메이션: ‘무너지는 애니메이션 경로’
      • 시간: ‘0.5초’

실은 이 정도 단계까지 오면 시스템기획자 입장에서 협업 부서들과 이야기를 시작하기에 충분하다고 생각합니다만 폭포수 모델에 따라 동작하는 크고 바쁜 팀에서는 부족할 수도 있습니다. 그래서 다음에는 앞에서 이야기했던 주요 동작을 살펴보며 구조를 좀 더 다듬어 보겠습니다.