---
title: 多人游戏房间状态
slug: world-sdk-guide-ch/6NqGcdh3W7B744RD8dI1E
docTags: 
createdAt: 2024-09-02T08:34:13.135Z
---

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-3_eY_aqy3ZYnl0QFBrYaw-20240904-102420.png)

Multiplay Room 提供一个状态属性，用于管理连接的玩家或对象位置。

状态的数据定义可以从模式文件中管理，该文件位于多玩家包下。
当客户端成功建立与房间的连接时，首先调用 onStateChange 事件，之后每当状态数据发生变化时都会调用该事件。



## 服务器 API

| **API**            | **描述**                                                                                                                   |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------ |
| state.SCHEMA\_NAME | 您可以通过状态访问在模式文件中定义的 SCHEMA\_NAME 字段。<br /><br />您可以在客户端请求或内部服务器逻辑的请求中修改字段值。<br /><br />更改的状态会通过 OnStateChange 事件自动传播到客户端。 |

:::hint{type="info"}
**📘&#x20;**&#x8BF7;参考以下指南。 \[[ZEPETO.Multiplay(服务器) API](https://developer.zepeto.me/docs/multiplay-server/classes/ZEPETO_Multiplay.Sandbox#state)]
:::

```typescript
import { Location } from 'ZEPETO.Multiplay.Schema';

export default class extends Sandbox {
 
   ...
   const location: Location = this.state.playerLocation;
   // 处理状态。
   ...
}
```

| **API**                            | **描述**                                                     |
| ---------------------------------- | ---------------------------------------------------------- |
| room.OnStateChange(State, isFirst) | 您可以在加入房间时注册状态更改回调。<br /><br />您可以第一次接收整个房间的状态，之后只会接收更改的状态。 |

## 客户端 API

```typescript
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 : 定义架构类型

架构类型是用于世界的数据结构。在检查器 → 架构类型中，按下 \[+] 按钮并添加数据。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-Hbuk57mwqKHFvEmG_-Wf0-20240904-102429.gif "4-4-3-1.gif")



## 步骤 2 : 添加房间状态

房间状态是显示世界房间当前状态的属性，并在上述定义的架构结构中表示。

在架构类型中，选择将用作世界当前状态的类型房间状态，并将其设置为 SCHEMA\_NAME。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-2ClXYyRzwj0OspO1NGGm0-20240904-102425.gif)

### Schemas.json 示例

```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"}
}
```

