---
title: マルチプレイ
slug: world-sdk-guide-ja/ppFIQ4iUBegjQG7Ta91Ss
docTags: 
createdAt: 2024-09-03T08:56:14.553Z
---

ZEPETOマルチプレイは、複数のユーザーが同時にワールドに接続してプレイできるモジュールです。

サーバー/クライアントの開発とローカルテスト環境を提供します。

:::hint{type="info"}
📘**公式マルチプレイワールドサンプル**

- GitHub: [https://github.com/naverz/zepeto-multiplay-example](https://github.com/naverz/zepeto-multiplay-example)
- チュートリアル: [マルチプレイを作る](docId\:zp83R5fC6N0BI1I84p4k3)
:::

## ステップ 1 : インストール

\[プロジェクト]パネルの左上の\[+]メニューからZEPETO → マルチプレイサーバーを選択するか、Assets → Create → 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;注意**

ゲームごとに1つの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コンポーネントは、クライアント側で使用されるマルチプレイマネージャークラスです。

Hierarchyウィンドウに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\:LrXDLHuRljLUE_9cB2NZL) &#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"}
📘 **以下のガイドを参照してください&#x20;**[\[Zepeto.Multiplay(Server) 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 Multiplay");

            // サーバーメッセージリスナーを追加
            room.AddMessageHandler("echo", (message) => {
                // サーバーメッセージを表示
                console.log(message);
            });
        };
    }
}
```
:::

:::hint{type="info"}
**📘&#x20;**&#x6B21;のガイドを参照してください [\[err\] ](docId:4gCGObPUdcJthXXZbuW5w)&#x20;
:::

## ステップ 6 : 出力結果のテスト

エディタ画面の中央にある\[▶︎(再生)]をクリックして、サーバー/クライアントを実行します。以下に示すように、'echo'タイプのメッセージの例が表示されるはずです:

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

① サーバーでクライアントメッセージを受信したときの出力ログ。

② クライアントからサーバーに受信したメッセージのログ。


サーバーコード使用時の注意事項
===============

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

**\[サーバーコード内の変数の使用]**

- 変数はサーバーコード内でも宣言できます。
- ただし、サーバーで利用可能なキャッシュメモリは現在512KBに制限されています。（これは後で変更される可能性があります。）
- 512KBを超えると、部屋が隠れる可能性があるため、これを考慮して開発してください。

**\[サーバーコード内のループの使用]**

- ループの時間制限はサーバーコードで2秒（2000ms）に設定されています。
- ブロッキングコードや長時間実行されるループを使用すると、ループの時間制限によりプログラムが正しく実行されない可能性があるため、開発時に考慮してください。
:::

