# Realtime Messaging Sample

这个 sample 单独覆盖：

- realtime custom message
- state sync
- RPC register / call / response

## 建议场景配置

在同一个场景对象上挂：

- `IGPRuntimeManager`
- `IGPMultiplayerRuntime`
- `IGPRealtimeMessagingSample`

## 当前覆盖能力

- `SendMessageAsync`
- `SetGlobalStateAsync`
- `SetPlayerStateAsync`
- `GetStateAsync`
- `ResetStateAsync`
- `RegisterRPCAsync`
- `UnregisterRPCAsync`
- `CallRPCAsync`
- `RespondRPCAsync`

`MessageReceived` 会把服务器保留消息转换成公开 DTO，并放在 `IGPMessageReceivedEvent.Content`：

- `state_set` -> `StateSetContent`
- `state_get` -> `StateGetResponseContent`
- `state_reset` -> `StateResetResponseContent`
- `rpc_call` -> `RPCCallContent`
- `rpc_response` -> `RPCResponseContent`

状态值和 RPC data 使用 `GetValue<T>()` / `GetData<T>()` 转为游戏类型。回复 RPC 时，将 `RPCCallContent.callerPlayerId` 传给 `RespondRPCAsync`。

## 推荐验证顺序

1. 先确保游戏已通过 desktop 启动并进入 hosted room。
2. 调用 `SendMessage()`。
3. 调用 `SetGlobalState()` / `SetPlayerState()`。
4. 调用 `GetGlobalState()`。
5. 调用 `RegisterRpc()`。
6. 调用 `CallRpc()`。
7. 调用 `UnregisterRpc()`。

## 说明

- 这个 sample 的重点是“实时能力的接法”，不负责房间生命周期说明。
- 房间生命周期请配合 `Samples~/RoomLifecycle` 一起看。
