针对大厅进行心跳检测
如果大厅在规定的时间内没有被厅主更新或发送心跳请求,系统会将大厅标记为不活动。大厅的默认活动寿命为 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;
}
虽然厅主应当定期针对使用中的大厅进行心跳检测,但厅主还应谨慎管理这些大厅并在使用后将其删除。一个非常简单的方法是在关闭期间遍历已创建的大厅。
以下代码示例展示了如何利用 MonoBehavior 的 OnApplicationQuit() 函数来删除已创建的大厅:
C#
ConcurrentQueue<string> createdLobbyIds = new ConcurrentQueue<string>();
void OnApplicationQuit()
{
while (createdLobbyIds.TryDequeue(out var lobbyId))
{
LobbyService.Instance.DeleteLobbyAsync(lobbyId);
}
}