Voxel Horizon – 개인맵

플레이어가 공용맵에서 지형을 마구 뽀개거나 마구 건물을 짓거나 하면 다른 플레이어에게 큰 피해가 된다. 따라서 공용맵에선 복셀 편집 기능을 제한해야 한다.
그래서 공용맵에선 플레이어당 편집 범위가 32m x 32m로 제한된다.
또한 마을이나 전투필드처럼 NPC가 배치되는 맵의 경우 지형을 함부로 변경하면 곤란하다. 안전장치로 마을이나 전투 필드에선 복셀을 파괴하더라도 몇초후 자동복구 되도록 했다.

그런데 이렇게 제약사항이 많아지면 즐겁게 건축물을 만들 수 없다. 건물 짓는것뿐만 아니라 크래프팅 외에도 공용맵에선 이런저런 문제들로 제약을 둘 수 밖에 없다. 옆에서 건물 짓고 있는데 자기들끼리 전투한다고 마구 쏴대는것도 곤란하다. 전투를 위해서도 어떤 격리된 공간이 필요하다.

그래서 개인맵 기능을 구현하고 있다.
내가 만든 맵에 다른 플레이어를 초대해서 전투를 하거나 같이 건물을 짓는다. 이것이 이 게임의 주요 컨셉이다.

대략 기능 목록은 이렇다.

  • 모든 플레이어는 자신만의 개인맵을 생성/폐기할 수 있다.
  • 모든 플레이어들은 현재 존재하는 개인맵의 목록을 볼 수 있다.
  • 플레이어는 다른 플레이어가 만든 만든 맵에 입장할 수 있다. 단 맵 주인의 허가가 필요하다.
  • 플레이어는 내가 만든 맵에 다른 플레이어를 초청할 수 있다. 이 경우도 초청을 받은 플레이어가 수락해야한다.
  • 맵 주인은 맵에 입장한 다른 플레이어들을 쫓아낼 수 있다.
  • 맵 주인은 다른 플레이어에게 전투/편집 권한을 선택적으로 부여할 수 있다.(아직 미구현)
  • 맵 주인은 맵을 전투모드 또는 크래프트 모드로 전환할 수 있다.(아직 미구현)

기능 자체는 별거 아니지만 실제 구현하는데는 꽤 시간이 걸렸다.
원인은 다음과 같다.

[인스턴싱 관련 버그]
개인맵은 기본적으로 인스턴싱을 사용한다.
기본 템플릿으로 로드해둔 복셀기반의 씬으로부터 인스턴스맵을 만든다. 이 경우 템플릿에 있는 복셀 지오메트리들은 복사되지도 새로 생성되지도 않는다. 인스턴스맵은 이 지오메트리를 참조해서 충돌처리와 렌더링을 수행한다. 그러다가 전투나 복셀 편집으로 인해 복셀 지오메트리에 변화가 생기면 입이벤트가 발생한 복셀 오브젝트는 참조에서 인스턴스로 바뀐다.
이 기능 자체는 꽤 오래전에 만들어뒀고 문제없이 잘 작동한다고 생각했다.
이걸 서버에서 본격적으로 사용하기 시작했고 전투 외에 복셀 편집 기능을 추가하니 문제가 생겼다. 아니 원래 있었던 버그가 드러났다.
이 문제를 해결하느라 제법 시간을 소모했다. 물론 그 덕에 복셀 엔진의 안정성을 꽤 높일 수 있었다.

[픽킹 문제]
새로운 복셀을 추가할때, 복셀을 제거할때, 색을 칠할때, 각각의 복셀 지오메트리 픽킹 방법이 있다. 픽킹에 대해선 문제가 약간 있는건 알고 있었지만 나중에 처리할 생각으로 계속 미뤄두고 있었다. 개인맵에서 복셀 편집 기능을 테스트하다보니 픽킹 문제가 상당히 거슬렸다. 개인맵은 복셀편집이 주니까. 이 상태로는 개인맵의 테스트 자체도 제대로 이루어지지 않는다.
복셀 관련 픽킹 코드를 손봐서 거의 문제없이 돌도록(일단 알고 있는 문젠제는 없도록) 처리했다.

일단 기본적인 기능은 구현했다. 아직 할일이 많다. 개인맵 관련 UI는 아직 만들지 않았다. 복셀 지오메트리가 소모하는 메모리도 더 줄여야하고 인스턴스맵 생성도 백그라운드 태스크로 빼야한다.
그래도 이 정도로 일단 플레이는 가능하다.
잘 돈다.


Voxel Horizon – 개인맵”에 대한 답글 1개

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중