유니티(Unity) 로비 연결 및 관리! (#Lobby 3편)

#1. Get joined lobbies

GetJoinedLobbies  API를 이용해서 Lobby를 선택할 수 있습니다

이 API는 현재 활동중인 플레이어가 현재 속한 로비를 위한 로비 ID의 List를 반환해준다!

 

이 API는 예기치 못한 끊김에 사용될 수 있습니다

예기치 못한 끊김(충돌이나 사용자가 로비에서 연결을 끊는 등)이 발생할 때,

플레이어가 속한 모든 로비 목록을 가져오기 위해 API를 사용할 수 있고,

API를 사용하여 전체 로비 세부 정보를 회복(?)하거나 로비에 다시 연결할 수 있습니다!

 

try
{
        var lobbyIds = await LobbyService.Instance.GetJoinedLobbiesAsync();
}
catch (LobbyServiceException e)
{
        Debug.Log(e);
}

GetJoinedLobbiesAsync()

 

#2. Update lobby data

로비 호스트는 로비의 데이터를 Update시킬 수 있는 유일한 Player입니다

다른 플레이어들은 Visibility한 Option에 따라 로비 데이터를 볼 수 있습니다

 

 try
        {
            UpdateLobbyOptions options = new UpdateLobbyOptions();
            options.Name = "testLobbyName";
            options.MaxPlayers = 4;
            options.IsPrivate = false;

            //Ensure you sign-in before calling Authentication Instance
            //See IAuthenticationService interface
            options.HostId = AuthenticationService.Instance.PlayerId;

            options.Data = new Dictionary<string, DataObject>()
            {
                {
                    "ExamplePrivateData", new DataObject(
                        visibility: DataObject.VisibilityOptions.Private,
                        value: "PrivateData")
                },
                {
                    "ExamplePublicData", new DataObject(
                        visibility: DataObject.VisibilityOptions.Public,
                        value: "PublicData",
                        index: DataObject.IndexOptions.S1)
                },
            };

            var lobby = await LobbyService.Instance.UpdateLobbyAsync("lobbyId", options);

            //...
        }
        catch (LobbyServiceException e)
        {
            Debug.Log(e);
        }

UpdateLobbyOptions options = new UpdateLobbyOptions(); 로 업데이트할 옵션을 수정한 후

var lobby = await LobbyService.Instance.UpdateLobbyAsync("lobbyId", options); 를 통해 싱크를 맞춰주면 됩니당

 

#3. Update player data

플레이어들은 로비 안에서 자신의 데이터를 Update할 수 있습니다

로비 호스트와 다른 플레이어들은 Visibilty Option Data에 따라 Player Data를 읽을 수 있습니다

 try
        {
            UpdatePlayerOptions options = new UpdatePlayerOptions();

            options.Data = new Dictionary<string, PlayerDataObject>()
            {
                {
                    "existing data key", new PlayerDataObject(
                        visibility: PlayerDataObject.VisibilityOptions.Private,
                        value: "updated data value")
                },
                {
                    "new data key", new PlayerDataObject(
                        visibility: PlayerDataObject.VisibilityOptions.Public,
                        value: "new data value")
                }
            };

            //Ensure you sign-in before calling Authentication Instance
            //See IAuthenticationService interface
            string playerId = AuthenticationService.Instance.PlayerId;

            var lobby = await LobbyService.Instance.UpdatePlayerAsync("lobbyId", playerId, options);

            //...
        }
        catch (LobbyServiceException e)
        {
            Debug.Log(e);
        }

UpdatePlayerOptions options = new UpdatePlayerOptions(); 를 통해 PlayerData 옵션을 수정하고

 var lobby = await LobbyService.Instance.UpdatePlayerAsync("lobbyId", playerId, options); 를 통해 싱크를 맞춰주면 됩니당

 

#4. Query for lobbies

Query API를 이용해서 플레이어는 방 탐색에 도움을 받을 수 있습니다

그 방법에는

Sorting lobbies, Filtering lobbies이 있습니다

Sorting Lobby 예시로는, 플레이어가 최근에 생성된 로비만 보고 싶으면 Lobby가 만들어진 시간을 분류할 수 있습니다

Filtering Lobby 예시로는 파라미터를 이용해서 로비를 걸러낼 수 있는데요, Lobby의 이름, 방 인원수, 만들어진 Custom Data 등을 파라미터 설정해서 탐색할 수 있습니다

try
{
    QueryLobbiesOptions options = new QueryLobbiesOptions();
    options.Count = 25;

    // Filter for open lobbies only
    options.Filters = new List<QueryFilter>()
    {
        new QueryFilter(
            field: QueryFilter.FieldOptions.AvailableSlots,
            op: QueryFilter.OpOptions.GT,
            value: "0")
    };

    // Order by newest lobbies first
    options.Order = new List<QueryOrder>()
    {
        new QueryOrder(
            asc: false,
            field: QueryOrder.FieldOptions.Created)
    };

    QueryResponse lobbies = await Lobbies.Instance.QueryLobbiesAsync(options);

    //...
}
catch (LobbyServiceException e)
{
    Debug.Log(e);
}

QueryLobbiesOptions options = new QueryLobbiesOptions(); 를 이용해 원하는 로비 옵션을 Query하고

QueryResponse lobbies = await Lobbies.Instance.QueryLobbiesAsync(options); 를 통해 원하는 로비만 볼 수 있게 할 수 있습니다!

 

#5. Host migration

반장(Host) 주기(migration, 내가 임의로 해석함 ㅎㅎ..)은 다른 플레이어에게 로비 호스트를 주는 행위입니다

이 프로세스는 다음 시나리오에서 발생할 수 있습니다

  • 로비의 반장이 새로운 반장 선택할 때 - UpdateLobby를 사용함으로써, 새로운 반장 플레이어의 ID 필드를 HostID로 Update함으로써
  • 반장이 새로운 반장을 선택하지 않고 의도적으로 로비를 떠날 때
  • Relay Integrations에 의해 비활성화되어서 반장이 삭제될 때

반장이 새로운 반장을 뽑는 명확한 시나리오가 없다면, 새로운 반장은 로비 안에있는 플레이어 중 랜덤하게 한 명이 선택되어 반장이 된다! 

 

Note: If the host is removed due to inactivity, the underlying relay connection is destroyed. To continue receiving automatic disconnects, the new host must create a new relay, and then have the other players join it and set their Allocation ID/ Connection info per the instructions in the Relay integrations section.