ロビーの 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 を定期的に送信する必要がありますが、それらのロビーに気を配り、後で削除する必要もあります。これを行う非常にシンプルな方法は、作成したロビーをシャットダウン中にループ処理することです。
以下のコードサンプルは、MonoBehavior の OnApplicationQuit() 関数を利用して、作成したロビーを削除する方法を示しています。
C#
ConcurrentQueue<string> createdLobbyIds = new ConcurrentQueue<string>();
void OnApplicationQuit()
{
while (createdLobbyIds.TryDequeue(out var lobbyId))
{
LobbyService.Instance.DeleteLobbyAsync(lobbyId);
}
}