유니티(Unity) HeartBeat Lobby란? (#Lobby)

heartbeat 생명주기

유니티 "Lobby 서비스"에서 사용되는 로비는 30초 안에 heartbeat를 보내거나 update되지 않으면 비활성화 됩니다.

 

비활성화 상태가 되면 유저는 더이상 'Quick Join'으로 참여할 수 없으며, query 결과값으로도 보이지 않게 됩니다.(즉, 로비를 찾지 못한다는 뜻)

 

비활성화 상태가 되고 1시간이 지나면, 로비는 만료됩니다.

만료된 로비는 새로운 업데이트나 하트비트가 없으면 자동으로 삭제됩니다!

 

업데이트는 로비 속성을 변경한 경우에만 실행됩니다.

여기에는 호스트의 플레이어 데이터에 대한 변경 사항은 포함되지 않습니다.

 


예시 코드

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

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

호스트는 위와 같이 주기적으로 하트비트해야하지만, 로비를 염두에 두고 나중에 삭제해야 합니다.

 

이를 수행하는 간단한 방법은 생성된 로비가 셧다운 되는 동안 아래 코드를 반복하는 것입니다

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

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