多人游戏房间状态
7 分

Multiplay Room 提供一个状态属性,用于管理连接的玩家或对象位置。
状态的数据定义可以从模式文件中管理,该文件位于多玩家包下。 当客户端成功建立与房间的连接时,首先调用 onStateChange 事件,之后每当状态数据发生变化时都会调用该事件。
服务器 API
API | 描述 |
|---|---|
state.SCHEMA_NAME | 您可以通过状态访问在模式文件中定义的 SCHEMA_NAME 字段。 您可以在客户端请求或内部服务器逻辑的请求中修改字段值。 更改的状态会通过 OnStateChange 事件自动传播到客户端。 |
📘 请参考以下指南。 [ZEPETO.Multiplay(服务器) API]
import { Location } from 'ZEPETO.Multiplay.Schema';
export default class extends Sandbox {
...
const location: Location = this.state.playerLocation;
// 处理状态。
...
}API | 描述 |
|---|---|
room.OnStateChange(State, isFirst) | 您可以在加入房间时注册状态更改回调。 您可以第一次接收整个房间的状态,之后只会接收更改的状态。 |
客户端 API
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { Location } from 'ZEPETO.Multiplay.Schema';
export default class SampleClient extends ZepetoScriptBehaviour {
Start() {
this.multiplay.RoomJoined += (room: Room) => {
room.OnStateChange += this.OnStateChange;
};
}
private OnStateChange(state: State, isFirst: boolean) {
const location: Location = state.playerLocation;
// 使用更新的状态处理玩家位置。
}
}
定义模式文件
模式是定义房间当前状态的数据结构。房间主要用于管理玩家信息、玩家或物体位置等。
要编辑架构,您可以选择项目视图 → MultiplayPackage 资产 → schema.json,然后在检查器窗口中修改用于世界的数据类型。 您可以在检查器窗口中修改用于世界的数据类型。
步骤 1 : 定义架构类型
架构类型是用于世界的数据结构。在检查器 → 架构类型中,按下 [+] 按钮并添加数据。

4-4-3-1.gif
步骤 2 : 添加房间状态
房间状态是显示世界房间当前状态的属性,并在上述定义的架构结构中表示。
在架构类型中,选择将用作世界当前状态的类型房间状态,并将其设置为 SCHEMA_NAME。

Schemas.json 示例
{
"State" : {"players" : {"map" : "Player"}},
"Player" : {"sessionId" : "string","zepetoUserId" : "string","transform" : "Transform","state" : "number","subState" : "number"},
"Transform" : {"position" : "Vector3","rotation" : "Vector3"},
"Vector3" : {"x" : "number","y" : "number","z" : "number"}
}