---
title: 多人游戏
slug: world-sdk-guide-ch/UU38melbiSytuaJV2LELn
docTags: 
createdAt: 2024-09-03T08:56:14.553Z
---

ZEPETO 多人游戏是一个模块，允许多个用户同时连接并玩这个世界。

它提供了服务器/客户端开发和本地测试环境。

:::hint{type="info"}
�&#xDCD8;**&#x20;官方多人游戏世界示例**

- GitHub: [https://github.com/naverz/zepeto-multiplay-example](https://github.com/naverz/zepeto-multiplay-example)
- 教程 : [创建多人游戏](docId\:sPK-TARdrDZ3tD3r6GnAe)
:::

## 步骤 1 : 安装

在 \[项目] 面板左上角的 \[+] 菜单中选择 ZEPETO → 多人游戏服务器，或转到资产 → 创建 → ZEPETO → 多人游戏服务器。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-j90fKsIuKZKfnVXabbkX0-20240904-102408.png)

World.multiplay 包含以下项目，并在世界发布时自动更新。

- index.ts：服务器主要逻辑代码
- schemas：服务器/客户端通信的数据结构

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-nizmsZpejlenvikndjCGs-20240904-102408.png)

:::hint{type="danger"}
❗&#xFE0F;**&#x20;注意**

每个游戏只能创建一个 World.multiplay 包。
:::


步骤 2：设置
-------

点击下图所示的 \[打开世界设置] 以设置世界设置。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-NxzUiyO-mAN4iRpEu1j4t-20240904-102409.png)

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-RAyZ33qG5Bo2YwzysM7q7-20240904-102409.png)

| **属性** | **描述**         |
| ------ | -------------- |
| 版本     | 输入要注册的文件版本。    |
| 最大客户端数 | 设置可以访问房间的最大人数。 |
| 方向     | 选择屏幕的方向。       |
| 禁用邀请   | 禁用房间邀请功能。      |
| 禁用房间列表 | 禁用查看房间列表的功能。   |
| 禁用私人房间 | 禁用创建私人房间的功能。   |

:::hint{type="success"}
👍 **禁用邀请&#x20;**

即使房间邀请功能关闭，您仍然可以通过测试链接发送邀请。
:::

## 步骤 3 : 运行测试服务器

ZEPETO Multiplay 提供了一个本地服务器环境，创作者可以在开发过程中测试服务器/客户端。

要检查本地服务器操作，请选择 Unity 顶部菜单 → 窗口 → ZEPETO → 多人服务器，以打开服务器状态窗口。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-PWJhKG6uCRjZFESqyE3SZ-20240904-102409.png)

点击编辑器屏幕中央 \[▶︎(播放)] 按钮旁边的服务器按钮。

您将在服务器状态面板中看到以下服务器日志。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-7Dgnzpk9znLihdOGT9XRa-20240904-102408.png)

## 步骤 4 : 连接到客户端（连接到本地服务器）

ZepetoWorldMultiplay 组件是一个用于客户端的多玩家管理类。

在层级窗口中创建一个 GameObject，并添加 ZepetoWorldMultiplay 组件。
ZepetoWorldMultiplay 组件将自动连接到多玩家包。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-uHN55zN41rbDaB50lI2k5-20240904-102408.png)

点击编辑器屏幕中央的\[▶︎(播放)]按钮，以查看服务器日志窗口中的客户端连接日志。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-IfyrGQ-nhLDHN2mqQq1ZL-20240904-102408.png)

开发服务器运行在localhost(127.0.0.1)，端口在项目首次加载时设置。

通过多项目连接时，将连接环境设置为以下内容

:::hint{type="info"}
📘 **请参考以下指南&#x20;**[访问多人游戏IP地址](docId\:OA_ELWpL9VtGEQCRJK1g4) &#x20;
:::

:::hint{type="success"}
👍 **世界分发后，将在ZEPETO服务器上运行。**
:::

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-uFB-RnLTlviUOoDmKJSeC-20240904-102408.png)

## 步骤 5 : 服务器 / 客户端通信默认示例

**实现服务器逻辑**

World.multiplay 包中的 index.ts 文件是负责服务器主要逻辑的代码。

打开 index.ts 文件，并在 onCreate() 事件中添加在接收到消息类型 echo 后发送给客户端的逻辑。

:::hint{type="info"}
📘 **请参考以下指南 [\[Zepeto.Multiplay(服务器) API\]](https://developer.zepeto.me/docs/multiplay-server/)**
:::

```javascript
import { Sandbox, SandboxOptions, SandboxPlayer } from 'ZEPETO.Multiplay';
import { Player } from 'ZEPETO.Multiplay.Schema';

export default class extends Sandbox {

    onCreate(options: SandboxOptions) {
        this.onMessage("echo", (client, message) => {
            console.log(`Echo onMessage from ${client.sessionId}, -> ${message}`);

            // 发送给当前客户端
            client.send("echo", "发送给发送者 : " + message);

            // 广播给所有连接的客户端
            this.broadcast("echo", "发送给所有人 : " + message);
        });
    }

    onJoin(client: SandboxPlayer) {
        const player = new Player();
        player.sessionId = client.sessionId;
        player.userId = client.userId;
        const players = this.state.players;

        players.set(client.sessionId, player);

        console.log('onJoin!!!!');
    }

    onLeave(client: SandboxPlayer, consented?: boolean) {

    }
}
```

**实现客户端逻辑**

在用于发送/接收服务器事件的 ZepetoWorldMultiplay GameObject 中创建并添加 ZEPETO 脚本，如下所示：

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-DcldiGM197lCXsHhBr-mE-20240904-102409.png)

:::CodeblockTabs
MultiplaySample.ts

```javascript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { ZepetoWorldMultiplay } from 'ZEPETO.World';
import { Room } from 'ZEPETO.Multiplay';

export default class MultiplaySample extends ZepetoScriptBehaviour {

    private _multiplay: ZepetoWorldMultiplay;

    Start() {
        this._multiplay = this.gameObject.GetComponent<ZepetoWorldMultiplay>();

        this._multiplay.RoomJoined += (room: Room) => {
            console.log(`RoomCreated, my session id is ${room.SessionId}`);

            // 发送消息到服务器
            room.Send("echo", "你好 ZEPETO 多人游戏");

            // 添加服务器消息监听器
            room.AddMessageHandler("echo", (message) => {
                // 打印服务器消息
                console.log(message);
            });
        };
    }
}
```
:::

:::hint{type="info"}
**📘&#x20;**&#x8BF7;参考以下指南 [\[err\] ](docId\:dCVLxU1SlEipBVr2qKuiu)&#x20;
:::

## 步骤 6 : 测试输出结果

点击编辑器屏幕中央的 \[▶︎(播放)] 以运行服务器/客户端。您应该会看到如下所示的 'echo' 类型消息示例：

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-eoerpE3tTBr0iPMd6OTlt-20240904-102408.png)

① 客户端消息在服务器接收时的输出日志。

② 从服务器接收到的客户端消息日志。


使用服务器代码时的注意事项
=============

:::hint{type="danger"}
**&#x20;❗️ 注意**

**\[服务器代码中变量的使用]**

- 变量也可以在服务器代码中声明。
- 但是，服务器中可用的缓存内存目前限制为512KB。（这可能会在以后改变。）
- 如果超过512KB，房间可能会被隐藏，因此请在开发时考虑这一点。

**\[服务器代码中循环的使用]**

- 在服务器代码中，循环时间限制设置为2秒（2000毫秒）。
- 请在开发时考虑这一点，因为使用阻塞代码或长时间运行的循环可能会导致程序无法正确执行，因循环时间限制。
:::

