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

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

지난 인터랙션 오브젝트 설계 (1)에 이어 모바일 MMO에 등장하는 가상의 인터랙션 오브젝트를 설계를 계속하겠습니다. 지난번에 이야기했던 시나리오를 잠깐 리마인드 하고 시작할께요. MMO 게임의 필드에 뼈무더기가 있습니다. 플레이어캐릭터가 뼈무더기에 다가가 인터랙션 하면 뼈무더기가 무너지며 보상을 토해냅니다. 무너진 뼈무더기는 정해진 시간이 지나면 무너지기 전 상태로 돌아갑니다. 이 뼈무더기는 멀티플레이 가능한 필드에 있어 주변의 다른 플레이어캐릭터들에게 상태가 공유됩니다. 한 사람이 무너뜨리면 다른 사람들은 한동안 이 뼈무더기로부터 보상을 받을 수 없습니다.

지난번에 뼈무더기 자체의 동작은 어느 정도 정의했습니다. 그런데 정작 뼈무더기 자체를 정의했을 뿐 플레이어캐릭터가 어떻게 뼈무더기에 인터랙션 하는지는 아직 정의하지 않은 상태입니다. 인터랙션을 생각해 봅시다. 플레이어캐릭터는 뼈무더기에 설정된 일정 반경 안에 들어가면 인터랙션 인터페이스가 나타날 겁니다. 모바일 게임에서는 조작계에 인터랙션 버튼이 하나 나타날 것 같네요. 이 버튼은 오브젝트의 종류에 따라 다른 아이콘과 이름이 나타납니다. 가령 뼈무더기에는 ‘무너뜨리기’, 누군가의 시체에는 ‘살펴보기’, 보물상자에는 ‘열기’라는 메시지와 이에 맞는 아이콘이 나타납니다. 또 인터랙션 오브젝트마다 서로 다른 인터랙션 시간을 요구할 수도 있어요. 어떤 오브젝트는 인터랙션과 거의 동시에, 또 어떤 오브젝트는 한 3초쯤 기다려야 다음 상태로 넘어갈 겁니다. 그러면 지난번처럼 이런 동작 시나리오를 나열해 보겠습니다.

  1. 플레이어캐릭터가 뼈무더기로부터 정해진 반경 안에 진입하면 인터랙션 버튼을 표시한다.
  2. 인터랙션 버튼은 동작 이름과 인터랙션 아이콘으로 구성된다.
  3. 인터랙션 오브젝트마다 인터랙션 시간이 다르다.
  4. 인터랙션 시간이 끝나면 인터랙션 오브젝트가 다음 상태로 전환된다.
  5. 인터랙션 시간이 끝나기 전에 피격 당해 대미지를 입으면 인터랙션이 중단된다.
  6. 인터랙션 도중 플레이어캐릭터가 인터랙션 애니메이션을 재생한다.

인터랙션 시간이 길다면 이 시간 동안 인터랙션 상태를 유지해야 합니다. 상황에 따라 이를 선택할 수 있게 만들어야 할 수도 있습니다. 가상의 인터랙션 오브젝트인 ‘피의 꽃’이 있다고 합시다. 퀘스트 진행 중 이 피의 꽃에 다가가 ‘피의 꽃을 정화’하는 인터랙션을 해야 합니다. 인터랙션을 하고 나면 꽃 색깔이 붉은색에서 푸른색으로 바뀌는데 인터랙션을 하는데는 3초가 걸립니다. 이 3초 안에 다른 몬스터로부터 공격 받으면 인터랙션이 끊기고 인터랙션을 처음부터 다시 해야 합니다. 그래서 피의 꽃이 보인다고 해서 다짜고짜 다가가서 인터랙션을 시작하기 보다는 주변이 돌아다니는 몬스터들을 좀 정리한 다음에 인터랙션을 하는 편이 좋습니다. 상황에 따라 인터랙션 도중 몬스터로부터 공격을 받아도 인터랙션 진행이 끊기지 않기를 원하는 요구사항이 있을 수도 있습니다. 개인적으로는 이 요구사항은 받아들이지 않기를 권하고 싶은데 인터랙션 같은 게임 전체에 영향을 미치는 규칙은 게임 전체에 걸쳐 동일한 편이 개발자와 고객 모두 이해하기 쉽기 때문입니다. 인터랙션 오브젝트 종류에 따라 어떤 타입은 인터랙션 중 공격으로 캔슬 가능하고 어떤 것은 그렇지 않다면 이 둘 사이의 차이를 개발팀 내에서도, 또 고객에게도 따로 설명해야 할 뿐 아니라 후자의 경우 인터랙션 도중 공격을 받을 때 일어나는 온갖 이상한 상황을 정의해 개발해야만 하기 때문입니다.

지난번과 같은 요령으로 인터랙션 오브젝트 구조를 업데이트 해 보겠습니다. 지난번에 만든 구조에 덧붙인 부분은 밑줄을 그어 구분했습니다.

  • 인터랙션 오브젝트
    • 이름: ‘뼈무더기’
    • 상태:
      • 상태1: ‘무너지기 전’
        • 애니메이션: ‘애니메이션 경로’
        • 인터랙션가능?: ‘가능’
        • 다음상태이름: '상태2'
      • 상태2: ‘무너진 후’
        • 애니메이션: ‘애니메이션 경로’
        • 인터랙션가능?: ‘불가능’
        • 다음상태이름: ‘없음’
    • 전환상태
      • 상태1 → 상태2
      • 애니메이션: ‘무너지는 애니메이션 경로’
      • 시간: ‘0.5초’
    • 인터랙션
      • 인터랙션 거리: ‘2미터’
      • 인터랙션 버튼:
        • 버튼 에셋 경로
        • 버튼 이름: ‘무너뜨리기’
      • 인터랙션 시간: ‘3초’
      • 플레이어 애니메이션: ‘공용 인터랙션 애니메이션 경로’

인터랙션 항목은 공용으로 정의했습니다. 힘을 꽉 준 비싼 MMO 게임을 개발하고 있다면 종종 오브젝트의 현재 상태에 따라 서로 다른 인터랙션 애니메이션을 재생하고 싶어할 수도 있습니다. 가령 나무에 사과가 가득 열려 있을 때 사과 따는 애니메이션과 사과가 얼마 없을 때 사과 따는 애니메이션을 달리 하고 싶어합니다. 이 역시 게임 전체를 관통하는 규칙을 정의하는 관점에서는 위에 이야기한 인터랙션 중 피격에 의한 캔슬 규칙처럼 별로 받아들이고 싶지 않지만 이를 설득하기는 분명 쉽지 않을 겁니다. 이 글에서는 제 마음대로 할 수 있으니 인터랙션 규칙은 상태에 관계 없이 오브젝트 당 하나만 정의하게 했습니다.

인터랙션 거리는 플레이어캐릭터가 인터랙션 오브젝트의 일정 반경 안에 들어올 때 버튼을 띄우기 위한 것입니다. 서버 입장에서는 플레이어캐릭터가 유효한 거리에 있는지 검증하는데도 사용됩니다. 클라이언트를 조작해 아주 멀리 떨어진 곳에서 인터랙션을 요청할 수도 있기 때문입니다.  오브젝트와 거리는 오브젝트마다 설정된 자기 자신의 충돌반경 바깥부터 측정합니다. 가령 오브젝트의 충돌 반지름이 1미터이고 인터랙션 거리가 2미터라면 플레이어캐릭터는 오브젝트의 중점으로부터 3미터 안에 들어와야 인터랙션 버튼을 볼 수 있습니다.

인터랙션 할 때 플레이어가 애니메이션을 재생할 때가 있습니다. 이 역시 힘을 꽉 준 비싼 MMO에서는 오브젝트마다 서로 다른 애니메이션을 재생하길 원하거나 인터랙션 오브젝트의 높이에 따라 알맞는 애니메이션을 재생하도록 확장하기를 원할 겁니다. 처음에는 모든 오브젝트마다 서로 다른 애니메이션을 넣을 계획을 가지고 시작하지만 이내 이 계획이 전혀 만만하지 않음을 깨닫게 됩니다. 또 게임의 나머지 부분에 비해 덜 중요하기도 하고요. 결국 타협을 거듭해 인터랙션 오브젝트의 높이에 따라 높이가 낮은 오브젝트에 재생할 공용 애니메이션과 높이가 높은 오브젝트에 재생할 공용 애니메이션을 구분하는 정도로 마무리되곤 합니다. 여기서는 아무 공용 애니메이션이든 경로만 지정하면 재생하도록 했습니다. 다만 게임에 클래스가 여럿 있고 클래스마다 공용애니메이션이 다르다면 애니메이션 시스템 안에서 클래스 별로 다른 애니메이션을 재생하도록 분기 가능해야 합니다. 현대적인 게임 엔진 대부분은 이렇게 설정할 수 있습니다.

자. 이제 인터랙션 오브젝트가 동작하고 실제 인터랙션도 가능해졌습니다. 이제 남은 일은 보상을 드랍하는 것입니다. 이건 다음에 이어서 설명 드리겠습니다.