ルーム持続のガイド

このガイドでは、Webサーバー上でPhotonのルームデータを持続する方法について説明します。

概念

Photonアプリケーションは基本的に同期しますが、非同期動作に対応するように拡張することができます。

Photon Webhookを有効にし設定することで、プレイヤーがゲームデータを失うことなくシームレスにルームを離れ、再入室することができるようになります。

フレンドからの招待による、非同期的なルーム参加を有効にすることもできます。

Photonでは、ゲームデータをルームステートと呼びます。ルームステートの構成は以下のとおりです。

  • ルームオプション
  • ルームプロパティ
  • アクタ一覧
  • イベントキャッシュ
  • インタレストグループ

退室したゲームを再開するには、ルームステートの再構築が必要です。
このため、ルームステートを現状のまま保存するのが、Photonでルームステートを持続する最も簡単な方法です。

ルームステートの保存

ルームステートを保存するには、以下のWebhookの設定が必要です:

  • BaseUrl は、利用可能なURLである必要があります。
  • IsPersistent = true
  • PathClose は、有効に動作するパスでなければなりません。

ルームを作成する際には、以下の条件を満たす必要があります:

  • RoomOptions.PlayerTTL == -1 または RoomOptions.PlayerTTL > RoomOptions.EmptyRoomTTL.
  • RoomOptions.CheckUserOnJoin = true.

プレイヤーがルームを放棄せずに退室するには、 「Disconnect()」または「OpLeave(true)」を呼び出す必要があります。

ルームステートはGameCloseWebhookで送信され、Webサーバーでそのステートを保存する必要があります。

ルームステートの読み込み

ルームステートを読み込むには、以下のWebhookの設定が必要です。

  • BaseUrl は、利用可能なURLである必要があります。
  • IsPersistent = true
  • PathCreate は、有効に動作するパスでなければなりません。

ルームに再び参加するには、以下を呼びます:

C#

loadBalancingClient.OpReJoinRoom(savedRoomName);

ゲームに挑戦や招待機能が含まれる場合は、「AsyncJoin」を有効にする必要があります(デフォルトでは有効)。
これによって、通常はルーム名でルームに参加できるようになります:
名前を指定してルームに参加できるようにします:

```csharp
loadBalancingClient.OpJoinRoom(roomName);

Webサーバーから、Webhookレスポンスで以前に保存したルームステートを返す必要があります。

## CheatSheet

<table class="table">
    <thead>
        <tr>
            <th width="15%">
                IsPersistent
            </th>
            <th width="15%">
                PathCreate
            </th>
            <th width="15%">
                PathClose
            </th>
            <th width="22.5%">
                RoomOptions
            </th>
            <th width="32.5%">
                Comment
            </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>
                 true
            </td>
            <td>
                valid path
            </td>
            <td>
                valid path
            </td>
            <td>
                <code>PlayerTTL == -1</code> <br>
                <code>0 <= EmptyRoomTTL</code>
            </td>
            <td>
                インアクティブプレイヤーがタイムアウトすることはありません。<br>
                ルームステートは以下に該当しない場合、常に送信されます:
                <ul>
                    <li> すべてのアクターが明示的に退室した場合。
                    <li> ルームが<code>EmptyRoomTTL</code>ミリ秒間、空だった場合。
                </ul>
            </td>
        </tr>
        <tr>
            <td>
                 *
            </td>
            <td>
                *
            </td>
            <td>
                *
            </td>
            <td>
                <code>EmptyRoomTTL >= PlayerTTL</code> <br>
                <code>PlayerTTL >= 0</code>
            </td>
            <td>
                今後GameClose Webhookにルームステートは送信されません。
            </td>
        </tr>
        <tr>
            <td>
                 true
            </td>
            <td>
                有効なパス
            </td>
            <td>
                有効なパス
            </td>
            <td>
                <code>PlayerTTL > EmptyRoomTTL</code> <br>
                <code>EmptyRoomTTL >= 0</code>
            </td>
            <td>
                ルームの読み込みは、ルームの保存後<code>PlayerTTL - EmptyRoomTTL</code>ミリ秒間のみ可能です。
            </td>
        </tr>
        <tr>
            <td>
                 false
            </td>
            <td>
                *
            </td>
            <td>
                *
            </td>
            <td>
                *
            </td>
            <td>
                ルームの持続が有効でなくなりました。ルームステートは、今後GameClose Webhookに送信されません。
            </td>
        </tr>
        <tr>
            <td>
                 *
            </td>
            <td>
                空であるか、または有効なパスではありません
            </td>
            <td>
                *
            </td>
            <td>
                *
            </td>
            <td>
                ルームステートを読み込むことはできません。
            </td>
        </tr>
        <tr>
            <td>
                 *
            </td>
            <td>
                *
            </td>
            <td>
                空であるか、または有効なパスではありません
            </td>
            <td>
                *
            </td>
            <td>
                ルームステートが送信されることはありません。
            </td>
        </tr>
    </tbody>
</table>
Back to top