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

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

인터랙션 오브젝트 설계 (1)인터랙션 오브젝트 설계 (2)에 이어 세번째입니다. 쓰기 시작할 때 이야기할 내용 범위를 정해놓지는 않지만 이 세 번째 글이 처음 이야기한 주요 동작을 다루는 마지막일 것 같습니다. 지난번에는 플레이어가 뼈무더기에 다가가 인터랙션 버튼이 나타나고 이를 터치해 일정 시간 동안 인터랙션이 진행되는 이야기를 했습니다. 이제 남은 요구사항은 무너진 상태가 되면 아이템을 떨어뜨리고 무너진 후 상태를 유지하다가 정해진 시간이 지나면 무너지기 전 상태로 돌아가는 것입니다. 하나씩 생각해봅시다.

뼈무더기는 무너진 후 상태가 된 다음 아이템을 떨어뜨립니다. 무너지기 전 상태일 때는 아무것도 떨어뜨리지 않습니다. 인터랙션 오브젝트는 상태에 따라 아이템을 떨어뜨리거나 아무것도 떨어뜨리지 않을 수 있는데 뼈무더기 사례에서는 아이템을 떨어뜨리는 상태가 ‘무너진 후’로 확실합니다. 그러면 이 상태에만 떨어뜨릴 아이템을 지정할 수 있게 만들면 될 것 같습니다. 지난번에 만들어 놓은 인터랙션 오브젝트 구조에 이 요구사항을 덧붙여 보겠습니다.

  • 인터랙션 오브젝트
    • 이름: ‘뼈무더기’
    • 상태:
      • 상태1: ‘무너지기 전’
      • 애니메이션: ‘애니메이션 경로’
      • 인터랙션가능?: ‘가능’
      • 다음상태이름: '상태2'
    • 상태2: ‘무너진 후’
      • 애니메이션: ‘애니메이션 경로’
      • 인터랙션가능?: ‘불가능’
      • 다음상태이름: ‘없음’
      • 보상드랍: ‘보상 아이디’
    • 전환상태
    • 인터랙션

전환상태와 인터랙션은 생략했습니다. 지난 글을 참고해 주세요. 이번에 추가한 부분은 ‘무너진 후’에 대응하는 ‘상태2’에 ‘보상드랍’입니다. 어이 없게 간단합니다. 종종 이곳에 직접 아이템 종류와 수량을 설정하게 만드는 경우도 과거에는 있었습니다. 그것도 크게 틀린 설계는 아닙니다. 하지만 현대로 올수록 보상 제어를 한 데이터로 모으려는 요구사항이 더 강해지는 분위기입니다. 상황에 따른 보상량을 계산하고 실제 보상 데이터를 입력하는 입장에서는 이 모든 데이터가 한 사람이나 한 부서에서 관리하는 네임스페이스 하위의 여러 파일이나 단일 파일로 관리하고 싶어합니다. 그래서 인터랙션 오브젝트 데이터에 직접 보상 아이템 종류와 수량을 언급하지 않고 이를 감싼 ‘보상 아이디’를 사용합니다. 이 아이디를 따라가면 이 안에 들어있는 아이템의 종류와 수량, 경우에 따라 확률 데이터로 연결됩니다.

만약 인터랙션 오브젝트 데이터를 정규화할 필요가 없는 XML이나 JSON 같은 형식으로 읽고 쓴다면 이대로 놔둬도 됩니다만 이 데이터를 엑셀에 펼쳐서 보기를 원한다면, 또 엑셀 데이터를 원본으로 사용하길 원한다면 보상 데이터가 ‘상태2’에만 있을 수 없습니다. 엑셀에 펼치려면 ‘보상드랍’은 ‘상태1'에도 있어야 하고 미래에 상태가 더 많은 인터랙션 오브젝트가 나타난다면 모든 상태에 보상 데이터가 대응되어야 합니다. 이론적으로 모든 상태에 진입할 때 보상을 떨어뜨릴 수 있게 됩니다.

보상도 떨어뜨렸으니 이제 마지막으로 무너지기 전 상태로 돌아가야 합니다. 만약 뼈무더기가 인스턴스 던전 안에서만 나온다면 이전 상태로 돌아갈 필요가 없을 수도 있습니다. 지나가면서 한 번 무너뜨리며 보상을 얻으면 그만이니까요. 하지만 같은 뼈무더기가 필드에 있다면 원래 상태로 돌아가야 다른 사람도 보상을 받을 수 있습니다. 이런 이유로 같은 뼈무더기라도 필드용과 던전용을 구분해놓고 필드와 던전을 구분해서 배치하기도 합니다. 플레이어 입장에서 보기엔 똑같은 뼈무더기이지만 필드와 던전 사이에 동작이 다르다면 내부에서 쓰는 이름은 서로 다를 가능성이 있습니다.

‘무너지기 전’ 상태에서 ‘무너진 후’ 상태로 전환될 때는 플레이어의 인터랙션을 요구했습니다. 무너진 후 상태에서 무너지기 전 상태로 돌아갈 때는 인터랙션 대신 정해진 시간이 흐르면 돌아가기를 원하는데요, 이제 인터랙션 오브젝트의 상태를 전환시키는 조건이 두 가지가 되었습니다. 하나는 플레이어의 인터랙션, 다른 하나는 일정 시간이 경과하는 것입니다. 이를 반영해 봅시다.

  • 인터랙션 오브젝트
    • 이름: ‘뼈무더기’
    • 상태:
      • 상태1: ‘무너지기 전’
        • 애니메이션: ‘애니메이션 경로’
        • 인터랙션가능?: ‘가능’
        • 다음상태이름: '상태2'
        • 보상드랍: ‘보상 아이디’
        • 상태전환조건: ‘플레이어 인터랙션’
          • 상태전환옵션: ‘없음’
      • 상태2: ‘무너진 후’
        • 애니메이션: ‘애니메이션 경로’
        • 인터랙션가능?: ‘불가능’
        • 다음상태이름: ‘상태1’
        • 보상드랍: ‘보상 아이디’
        • 상태전환조건: ‘시간경과’
          • 상태전환옵션: ‘60초’
    • 전환상태
    • 인터랙션

각 상태마다 다음 상태로 전환되는 조건을 명시했습니다. 무너지기 전 상태일 때는 다음 상태로 전환할 조건은 플레이어의 인터랙션입니다. 누군가 지나가다가 인터랙션을 하면 ‘전환상태’를 거친 다음 무너진 후 상태로 전환합니다. 무너진 후 상태일 때는 이미 인터랙션이 불가능한 상태입니다. 인터랙션으로는 상태를 전환할 수 없습니다. 이제 다음 상태로 전환하려면 시간이 지나야 합니다. 이 설정에 따르면 무너진 후 상태가 된 다음 60초가 지나면 이전 상태로 돌아갑니다. ‘상태2’에는 ‘다음상태이름’이 없었습니다. 이전까지는 이전 상태로 돌아갈 요구사항을 반영하지 않았기 때문인데 이제는 이전 상태로 돌아가야 하니 다음 상태 이름에 ‘상태1’을 넣어 원래대로 돌아가도록 합니다.

이제 뼈무더기 인터랙션 오브젝트의 최소 기능을 만족했습니다. 이 인터랙션 오브젝트는 여기서 두 가지보다 더 많은 상태를 가지거나 다른 오브젝트에 연결되어 상태를 변하게 하거나 보상으로 아이템 외에 버프나 디버프를 주거나 내비게이션 메시를 제어하는 등으로 기능을 확장하게 됩니다. 기본 기능은 여기서 마무리하겠습니다.