针对大厅进行心跳检测

如果大厅在规定的时间内没有被厅主更新或发送心跳请求,系统会将大厅标记为不活动。大厅的默认活动寿命为 30 秒。您可以在您的项目为大厅配置活动寿命

只有对大厅属性进行更改,才算是更新;这不包括对厅主玩家数据的更改,也不包括无操作更新。

隐藏不活动大厅的主要目的是防止玩家持续找到/加入被遗弃的大厅。处于不活动状态的公开大厅不会显示在查询结果中,也无法通过“快速加入”来加入,并且系统最终会自动删除处于不活动状态的公开大厅和私人大厅。通过由厅主进行更新或发送心跳请求,可以重新激活处于不活动状态的大厅。

通过使用针对 LastUpdated 字段的过滤器,不活动大厅会被自动从查询中排除。如果您加上 LastUpdated 过滤器,它将会覆盖默认过滤器,并且查询结果中可以包含不活动大厅。

Get Lobby API 不受不活动状态影响。

处于不活动状态 1 小时后,大厅会被视为已过期。系统可能会随时删除已过期的大厅。删除后,大厅便不会再出现在查询中,也无法通过任何 API 获取。此持续时间不可配置。您可以通过更新大厅或发送心跳请求来重新激活已过期的大厅。

以下代码示例展示了如何将协同程序与大厅创建流程相集成,以便定期针对新的大厅进行心跳检测:

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;
        }

虽然厅主应当定期针对使用中的大厅进行心跳检测,但厅主还应谨慎管理这些大厅并在使用后将其删除。一个非常简单的方法是在关闭期间遍历已创建的大厅。

以下代码示例展示了如何利用 MonoBehaviorOnApplicationQuit() 函数来删除已创建的大厅:

C#

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

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