VMap 제작하기
플레이어들이 접속할 수 있는 VMap(맵)을 제작하는 과정. VObject 포함·통합 빌드·레벨 디자인(네트워크 이벤트, Room 프로퍼티)을 다룹니다.
VMap 은 플레이어들이 접속하는 공간입니다. VObject 를 함께 빌드할 수 있고, VivenBehaviour 로 자체 로직을 수행할 수도 있습니다.
VObject 함께 빌드하기
VMap 에 VObject 를 포함시키는 과정은 몇 가지 차이점을 제외하면 VObject 빌드 와 동일합니다.
- VMap 에 배치된 VObject 는 ContentType 을 Prepared 로 설정해야 합니다. 이를 Prepared 오브젝트 라고 부릅니다.
- Prepared 오브젝트는 사용자가 제거할 수 없으며, VMap 이 로딩될 때 함께 로드됩니다. 그 외 동작은 일반 VObject 와 동일합니다.
VMap 빌드
- 먼저 Quick Start 의 필수 컴포넌트(VivenMapEnvironment, VivenPlayerStartPoint) 가 준비되었는지 확인합니다.
- 빌드할 Scene 을 열고 에디터 상단의
Build V-map버튼을 클릭합니다.
![]()
- 통합 빌드: Window / macOS / Android / iOS 중 1개 이상을 반드시 선택하고
통합 빌드 시작을 누릅니다.

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


빌드 실패 시 Addressable 설정을 먼저 확인하세요. Window → Asset Management → Addressables → Settings 에서 Catalog Build & Load Paths 가 Remote 인지, Enable Json Catalog 토글을 한 번 off/on 해봤는지 점검합니다.
레벨 디자인
VMap 자체 로직을 수행하는 매니저 스크립트를 만들 때 참고할 수 있는 사항들입니다.
네트워크 동기화
VObject 와 동일하게 RPC 와 SyncTable 을 사용할 수 있습니다. VMap 은 추가로 서버에 Room 프로퍼티 테이블을 저장할 수 있으며, 이 테이블은 방마다 독립적으로 존재하며 VMap 끼리 공유되지 않습니다.
Room 프로퍼티는 클라이언트와 독립이기 때문에 사용자가 맵을 나가도 값이 유지됩니다. 대량의 데이터나 잦은 변경은 네트워크 부하를 유발할 수 있으니 주의하세요.
Room 프로퍼티는 데이터 무결성을 보장하지 않습니다. 변경 요청이 네트워크 딜레이로 즉시 반영되지 않을 수 있으므로, 값에 따라 로직을 분기할 때는 현재 값을 확인하는 과정을 반드시 거치세요.
네트워크 이벤트
방 진입/퇴장 및 다른 사용자의 출입에 반응하려면 다음 이벤트 함수를 구현합니다.
onRoomJoined(roomData)onRoomLeave()onRoomUserJoined(userData)onUserLeaveRoom(userData)
자세한 사용법은 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