[task] | diverse_qa [title] | 월드 인스턴스 통신 [category] | Guides [rephrased] | 질문: `WorldInstanceService`의 이벤트를 수신하기 위해 크리에이터가 반드시 수행해야 하는 절차는 무엇인가요? 답변: 크리에이터는 `WorldInstanceService`에 이벤트 핸들러를 연결해야만 이벤트를 수신할 수 있습니다. 질문: `WorldInstanceService`의 이벤트가 발생하는 실행 공간은 어디인가요? 답변: `WorldInstanceService`의 이벤트 발생 공간은 서버입니다. 질문: 다음 코드의 역할은 무엇인가요? ```lua Event Handler: [service: WorldIns [original] | 크리에이터가 `WorldInstanceService`에 이벤트 핸들러를 연결해야 이벤트를 수신할 수 있습니다. 이벤트 발생 공간은 서버입니다. ```lua Event Handler: [service: WorldInstanceService] HandleMyWorldInstanceEvent(MyWorldInstanceEvent event ) { log ("Receive MyWorldInstanceEvent.") } ``` # WorldInstanceService 제한 사항 **WorldInstanceService**를 사 [chunk_id] | Guides:999:3
[task] | distill [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | # RoomService: 룸 간 통신 `RoomService`는 하나의 월드 인스턴스 내에서 **정적 룸(Static Room)**과 **인스턴스 룸(Instance Room)** 간의 직접 통신이 불가능함을 보완하기 위한 서비스입니다. 이 서비스를 통해 인스턴스 룸 생성, 유저 이동, 그리고 **공유 메모리(Shared Memory)**를 이용한 상태 동기화가 가능합니다. > **참고:** 기본 개념은 `WorldInstanceService`와 동일합니다. 사전 학습으로 [월드 인스턴스], [월드 인스턴스 통신], [인스턴스 [original] | # 학습 과정 소개 RoomService를 활용해 하나의 월드 인스턴스 안에 있는 정적 룸과 인스턴스 룸끼리 통신을 할 수 있습니다. 이 가이드는 예제 위주로 진행되며, 기본 개념은 [WorldInstanceService](/apiReference?postId=1034)와 동일합니다. [월드 인스턴스](/docs/?postId=984), [월드 인스턴스 통신](/docs/?postId=999), [인스턴스 맵 만들기](/docs/?postId=540) 가이드를 먼저 학습하기를 권장합니다. # RoomService로 통신 정적 [chunk_id] | Guides:1035:0
[task] | wikipedia [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | # RoomService를 활용한 룸 간 통신 `RoomService`를 사용하면 하나의 월드 인스턴스(Wold Instance) 내에 존재하는 정적 룸(Static Room)과 인스턴스 룸(Instance Room) 사이의 통신이 가능합니다. 본 가이드는 예제 중심으로 구성되었으며, 기본적인 개념은 `WorldInstanceService`의 설명과 동일합니다. 해당 서비스를 이해하기 위해서는 `월드 인스턴스`, `월드 인스턴스 통신`, `인스턴스 맵 만들기` 가이드를 먼저 학습하는 것을 권장합니다. ## RoomService [original] | # 학습 과정 소개 RoomService를 활용해 하나의 월드 인스턴스 안에 있는 정적 룸과 인스턴스 룸끼리 통신을 할 수 있습니다. 이 가이드는 예제 위주로 진행되며, 기본 개념은 [WorldInstanceService](/apiReference?postId=1034)와 동일합니다. [월드 인스턴스](/docs/?postId=984), [월드 인스턴스 통신](/docs/?postId=999), [인스턴스 맵 만들기](/docs/?postId=540) 가이드를 먼저 학습하기를 권장합니다. # RoomService로 통신 정적 [chunk_id] | Guides:1035:0
[task] | knowledge_list [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | 제시된 문서의 내용을 바탕으로 핵심 사실을 추출하여 목록으로 정리합니다. 1. `StaticRoomLogic` 스크립트는 `[None]` 동기화 속성을 가진 `Entity` 타입 프로퍼티 `ButtonEnter`를 선언하며, 이는 `/ui/DefaultGroup/Btn_Enter` 경로와 연결됩니다. 2. `StaticRoomLogic`의 `[client only]` 실행 공간 메서드 `OnBeginPlay()`는 `_RoomService:IsInstanceRoom()`을 호출하여 인스턴스 룸 여부를 확인하고, 결과가 `false [original] | 1. **Workspace - MyDesk의 콘텍스트 메뉴에서 Create Scripts - Create Logic**을 선택해 새로운 **StaticRoomLogic**을 만듭니다. 2. 새로운 **ButtonEnter** 프로퍼티를 추가하고, 반환 타입을 Entity로 변경합니다. **Btn_Enter**을 연결합니다. ```lua Property: [None] Entity ButtonEnter = /ui/DefaultGroup/Btn_Enter ``` 3. 정적 룸에서만 인스턴스 룸으로 갈 [chunk_id] | Guides:1035:1
[task] | diverse_qa [title] | 월드 인스턴스 통신 [category] | Guides [rephrased] | 질문: 이 문서에서 설명하는 핵심 기능은 무엇인가요? 답변: 월드 인스턴스끼리 서로의 이벤트를 감지하는 방법입니다. 질문: `MyUserEnterEvent`에 추가된 프로퍼티의 이름과 타입은 무엇인가요? 답변: `string` 타입의 `WorldInstanceId`와 `Nickname`입니다. 질문: `HandleUserEnterEvnet` 함수 내에서 유저의 닉네임을 가져오기 위해 어떤 컴포넌트를 접근하나요? 답변: `user.PlayerComponent.Nickname`을 접근합니다. 질문: 모든 월드 인스턴스에 이벤트를 [original] | 월드 인스턴스끼리 서로의 이벤트를 감지하는 예제입니다. 1. Workspace - MyDesk - Create Scripts - Create EventType - 새로운 **MyUserEnterEvent**를 생성합니다. 2. **MyUserEnterEvent**에 프로퍼티를 추가합니다. ```lua Property: string WorldInstanceId = "" string Nickname = "" ``` 3. Workspace - MyDesk - Create Scripts - Cre [chunk_id] | Guides:999:4
[task] | distill [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | # RoomService를 활용한 룸 통신 및 UI 제어 `_RoomService`의 `IsInstanceRoom()` 메서드를 통해 정적 룸(Static Room)과 인스턴스 룸(Instance Room)을 구분하여 각각의 UI 요소를 활성화/비활성화하는 로직을 구현합니다. ## 1. 정적 룸 로직 (StaticRoomLogic) 정적 룸에서만 "입장" 버튼이 보이도록 설정합니다. ```lua Property: [None] Entity ButtonEnter = /ui/DefaultGroup/Btn_Enter Method: [original] | 1. **Workspace - MyDesk의 콘텍스트 메뉴에서 Create Scripts - Create Logic**을 선택해 새로운 **StaticRoomLogic**을 만듭니다. 2. 새로운 **ButtonEnter** 프로퍼티를 추가하고, 반환 타입을 Entity로 변경합니다. **Btn_Enter**을 연결합니다. ```lua Property: [None] Entity ButtonEnter = /ui/DefaultGroup/Btn_Enter ``` 3. 정적 룸에서만 인스턴스 룸으로 갈 [chunk_id] | Guides:1035:1
[task] | diverse_qa [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | 질문: RoomService를 사용해야 하는 주된 이유는 무엇인가요? 답변: 정적 룸과 인스턴스 룸은 직접적으로 통신을 할 수 없기 때문에, 서로 이벤트나 데이터를 공유하기 위해 RoomService의 함수를 사용해야 합니다. 질문: RoomService는 어떤 주요 기능을 수행하나요? 답변: RoomService는 인스턴스 룸을 생성하고 유저를 이동시킬 수 있으며, 같은 공유 메모리를 활용해 같은 월드 인스턴스 내의 룸끼리 상태를 공유하는 것도 가능합니다. 질문: 공유 메모리를 새로 생성하거나 얻어올 때 사용하는 함수 이름은 [original] | # 학습 과정 소개 RoomService를 활용해 하나의 월드 인스턴스 안에 있는 정적 룸과 인스턴스 룸끼리 통신을 할 수 있습니다. 이 가이드는 예제 위주로 진행되며, 기본 개념은 [WorldInstanceService](/apiReference?postId=1034)와 동일합니다. [월드 인스턴스](/docs/?postId=984), [월드 인스턴스 통신](/docs/?postId=999), [인스턴스 맵 만들기](/docs/?postId=540) 가이드를 먼저 학습하기를 권장합니다. # RoomService로 통신 정적 [chunk_id] | Guides:1035:0
[task] | extract_knowledge [title] | 월드 인스턴스 통신 [category] | Guides [rephrased] | # 월드 인스턴스 간 통신 (WorldInstanceService) ## 개념 설명 `WorldInstanceService`는 서로 다른 월드 인스턴스(World Instance) 간에 데이터를 공유하거나 이벤트를 전송하기 위한 서비스입니다. 이벤트 발생 공간은 **서버(server)**입니다. 클라이언트 측에서는 이벤트를 수신할 수 없으며, 반드시 서버 로직에서 처리됩니다. 데이터 공유는 `WorldInstanceSharedMemory`를 통해 이루어지며, 이는 인스턴스 간에 상태 정보를 동기화하는 역할을 합니다. ## AP [original] | 크리에이터가 `WorldInstanceService`에 이벤트 핸들러를 연결해야 이벤트를 수신할 수 있습니다. 이벤트 발생 공간은 서버입니다. ```lua Event Handler: [service: WorldInstanceService] HandleMyWorldInstanceEvent(MyWorldInstanceEvent event ) { log ("Receive MyWorldInstanceEvent.") } ``` # WorldInstanceService 제한 사항 **WorldInstanceService**를 사 [chunk_id] | Guides:999:3
[task] | extract_knowledge [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | # RoomService를 활용한 룸 간 통신 ## 개념 설명 `RoomService`는 하나의 월드 인스턴스(World Instance) 내부에 존재하는 정적 룸(Static Room)과 인스턴스 룸(Instance Room) 간의 통신을 가능하게 하는 서비스입니다. 정적 룸과 인스턴스 룸은 직접적으로 통신할 수 없으므로, 상태나 데이터를 공유하기 위해서는 반드시 `RoomService`의 함수를 사용해야 합니다. `RoomService`는 다음과 같은 주요 기능을 제공합니다. * 인스턴스 룸 생성 및 유저 이동 * [original] | # 학습 과정 소개 RoomService를 활용해 하나의 월드 인스턴스 안에 있는 정적 룸과 인스턴스 룸끼리 통신을 할 수 있습니다. 이 가이드는 예제 위주로 진행되며, 기본 개념은 [WorldInstanceService](/apiReference?postId=1034)와 동일합니다. [월드 인스턴스](/docs/?postId=984), [월드 인스턴스 통신](/docs/?postId=999), [인스턴스 맵 만들기](/docs/?postId=540) 가이드를 먼저 학습하기를 권장합니다. # RoomService로 통신 정적 [chunk_id] | Guides:1035:0
[task] | wikipedia [title] | 월드 인스턴스 통신 [category] | Guides [rephrased] | # 월드 인스턴스 간 통신 월드 인스턴스(World Instance)는 같은 월드 내에서도 독립적인 인스턴스로 동작하며, 각 인스턴스에서 발생하는 이벤트를 다른 인스턴스에 전달하여 상호 감지할 수 있습니다. 본 가이드는 특정 월드 인스턴스에서 유저가 입장했을 때, 해당 정보를 모든 월드 인스턴스로广播(전파)하고 각 인스턴스가 이를 수신하여 로그로 출력하는 예제를 다룹니다. ## 구현 단계 ### 1. 커스텀 이벤트 타입 정의 먼저 워크스페이스의 `MyDesk` 항목에서 `Create Scripts` > `Create Even [original] | 월드 인스턴스끼리 서로의 이벤트를 감지하는 예제입니다. 1. Workspace - MyDesk - Create Scripts - Create EventType - 새로운 **MyUserEnterEvent**를 생성합니다. 2. **MyUserEnterEvent**에 프로퍼티를 추가합니다. ```lua Property: string WorldInstanceId = "" string Nickname = "" ``` 3. Workspace - MyDesk - Create Scripts - Cre [chunk_id] | Guides:999:4
[task] | distill [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | ## RoomService를 활용한 룸 간 통신 **정적 룸**에서 플레이어를 **인스턴스 룸**으로 이동시키고, 상태를 공유하는 로직입니다. ### 1. 정적 룸: 인스턴스 룸 생성 및 유저 이동 `StaticRoomLogic`에 `string` 타입의 `userId` 파라미터를 가진 `[server]` 메서드 `EnterInstanceRoom`을 추가합니다. ```lua [server] void EnterInstanceRoom(string userId) { local roomKey = "ExampleRoom" [original] | 입장 버튼을 누른 플레이어가 인스턴스 룸에 입장할 수 있게 아래와 같이 작성합니다. 1. **StaticRoomLogic**에 새로운 **EnterInstanceRoom**을 추가합니다. Add Parameter를 누른 뒤, string 타입의 userId 매개 변수를 추가합니다. `RoomService`를 활용해 인스턴스 룸의 key를 가져오고, 유저를 해당 인스턴스 룸으로 보낼 수 있게 아래와 같이 작성합니다. ```lua [server] void EnterInstanceRoom(string userId) [chunk_id] | Guides:1035:3
[task] | knowledge_list [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | 제시된 문서 내용만을 바탕으로 추출한 핵심 사실 목록입니다. 1. 정적 룸 로직 컴포넌트(`StaticRoomLogic`)에는 `string` 타입의 `userId` 매개변수를 받는 `void EnterInstanceRoom(string userId)` 메서드가 정의되며, 이 메서드는 `[server]` 실행 공간 제약이 있습니다. 2. `EnterInstanceRoom` 메서드 내부에서는 `_RoomService:GetOrCreateInstanceRoom(roomKey)` API를 호출하여 지정된 문자열 `roomKey`(예: [original] | 입장 버튼을 누른 플레이어가 인스턴스 룸에 입장할 수 있게 아래와 같이 작성합니다. 1. **StaticRoomLogic**에 새로운 **EnterInstanceRoom**을 추가합니다. Add Parameter를 누른 뒤, string 타입의 userId 매개 변수를 추가합니다. `RoomService`를 활용해 인스턴스 룸의 key를 가져오고, 유저를 해당 인스턴스 룸으로 보낼 수 있게 아래와 같이 작성합니다. ```lua [server] void EnterInstanceRoom(string userId) [chunk_id] | Guides:1035:3
[task] | distill [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | # RoomService를 활용한 룸 간 통신 정적 룸과 인스턴스 룸은 로직이 독립적으로 실행되므로, 인스턴스 룸의 `InstanceRoomLogic.IsPlaying` 상태 변경을 정적 룸에 반영하려면 각 룸의 `OnUpdate`에서 해당 값을 조회하여 UI를 갱신해야 합니다. ## 1. StaticRoomLogic 정적 룸에서는 `_RoomService:IsInstanceRoom()`이 `false`일 때만 실행되며, 인스턴스 룸의 `IsPlaying` 값을 읽어 버튼 상태를 갱신합니다. ```lua [client onl [original] | InstanceRoomLogic의 IsPlaying 프로퍼티 값에 따라 버튼의 내용이 바뀔 수 있도록 만들어 봅시다. 정적 룸과 인스턴스 룸에서 로직은 별도로 실행되므로 인스턴스 룸의 변경된 IsPlaying 값을 정적 룸에 전달해야 합니다. 아래 그림과 같이 IsPlaying 값을 전달할 수 있도록 UI를 변경하는 코드를 작성해 봅시다. 1. StaticRoomLogic에 `OnUpdate`를 추가합니다. ```lua [client only] void OnUpdate(number delta) { [chunk_id] | Guides:1035:2
[task] | distill [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | **6. RoomEndEvent** 인스턴스 룸이 파괴될 때 `IsPlaying` 상태를 초기화하고, 해당 상태를 정적 룸에 전달합니다. ```lua [service: RoomService] HandleRoomEndEvent(RoomEndEvent event) { -- 인스턴스 룸에서만 실행 if _RoomService:IsInstanceRoom() == false then return end -- 상태 초기화 및 정적 룸으로 이벤트 전송 self.IsPlaying = f [original] | 6. **RoomEndEvent**를 추가합니다. 인스턴스 룸이 파괴될 때 IsPlaying 상태를 초기화할 수 있도록 아래와 같이 작성합니다. ```lua [service: RoomService] HandleRoomEndEvent(RoomEndEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: RoomService -- Space: Server -- [chunk_id] | Guides:1035:5
[task] | knowledge_list [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | 제시된 문서 내용을 바탕으로 핵심 사실을 정리한 목록은 다음과 같습니다. 1. 정적 룸과 인스턴스 룸은 로직이 별도로 실행되므로, 인스턴스 룸의 `IsPlaying` 값이 변경되면 해당 값을 정적 룸으로 전달하여 UI를 갱신해야 합니다. 2. `StaticRoomLogic`에 `[client only]` 실행 공간의 `OnUpdate(number delta)` 메서드를 추가하여, `_RoomService:IsInstanceRoom()`이 `false`인 경우에만 정적 룸 로직이 실행되도록 제어합니다. 3. `StaticRoomLo [original] | InstanceRoomLogic의 IsPlaying 프로퍼티 값에 따라 버튼의 내용이 바뀔 수 있도록 만들어 봅시다. 정적 룸과 인스턴스 룸에서 로직은 별도로 실행되므로 인스턴스 룸의 변경된 IsPlaying 값을 정적 룸에 전달해야 합니다. 아래 그림과 같이 IsPlaying 값을 전달할 수 있도록 UI를 변경하는 코드를 작성해 봅시다. 1. StaticRoomLogic에 `OnUpdate`를 추가합니다. ```lua [client only] void OnUpdate(number delta) { [chunk_id] | Guides:1035:2
[task] | wikipedia [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | ## RoomService를 활용한 룸 간 통신 메이플스토리 월드에서 정적 룸(Static Room)과 인스턴스 룸(Instance Room) 간의 상태 전환 및 UI 요소를 제어하기 위해 `RoomService`를 사용할 수 있습니다. 이 가이드에서는 정적 룸에서 인스턴스 룸으로의 진입 버튼과 인스턴스 룸 내 상태 표시 텍스트를 각각 다른 스크립트 로직으로 분리하여 관리하는 방법을 설명합니다. ### 정적 룸 로직 (StaticRoomLogic) 구성 먼저 정적 룸에서 실행되는 로직을 생성합니다. 워크스페이스(Workspac [original] | 1. **Workspace - MyDesk의 콘텍스트 메뉴에서 Create Scripts - Create Logic**을 선택해 새로운 **StaticRoomLogic**을 만듭니다. 2. 새로운 **ButtonEnter** 프로퍼티를 추가하고, 반환 타입을 Entity로 변경합니다. **Btn_Enter**을 연결합니다. ```lua Property: [None] Entity ButtonEnter = /ui/DefaultGroup/Btn_Enter ``` 3. 정적 룸에서만 인스턴스 룸으로 갈 [chunk_id] | Guides:1035:1
[task] | diverse_qa [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | 질문: StaticRoomLogic 스크립트를 생성할 때 Workspace의 어떤 항목을 선택해야 하는가? 답변: Workspace의 MyDesk에서 콘텍스트 메뉴를 열고 Create Scripts - Create Logic을 선택해 StaticRoomLogic을 생성합니다. 질문: ButtonEnter 프로퍼티의 반환 타입은 무엇이며, 어떤 엔티티를 연결해야 하는가? 답변: ButtonEnter 프로퍼티의 반환 타입은 Entity이며, /ui/DefaultGroup/Btn_Enter 엔티티를 연결해야 합니다. 질문: 아래 코드 [original] | 1. **Workspace - MyDesk의 콘텍스트 메뉴에서 Create Scripts - Create Logic**을 선택해 새로운 **StaticRoomLogic**을 만듭니다. 2. 새로운 **ButtonEnter** 프로퍼티를 추가하고, 반환 타입을 Entity로 변경합니다. **Btn_Enter**을 연결합니다. ```lua Property: [None] Entity ButtonEnter = /ui/DefaultGroup/Btn_Enter ``` 3. 정적 룸에서만 인스턴스 룸으로 갈 [chunk_id] | Guides:1035:1
[task] | wikipedia [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | `RoomService`를 활용하여 정적 룸(Static Room)에서 플레이어가 인스턴스 룸(Instance Room)으로 이동하는 통신 로직을 구현하는 절차는 다음과 같습니다. 먼저, 정적 룸의 로직을 담당하는 `StaticRoomLogic` 컴포넌트에 플레이어의 인스턴스 룸 진입을 처리하는 `EnterInstanceRoom` 메서드를 추가해야 합니다. 이 메서드는 Add Parameter 기능을 통해 `string` 타입의 `userId` 매개변수를 수신하도록 설정됩니다. 메서드 내부에서는 `RoomService`의 API를 [original] | 입장 버튼을 누른 플레이어가 인스턴스 룸에 입장할 수 있게 아래와 같이 작성합니다. 1. **StaticRoomLogic**에 새로운 **EnterInstanceRoom**을 추가합니다. Add Parameter를 누른 뒤, string 타입의 userId 매개 변수를 추가합니다. `RoomService`를 활용해 인스턴스 룸의 key를 가져오고, 유저를 해당 인스턴스 룸으로 보낼 수 있게 아래와 같이 작성합니다. ```lua [server] void EnterInstanceRoom(string userId) [chunk_id] | Guides:1035:3
[task] | knowledge_list [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | 1. `RoomEndEvent`는 `RoomService`의 서비스 이벤트 핸들러이며, 인스턴스 룸이 파괴될 때 트리거됩니다. 2. `HandleRoomEndEvent` 핸들러의 매개변수는 `RoomEndEvent` 타입의 `event` 객체이며, 실행 공간은 서버(Server)입니다. 3. 이벤트 처리 시 `_RoomService:IsInstanceRoom()` 메서드를 호출하여 현재 룸이 인스턴스 룸인지 확인해야 하며, 인스턴스 룸이 아니라면 함수를 즉시 반환(return)해야 합니다. 4. 인스턴스 룸이 파괴되는 시점에 `se [original] | 6. **RoomEndEvent**를 추가합니다. 인스턴스 룸이 파괴될 때 IsPlaying 상태를 초기화할 수 있도록 아래와 같이 작성합니다. ```lua [service: RoomService] HandleRoomEndEvent(RoomEndEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: RoomService -- Space: Server -- [chunk_id] | Guides:1035:5
[task] | extract_knowledge [title] | 월드 인스턴스 통신 [category] | Guides [rephrased] | # 월드 인스턴스 통신: 공유 변수와 ETag ## 1. 개념 설명 **ETag (Entity Tag)**는 여러 월드 인스턴스(World Instance) 간에 공유되는 변수의 데이터 무결성을 보장하기 위한 식별자입니다. * **필요성**: 복수의 월드 인스턴스가 동일한 공유 변수에 접근할 때, 어떤 데이터가 최신 상태인지 구별하기 어렵고, 경쟁 조건(Race Condition)으로 인해 의도치 않게 데이터가 덮어써질 수 있습니다. * **역할**: 데이터 생성, 수정, 조회 시마다 새로운 ETag가 발급됩니다. 이 [original] | **ETag**는 공유 변수의 데이터가 최신 상태인지 확인하기 위해 필요합니다. ETag는 식별자입니다. 데이터를 생성 또는 수정하거나, 기록을 조회할 때마다 새로운 ETag를 발급합니다. 발급한 ETag는 데이터의 버전을 기록하고, 비교하는데 사용합니다. ETag를 사용하는 이유는 여러 월드 인스턴스에서 하나의 공유 변수를 사용하면 어떤 데이터가 최신 데이터인지, 수정되었는지 알기 어렵기 때문입니다. 또한 여러 월드 인스턴스에서 공유 변수에 접근하므로 예기치 못하게 데이터를 덮어 쓸 수 있기 때문입니다. 공유 변수와 ETag는 [chunk_id] | Guides:999:2
[task] | wikipedia [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | ## RoomEndEvent 처리를 통한 인스턴스 룸 상태 초기화 인스턴스 룸이 파괴될 때 게임 로직의 상태 변수를 초기화하기 위해 `RoomService`의 `RoomEndEvent` 핸들러를 구현할 수 있습니다. 이 이벤트 핸들러는 서버 공간에서 실행되며, 인스턴스 룸의 수명 주기가 종료되는 시점에 트리거됩니다. 아래 코드 예제는 인스턴스 룸이 종료될 때 `IsPlaying` 상태를 `false`로 리셋하고, 해당 상태 변화를 정적 룸(`StaticRoom`)에 알리는 로직을 보여줍니다. ```lua [service: Ro [original] | 6. **RoomEndEvent**를 추가합니다. 인스턴스 룸이 파괴될 때 IsPlaying 상태를 초기화할 수 있도록 아래와 같이 작성합니다. ```lua [service: RoomService] HandleRoomEndEvent(RoomEndEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: RoomService -- Space: Server -- [chunk_id] | Guides:1035:5
[task] | distill [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | # RoomService를 활용한 룸 간 통신 `RoomService` API를 사용하여 인스턴스 룸의 상태 변경을 정적 룸에 실시간으로 공유합니다. ## 1. 커스텀 이벤트 정의 `RoomStateChangedEvent`를 생성하고 공유할 데이터를 프로퍼티로 정의합니다. ```lua Property: boolean IsPlaying = false ``` ## 2. 인스턴스 룸: 상태 변경 및 전송 `InstanceRoomLogic` 컴포넌트에 `RoomBeginEvent` 핸들러를 추가합니다. 인스턴스 룸에서만 실행되며, [original] | 새로운 이벤트를 생성하고, 그 이벤트를 사용해 인스턴스 룸의 상태를 정적 룸에 공유하게 만들어 봅시다. 1. **Workspace - MyDesk의 콘텍스트 메뉴에서 Create Scripts - Create Event**를 선택해 새로운 **RoomStateChangedEvent**를 생성합니다. 2. boolean 타입의 **IsPlaying** 프로퍼티를 추가합니다. ```lua Property: boolean IsPlaying = false ``` 3. **InstanceRoomLogic**을 [chunk_id] | Guides:1035:4
[task] | diverse_qa [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | 질문: `HandleRoomEndEvent` 핸들러가 수신하는 서비스와 이벤트 타입은 무엇인가요? 답변: `RoomService` 서비스의 `RoomEndEvent` 이벤트를 수신합니다. 질문: `HandleRoomEndEvent`에서 `_RoomService:IsInstanceRoom()`이 `false`를 반환할 때 스크립트는 어떻게 동작하나요? 답변: 함수를 즉시 종료(return)하여 나머지 로직을 실행하지 않습니다. 질문: 인스턴스 룸이 파괴될 때 `self.IsPlaying` 상태는 어떻게 변경되나요? 답변: `fal [original] | 6. **RoomEndEvent**를 추가합니다. 인스턴스 룸이 파괴될 때 IsPlaying 상태를 초기화할 수 있도록 아래와 같이 작성합니다. ```lua [service: RoomService] HandleRoomEndEvent(RoomEndEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: RoomService -- Space: Server -- [chunk_id] | Guides:1035:5
[task] | diverse_qa [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | 질문: `StaticRoomLogic` 컴포넌트에 인스턴스 룸 입장 기능을 추가할 때, 어떤 이름의 메서드와 어떤 타입의 매개변수를 추가해야 하는가? 답변: `EnterInstanceRoom`이라는 이름의 메서드를 추가하고, `string` 타입의 `userId` 매개변수를 추가해야 합니다. 질문: 아래 코드가 수행하는 주요 동작 두 가지를 설명하시오. ```lua local roomKey = "ExampleRoom" local mapName = "map02" _RoomService:GetOrCreateInstanceRoom(ro [original] | 입장 버튼을 누른 플레이어가 인스턴스 룸에 입장할 수 있게 아래와 같이 작성합니다. 1. **StaticRoomLogic**에 새로운 **EnterInstanceRoom**을 추가합니다. Add Parameter를 누른 뒤, string 타입의 userId 매개 변수를 추가합니다. `RoomService`를 활용해 인스턴스 룸의 key를 가져오고, 유저를 해당 인스턴스 룸으로 보낼 수 있게 아래와 같이 작성합니다. ```lua [server] void EnterInstanceRoom(string userId) [chunk_id] | Guides:1035:3
[task] | extract_knowledge [title] | 월드 인스턴스 통신 [category] | Guides [rephrased] | # 월드 인스턴스 간 이벤트 통신 ## 개념 설명 월드 인스턴스(World Instance)는 동일한 월드 설정을 가진 여러 독립적인 실행 환경입니다. 기본적으로 각 인스턴스는 독립적으로 동작하지만, `_WorldInstanceService`를 활용하여 한 인스턴스에서 발생한 이벤트를 다른 모든 인스턴스로 브로드캐스트할 수 있습니다. 이를 통해 플레이어 입장 같은 글로벌 상태 변화를 모든 인스턴스에 실시간으로 전달하고, 각 인스턴스는 수신된 이벤트를 처리하여 로컬 상태를 동기화하거나 로그를 출력할 수 있습니다. 이 패턴은 **커 [original] | 월드 인스턴스끼리 서로의 이벤트를 감지하는 예제입니다. 1. Workspace - MyDesk - Create Scripts - Create EventType - 새로운 **MyUserEnterEvent**를 생성합니다. 2. **MyUserEnterEvent**에 프로퍼티를 추가합니다. ```lua Property: string WorldInstanceId = "" string Nickname = "" ``` 3. Workspace - MyDesk - Create Scripts - Cre [chunk_id] | Guides:999:4
[task] | knowledge_list [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | 1. `RoomService`를 활용하여 인스턴스 룸의 상태를 정적 룸으로 공유하는 과정은 `RoomStateChangedEvent`라는 커스텀 이벤트를 생성하고, `boolean` 타입의 `IsPlaying` 프로퍼티(기본값 `false`)를 포함하도록 설정하는 것으로 시작됩니다. 2. `InstanceRoomLogic` 스크립트 컴포넌트에 `[service: RoomService]` 컨텍스트의 `HandleRoomBeginEvent(RoomBeginEvent event)` 이벤트 핸들러를 구현하여, 인스턴스 룸이 생성될 때 서버 [original] | 새로운 이벤트를 생성하고, 그 이벤트를 사용해 인스턴스 룸의 상태를 정적 룸에 공유하게 만들어 봅시다. 1. **Workspace - MyDesk의 콘텍스트 메뉴에서 Create Scripts - Create Event**를 선택해 새로운 **RoomStateChangedEvent**를 생성합니다. 2. boolean 타입의 **IsPlaying** 프로퍼티를 추가합니다. ```lua Property: boolean IsPlaying = false ``` 3. **InstanceRoomLogic**을 [chunk_id] | Guides:1035:4
[task] | wikipedia [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | # RoomSharedMemory의 제한 사항 RoomSharedMemory를 사용할 때는 작명 규칙과 수량 및 용량에 대한 특정 제약을 준수해야 합니다. ## 작명 규칙 RoomSharedMemory 이름과 공유 변수 이름은 알파벳 대소문자, 숫자, 공백, 밑줄(_), 하이픈(-)로만 구성할 수 있습니다. 이름은 최소 1글자 이상이어야 하며, 최대 100글자까지 사용할 수 있습니다. ## 수량 및 용량 제한 월드당 생성할 수 있는 RoomSharedMemory 객체는 최대 100개까지 허용됩니다. 개별 공유 변수에는 최대 [original] | # RoomSharedMemory 제한 사항 RoomSharedMemory를 사용할 때는 아래의 제한 사항을 염두에 두고 사용해야 합니다. #### 작명 규칙 RoomSharedMemory와 공유 변수 이름은 아래 문자로만 작명할 수 있습니다. 최소 1글자 이상의 이름이어야 하며, 최대 100글자 이름일 수 있습니다. * **알파벳 대,소문자** * **숫자** * **공백** * **_, -** #### 수량 및 용량 제한 * 한 월드 당 생성 가능한 RoomSharedMemory는 최대 100개입니다. * 하나의 공유 [chunk_id] | Guides:1035:8
[task] | wikipedia [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | # RoomService를 활용한 룸 간 통신 메이플스토리 월드의 `RoomService` API는 정적 룸(Static Room)과 인스턴스 룸(Instance Room) 사이의 상태 동기를 위해 사용됩니다. 각 룸은 독립된 로직 환경을 가지므로, 한 룸에서 발생한 상태 변경 사항을 다른 룸에 직접 전달할 수 없습니다. 따라서 인스턴스 룸의 상태 값을 정적 룸의 UI에 반영하려면, 정적 룸과 인스턴스 룸 각각의 스크립트에서 해당 값을 주기적으로 확인하고 갱신하는 로직을 구현해야 합니다. 본 섹션에서는 `InstanceRoomL [original] | InstanceRoomLogic의 IsPlaying 프로퍼티 값에 따라 버튼의 내용이 바뀔 수 있도록 만들어 봅시다. 정적 룸과 인스턴스 룸에서 로직은 별도로 실행되므로 인스턴스 룸의 변경된 IsPlaying 값을 정적 룸에 전달해야 합니다. 아래 그림과 같이 IsPlaying 값을 전달할 수 있도록 UI를 변경하는 코드를 작성해 봅시다. 1. StaticRoomLogic에 `OnUpdate`를 추가합니다. ```lua [client only] void OnUpdate(number delta) { [chunk_id] | Guides:1035:2
[task] | distill [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | # RoomSharedMemory 제한 사항 RoomSharedMemory 사용 시 아래 제한 사항을 준수해야 합니다. ### 작명 규칙 * **허용 문자**: 알파벳(대/소문자), 숫자, 공백, `_`, `-` * **길이**: 최소 1글자 이상, 최대 100글자 이하 ### 수량 및 용량 제한 * **생성 개수**: 월드당 최대 100개 * **공유 변수 용량**: 변수 1개당 최대 80,000 bytes * **공유 메모리 총 용량**: RoomSharedMemory 1개당 80MiB 초과 불가 * **이벤트 프로퍼티 용 [original] | # RoomSharedMemory 제한 사항 RoomSharedMemory를 사용할 때는 아래의 제한 사항을 염두에 두고 사용해야 합니다. #### 작명 규칙 RoomSharedMemory와 공유 변수 이름은 아래 문자로만 작명할 수 있습니다. 최소 1글자 이상의 이름이어야 하며, 최대 100글자 이름일 수 있습니다. * **알파벳 대,소문자** * **숫자** * **공백** * **_, -** #### 수량 및 용량 제한 * 한 월드 당 생성 가능한 RoomSharedMemory는 최대 100개입니다. * 하나의 공유 [chunk_id] | Guides:1035:8
[task] | knowledge_list [title] | RoomService를 활용해 룸끼리 통신하기 [category] | Guides [rephrased] | 제공된 문서 내용 기반으로 추출한 핵심 사실 목록입니다. 1. `InstanceRoomLogic` 스크립트 컴포넌트에 `Entity` 타입의 `TextRoomTitle` 프로퍼티를 `[None]` 속성으로 선언하며, 기본값으로 `/ui/DefaultGroup/Txt_RoomTitle` 경로를 지정합니다. 2. `InstanceRoomLogic`의 `OnBeginPlay` 메서드는 `[client only]` 실행 공간에서 동작하며, `_RoomService:IsInstanceRoom()` 호출 결과가 `true`인 경우 `self [original] | # 공유 메모리 활용 위에서 만든 예제 월드에서 새로운 UI를 추가하고, 해당 인스턴스 룸에 입장했을 때 공유 메모리 내용이 나타나도록 만들어 봅시다. 1. 텍스트 UI를 DefaultGroup에 추가하고 **Txt_RoomTitle** 이름으로 설정합니다. 2. **InstanceRoomLogic**에 새로운 Entity 타입의 **TextRoomTitle** 프로퍼티를 추가합니다. Txt_RoomTitle UI를 연결합니다. ```lua Property: [None] Entity TextRoom [chunk_id] | Guides:1035:6