ロビーイベント

重要: ロビーイベントは、バージョン 1.0.0 以降でのみ使用できます。

Lobby パッケージには、Lobby Events システムが含まれています。これにより、リアルタイムのロビーイベントをサブスクライブできます。イベントは、メンバーが観測可能なプレイヤー/ロビー状態が変更されるたびに送信されます。例えば、プレイヤーが参加または退出したとき、プレイヤーが Public/Member データを更新したとき、ホストが Public/Member ロビーデータを更新したときなどです。イベントは、プレイヤーまたはホストがロビーのプライベートプロパティを更新した場合には送信されません。

イベントを使用すると、データが変更されるまでアクションは必要ないため、取得を通じたロビー状態のポーリングよりも効率的です。イベントは、1 秒あたりの取得数が 1 秒間に受信するイベント数よりも大幅に多い場合に効率的です。また、イベントのペイロードにはパッチのみが含まれるため、一般に、ペイロードが取得によって返されるものよりもはるかに小さい場合にはさらにメリットがあります。イベントの最大の欠点は、信頼性が低く、正しい順番での配信が保証されないことです。詳細については、"Lobby バージョン" を参照してください。

ノート: イベントは、信頼性が低い可能性があり、正しい順番での配信が保証されません。

Lobby インスタンスで SubscribeToLobbyEventsAsync メソッドを呼び出して、そのインスタンスの更新の受信をサブスクライブします。サブスクライブされると、Lobby サービスは変更が発生するたびに LobbyChanged イベントを呼び出します。ApplyToLobby ヘルパーメソッドを使用して変更を Models.Lobby オブジェクトに適用することもできます。

更新の受信

ロビーのリアルタイム更新をサブスクライブするには、以下を呼び出す必要があります。

Lobbies.Instance.SubscribeToLobbyEventsAsync(lobbyId, callbacks);
  • コールバックオブジェクトは、リアルタイム変更を消費するためのコールバックを提供します。
  • コールバックパラメーターは LobbyEventsCallbacks のインスタンスを受け入れます。これを作成してサブスクライブする必要があります。

ノート: プレイヤーがロビーのイベントを受信できるのは、そのロビー内にいる場合だけです。

以下のコードサンプルは、ロビーを作成し、サブスクライブする方法を示しています。

m_Lobby = await Lobbies.Instance.CreateLobbyAsync(lobbyName, maxPlayers, options);
var callbacks = new LobbyEventCallbacks();
callbacks.LobbyChanged += OnLobbyChanged;
callbacks.KickedFromLobby += OnKickedFromLobby;
callbacks.LobbyEventConnectionStateChanged += OnLobbyEventConnectionStateChanged;
try {
    m_LobbyEvents = await Lobbies.Instance.SubscribeToLobbyEventsAsync(m_Lobby.Id, callbacks);
}
catch (LobbyServiceException ex)
{
    switch (ex.Reason) {
        case LobbyExceptionReason.AlreadySubscribedToLobby: Debug.LogWarning($"Already subscribed to lobby[{m_Lobby.Id}]. We did not need to try and subscribe again. Exception Message: {ex.Message}"); break;
        case LobbyExceptionReason.SubscriptionToLobbyLostWhileBusy: Debug.LogError($"Subscription to lobby events was lost while it was busy trying to subscribe. Exception Message: {ex.Message}"); throw;
        case LobbyExceptionReason.LobbyEventServiceConnectionError: Debug.LogError($"Failed to connect to lobby events. Exception Message: {ex.Message}"); throw;
        default: throw;
    }
}

ノート: 前のコードサンプルでは、OnLobbyChangedOnKickedFromLobbyOnLobbyEventConnectionStateChanged がイベントを処理します。

以下のコードサンプルは、OnLobbyChanged のハンドラーの例を提供します。削除されたロビーインスタンスの処理方法を示しています。

private void OnLobbyChanged(ILobbyChanges changes)
{
    if (changes.LobbyDeleted)
    {
        // Handle lobby being deleted
        // Calling changes.ApplyToLobby will log a warning and do nothing
    }
    else
    {
        changes.ApplyToLobby(m_Lobby);
    }
    // Refresh the UI in some way
}

KickedFromLobby

Lobby Events サービスは、KickedFromLobby ハンドラーを使用してユーザーをロビーから削除します。この状況は、いくつかの理由で発生することがあります。例えば、接続が失敗した場合や、ホストがロビーからユーザーを削除する場合などです。ユーザーがロビーから追放されると、そのユーザーはロビーイベント接続状態 (LobbyEventConnectionStateChanged) が unsubscribed に変更されたことを示すメッセージを受信します。

以下のコードサンプルは、OnKickedFromLobby のハンドラーの例を提供します。

private void OnKickedFromLobby()
{


    // These events will never trigger again, so let’s remove it.
    this.m_LobbyEvents = null;
    // Refresh the UI in some way
}

以下のコードサンプルは、OnLobbyEventConnectionStateChanged のハンドラーの例を提供します。

ノート: Lobby Events への接続でエラーが発生した場合、Lobby は再接続を試行しません。

private void OnLobbyEventConnectionStateChanged(LobbyEventConnectionState state)
{
    switch (state)
    {
        case LobbyEventConnectionState.Unsubscribed: /* Update the UI if necessary, as the subscription has been stopped. */ break;
        case LobbyEventConnectionState.Subscribing: /* Update the UI if necessary, while waiting to be subscribed. */ break;
        case LobbyEventConnectionState.Subscribed: /* Update the UI if necessary, to show subscription is working. */ break;
        case LobbyEventConnectionState.Unsynced: /* Update the UI to show connection problems. Lobby will attempt to reconnect automatically. */ break;
        case LobbyEventConnectionState.Error: /* Update the UI to show the connection has errored. Lobby will not attempt to reconnect as something has gone wrong. */
    }
}

ロビーへの変更の適用

LobbyEventCallbacks.LobbyChanged イベントをサブスクライブすると、ロビーが更新されるたびに一連の変更を受け取ります。ロビーには一度に大量の変更がある可能性があるため、Lobby パッケージには、これらの変更をロビーに適用するためのヘルパー関数が含まれています。

以下のコードスニペットは、ApplyToLobby ヘルパー関数を使用してロビーの変更を適用する方法を示しています。

private void OnLobbyChanged(ILobbyChanges changes)
{
    changes.ApplyToLobby(m_Lobby);
    // Refresh the UI in some way
}

changes.ApplyToLobby を呼び出すと、ロビーでインプレース変更されたすべてのフィールドが更新されます。ロビーに対するインプレース変更が行われると、呼び出しによって、ApplyToLobby 関数に渡されたロビーオブジェクトの値が変更されます。特定の変更が適用されたかどうかを確認する必要がある場合は、ILobbyChanges インターフェースの ChangedLobbyValue メンバーを確認します。

以下のコードサンプルは、これらの値を確認する方法を示しています。

private void OnLobbyChanged(ILobbyChanges changes)
{
    changes.ApplyToLobby(m_Lobby);
    if (changes.Name.Changed)
    {
        // Do something specific due to this change
    }
    // Refresh the UI in some way
}

Lobby バージョン

Lobby バージョンは、最後にロビーが観測された後、新規にフェッチされたロビーが変更されたかどうかを確認するのに役立ちます。すべてのロビーが Version プロパティを公開します。バージョンは 1 から開始し、メンバーが観測可能なプレイヤー/ロビー状態が変更されるたびに 1 つ増加します。

ロビー変更の新規セットに関連付けられているバージョンが、最後に観測されたロビーバージョンよりちょうど 1 つだけ大きいのではない場合、更新は正しい順序で受信されなかったか失われました。欠落したメッセージがある場合は、取得を実行して最新バージョンを取得します。

GetLobby API は、オプションでロビーのバージョンを引数として受け入れることができます。帯域幅を節約するために、ロビーは指定されたバージョンが現在のバージョンと一致しない場合にのみ返されます。

以下のサンプルは、この例を示しています。

var lobby = await Lobbies.Instance.GetLobbyAsync("lobbyId");
var version = lobby.Version;

// check if a newer version of the lobby is available:
var newLobby = await Lobbies.Instance.GetLobbyAsync("lobbyId", version);
if (newLobby != null)
{
    // New lobby version received
    version = lobby.Version;
    // observe changed values in newLobby:

}

トラブルシューティング

提供されたすべてのイベントを処理していることを確認してください。特に OnLobbyEventConnectionStateChangedOnKickedFromLobby は、Lobby Events が停止していることを示している場合があります。

OnLobbyEventConnectionStateChanged

Lobby Events の接続ステータスは、イベントを受信するかどうかを示します。

以下は接続ステータスです。

Unsubscribed (サブスクライブ解除済み)

  • ILobbyEvents.UnsubscribeAsync を使用してサブスクライブ解除することを選択しました
  • 今後はロビーイベントを受信しません。

Subscribing (サブスクライブ中)

  • Lobby Events は接続を試行しています。
  • ロビーイベントは受信しません。

Subscribed (サブスクライブ済み)

  • Lobby Events は正常に接続します。
  • ロビーイベントを受信します。

Unsynced (同期解除済み)

  • 接続に一時的な問題があります。
  • Lobby Events は再接続を自動的に試みます。
  • ロビーイベントは受信しません。

エラー

  • 接続に回復不能な問題があります。
  • これは、インターネットの停止など、より大きな問題を示している可能性があります。解決には手動での介入が必要で、もう一度サブスクライブする必要がある場合があります。
  • ロビーイベントは受信しません。

API

インターフェース

ILobbyServiceSDK

メソッド / 設定名戻り値の型説明
SubscribeToLobbyEventsAsyncTask<ILobbyEvents>ロビーイベントをサブスクライブし、そのサブスクリプションを制御するオブジェクトを返します。

ILobbyEvents

メソッド / 設定名戻り値の型説明
CallbacksLobbyEventCallbacksSubscribeToLobbyAsync を呼び出すときに指定したコールバックオブジェクトを取得します。
SubscribeAsyncTaskイベントをサブスクライブします。これは、最初に SubscribetoLobbyAsync を呼び出したときに自動的に行われますが、サブスクライブ解除した場合は後でもう一度サブスクライブできます。
UnsubscribeAsyncTaskロビーイベントをサブスクライブ解除して、変更の受信を停止します。

ILobbyChanges

メソッド / 設定名戻り値の型説明
LobbyDeletedboolロビーが削除されたかどうかを示すブーリアン値。ロビーが削除された場合は true で、まだ使用可能な場合は false です。
NameChangedLobbyValue<string>ロビーの名前に対する変更 (変更された場合)。
IsPrivateChangedLobbyValue<bool>ロビーが Private かどうかに関する変更 (変更された場合)。
IsLockedChangedLobbyValue<bool>ロビーがロックされているかどうかに関する変更 (変更された場合)。
AvailableSlotsChangedLobbyValue<int>ロビー内の使用可能スロットに対する変更 (変更された場合)。
MaxPlayersChangedLobbyValue<int>ロビー内の最大プレイヤー数に対する変更 (変更された場合)。
DataChangedOrRemovedLobbyValue<Dictionary<string, ChangedOrRemovedLobbyValue<DataObject>>>ロビーのデータに対する変更 (変更された場合)。
PlayerLeftChangedLobbyValue<List<int>>退出したプレイヤーのリスト (いる場合)。
PlayerJoinedChangedLobbyValue<List<LobbyPlayerJoined>>参加したプレイヤーのリスト (いる場合)。
PlayerDataChangedLobbyValue<Dictionary<int, LobbyPlayerUpdated>>プレイヤーのデータに対する変更 (変更された場合)。
HostIdChangedLobbyValue<string>ロビーのホスト ID に対する変更 (変更された場合)。
Versionintロビーの最新バージョン。
LastUpdatedChangedLobbyValue<DateTime>ロビーの変更が行われた時刻。
ApplyToLobbyvoidロビーおよび変更アプリケーターを取得して、特定のロビーをインプレースで更新します。

クラス、構造体、enum

LobbyEventCallbacks

イベント名引数タイプ説明
LobbyChangedILobbyChangesロビーがサーバー上で変更された場合、Lobby サービスは発生した変更のセットとともにこのイベントを起動します。
KickedFromLobby サーバー上のロビーに対するサブスクリプションが強制的に解除されたとき。
LobbyEventConnectionStateChangedLobbyEventConnectionStateサブスクリプション接続の状態が変わったとき。

ChangedLobbyValue

設定名戻り値の型説明
ValueT変更によって提供された新しい値。
Changedbool変更が発生した場合は true で、変更がなかった場合は false。

LobbyValueChangeType

enum 値の名前enum 値説明
Unchanged0値は変更されませんでした。
Changed1値は変更されました。
Removed2値は削除されました。

ChangedOrRemovedLobbyValue

設定名戻り値の型説明
ValueT変更によって提供された新しい値。
Changedbool変更が発生した場合は true で、変更がなかった場合は false。
ChangeTypeLobbyValueChangeTypeこれが変更と削除のどちらであるか。

エラーコード

以下のエラーコードが追加されました。

LobbyExceptionReason の enum 値エラーコード説明
AlreadySubscribedToLobby16601このロビーはすでにサブスクライブしており、再度サブスクライブを試行しました
SubscriptionToLobbyLostWhileBusy16602サブスクライブやサブスクライブ解除など、接続を使用した操作中に接続が失われたか切断されました
LobbyEventServiceConnectionError16603Lobby サービスへの接続試行中に問題が発生しました。有効なロビー ID が送信されたことを確認してください