Intermediate읽기 시간: 8분최근 수정: 2026. 4. 14

VMap 제작하기

플레이어들이 접속할 수 있는 VMap(맵)을 제작하는 과정. VObject 포함·통합 빌드·레벨 디자인(네트워크 이벤트, Room 프로퍼티)을 다룹니다.

VMap 은 플레이어들이 접속하는 공간입니다. VObject 를 함께 빌드할 수 있고, VivenBehaviour 로 자체 로직을 수행할 수도 있습니다.

VObject 함께 빌드하기

VMap 에 VObject 를 포함시키는 과정은 몇 가지 차이점을 제외하면 VObject 빌드 와 동일합니다.

VMap 빌드

  1. 먼저 Quick Start 의 필수 컴포넌트(VivenMapEnvironment, VivenPlayerStartPoint) 가 준비되었는지 확인합니다.
  2. 빌드할 Scene 을 열고 에디터 상단의 Build V-map 버튼을 클릭합니다.

Unity Editor 상단 툴바의 Build V-map 버튼

  1. 통합 빌드: Window / macOS / Android / iOS 중 1개 이상을 반드시 선택하고 통합 빌드 시작 을 누릅니다.

통합 빌드 창 - Window/macOS/Android/iOS 플랫폼 선택

  1. 빌드 완료 후 .vmap 파일을 저장할 위치를 지정하면 성공 창이 표시됩니다.

vmap 파일 저장 경로 선택 다이얼로그

VMap 빌드 성공 메시지 팝업

⚠️
주의사항:

빌드 실패 시 Addressable 설정을 먼저 확인하세요. Window → Asset Management → Addressables → Settings 에서 Catalog Build & Load Paths 가 Remote 인지, Enable Json Catalog 토글을 한 번 off/on 해봤는지 점검합니다.

레벨 디자인

VMap 자체 로직을 수행하는 매니저 스크립트를 만들 때 참고할 수 있는 사항들입니다.

네트워크 동기화

VObject 와 동일하게 RPCSyncTable 을 사용할 수 있습니다. VMap 은 추가로 서버에 Room 프로퍼티 테이블을 저장할 수 있으며, 이 테이블은 방마다 독립적으로 존재하며 VMap 끼리 공유되지 않습니다.

Room 프로퍼티는 클라이언트와 독립이기 때문에 사용자가 맵을 나가도 값이 유지됩니다. 대량의 데이터나 잦은 변경은 네트워크 부하를 유발할 수 있으니 주의하세요.

⚠️
주의사항:

Room 프로퍼티는 데이터 무결성을 보장하지 않습니다. 변경 요청이 네트워크 딜레이로 즉시 반영되지 않을 수 있으므로, 값에 따라 로직을 분기할 때는 현재 값을 확인하는 과정을 반드시 거치세요.

네트워크 이벤트

방 진입/퇴장 및 다른 사용자의 출입에 반응하려면 다음 이벤트 함수를 구현합니다.

자세한 사용법은 Network Event Function 을 참고하세요.

예제 — Room 프로퍼티로 Shake 카운트 공유

ButtonZiggler 버튼을 클릭할 때마다 Shake 효과를 주고, 누른 횟수를 Room 프로퍼티로 공유해서 방의 모든 참여자에게 동일 숫자를 표시하는 예제입니다.

local TargetTextTmp
local count

function awake()
  -- Button 의 onClick 에 Shake 등록
  self:GetComponent(typeof(Button)).onClick:AddListener(Shake)
  TargetTextTmp = TargetText.gameObject:GetComponent(typeof(TMP_Text))

  -- Room 프로퍼티 변경 콜백 등록
  Room.RegisterRoomPropChanged("Shake", onChangedShakeProp)

  count = tonumber(Room.GetRoomProp("Shake"))
  if count ~= nil then
    ChangedShakeCount(count)
  else
    count = 0
    Room.SetRoomProp("Shake", 0)
  end
end

function Shake()
  self:DoShake(1, 100, 20)
  count = count + 1
  Room.SetRoomProp("Shake", count)
end

function onChangedShakeProp(value)
  if value == nil then return end
  ChangedShakeCount(value)
end

function ChangedShakeCount(value)
  TargetTextTmp.text = "Shake Count: (" .. value .. ")"
end