ロビーの heartbeat

特定の継続時間内にロビーが更新されず、ホストによって heartbeat リクエストも送信されない場合、そのロビーは 非アクティブ としてマークされます。ロビーのデフォルトのアクティブ生存期間は 30 秒です。プロジェクト内のロビーの activelifespan を設定 できます。

ロビーのプロパティが変更された場合にのみ更新がカウントされます。これには、ホストのプレイヤーデータに対する変更は含まれず、no-op 更新は含まれません。

非アクティブロビーを非表示にする主な目的は、放棄されたロビーをプレイヤーが継続的に発見/参加するのを防ぐことです。非アクティブ Public ロビーはクエリ結果に表示されず、"Quick Join" を通じて参加することもできません。Public と Private 両方の非アクティブロビーは、最終的に自動的に削除されます。非アクティブロビーは、ホストが更新するか heartbeat リクエストを送信すると再びアクティブにすることができます。

非アクティブロビーは、LastUpdated フィールドのフィルターを使用してクエリから自動的に除外されます。LastUpdated フィルターを含めると、デフォルトのフィルターがオーバーライドされ、クエリ結果に非アクティブロビーが含まれる可能性があります。

Get Lobby API は非アクティブステータスの影響を受けません。

1 時間の非アクティブ状態の後、ロビーは 期限切れ と見なされます。期限切れのロビーは任意の時点で削除される可能性があります。削除されると、ロビーはクエリや API で使用できなくなります。この継続時間は設定できません。期限切れのロビーは、更新するか heartbeat を送信すると再びアクティブにすることができます。

以下のコードサンプルは、コルーチンをロビーの作成と統合して、新しいロビーに heartbeat を定期的に送信する方法を示しています。

C#

async Task<Lobby> CreateLobbyWithHeartbeatAsync()
    {
        string lobbyName = "test lobby";
        int maxPlayers = 4;
        CreateLobbyOptions options = new CreateLobbyOptions();

        // Lobby parameters code goes here...
        // See 'Creating a Lobby' for example parameters
        var lobby = await LobbyService.Instance.CreateLobbyAsync(lobbyName, maxPlayers, options);

        // Heartbeat the lobby every 15 seconds.
        StartCoroutine(HeartbeatLobbyCoroutine(lobby.Id, 15));
        return lobby;
    }

    IEnumerator HeartbeatLobbyCoroutine(string lobbyId, float waitTimeSeconds)
    {
        var delay = new WaitForSecondsRealtime(waitTimeSeconds);

        while (true)
        {
            LobbyService.Instance.SendHeartbeatPingAsync(lobbyId);
            yield return delay;
        }

ホストは、ロビーの使用中は heartbeat を定期的に送信する必要がありますが、それらのロビーに気を配り、後で削除する必要もあります。これを行う非常にシンプルな方法は、作成したロビーをシャットダウン中にループ処理することです。

以下のコードサンプルは、MonoBehaviorOnApplicationQuit() 関数を利用して、作成したロビーを削除する方法を示しています。

C#

ConcurrentQueue<string> createdLobbyIds = new ConcurrentQueue<string>();

void OnApplicationQuit()
{
    while (createdLobbyIds.TryDequeue(out var lobbyId))
    {
        LobbyService.Instance.DeleteLobbyAsync(lobbyId);
    }
}