기술 자료

지원

Lobby

Lobby

로비 이벤트

Subscribe to real-time lobby events to receive updates when lobby or player state changes occur.
읽는 시간 2분최근 업데이트: 한 달 전

Lobby 패키지에는 실시간 로비 이벤트를 구독할 수 있는 로비 이벤트 시스템이 포함되어 있습니다. 이벤트는 멤버가 관찰할 수 있는 플레이어 및 로비 상태가 변경될 때마다 전송됩니다. 예를 들어 플레이어가 참여하거나 나갈 때 플레이어는 공개/멤버 데이터를 업데이트하거나, 호스트는 공개/멤버 로비 데이터를 업데이트합니다. 플레이어나 호스트가 로비의 비공개 프로퍼티를 업데이트하면 이벤트는 전송되지 않습니다. 특히 일부 데이터가 변경될 때까지 작업이 필요하지 않으므로 이벤트를 사용하는 것이 GET을 통해 로비 상태를 폴링하는 것보다 더 효율적일 수 있습니다. 초당 GET의 개수가 초당 수신되는 이벤트 개수보다 현저하게 많으면 이벤트가 더 효율적입니다. 게다가 이벤트 페이로드에는 패치만 포함되므로 일반적으로 GET에서 반환되는 페이로드보다 훨씬 작다는 이점도 있습니다. 이벤트의 가장 큰 단점은 신뢰성이 떨어지고 순서에 따른 전송이 보장되지 않는다는 점입니다. 자세히 알아보려면 Lobby 버전을 참고하십시오. 참고: 이벤트는 신뢰성이 떨어지고 순서에 따른 전송이 보장되지 않습니다. Lobby 인스턴스에서
SubscribeToLobbyEventsAsync
메서드를 호출하여 해당 인스턴스의 업데이트를 수신하도록 구독합니다. 구독이 완료되면 Lobby 서비스는 변경 사항이 발생할 때마다
LobbyChanged
이벤트를 호출합니다. 또한
ApplyToLobby
헬퍼 메서드를 사용하여
Models.Lobby
오브젝트에 변경 사항을 적용할 수 있습니다.

업데이트 수신

로비의 실시간 업데이트를 구독하려면 다음과 같이 호출을 생성해야 합니다.
Lobbies.Instance.SubscribeToLobbyEventsAsync(lobbyId, callbacks);
  • 콜백 오브젝트는 실시간 변경 사항을 사용할 수 있도록 콜백을 제공합니다.
  • 콜백 파라미터는 생성 및 구독해야 하는
    LobbyEventsCallbacks
    의 인스턴스를 허용합니다.
다음 코드 샘플은 로비를 생성하고 구독하는 방법을 보여 줍니다.
m_Lobby = await Lobbies.Instance.CreateLobbyAsync(lobbyName, maxPlayers, options);var callbacks = new LobbyEventCallbacks();callbacks.LobbyChanged += OnLobbyChanged;callbacks.KickedFromLobby += OnKickedFromLobby;callbacks.LobbyEventConnectionStateChanged += OnLobbyEventConnectionStateChanged;try { m_LobbyEvents = await Lobbies.Instance.SubscribeToLobbyEventsAsync(m_Lobby.Id, callbacks);}catch (LobbyServiceException ex){ switch (ex.Reason) { case LobbyExceptionReason.AlreadySubscribedToLobby: Debug.LogWarning($"Already subscribed to lobby[{m_Lobby.Id}]. We did not need to try and subscribe again. Exception Message: {ex.Message}"); break; case LobbyExceptionReason.SubscriptionToLobbyLostWhileBusy: Debug.LogError($"Subscription to lobby events was lost while it was busy trying to subscribe. Exception Message: {ex.Message}"); throw; case LobbyExceptionReason.LobbyEventServiceConnectionError: Debug.LogError($"Failed to connect to lobby events. Exception Message: {ex.Message}"); throw; default: throw; }}
다음 코드 샘플은
OnLobbyChanged
의 핸들러 예시입니다. 삭제된 로비 인스턴스를 처리하는 방법을 보여 줍니다.
private void OnLobbyChanged(ILobbyChanges changes){ if (changes.LobbyDeleted) { // Handle lobby being deleted // Calling changes.ApplyToLobby will log a warning and do nothing } else { changes.ApplyToLobby(m_Lobby); } // Refresh the UI in some way}

KickedFromLobby

로비 이벤트 서비스는
KickedFromLobby
핸들러를 사용하여 로비에서 사용자를 제거합니다. 이는 다양한 이유로 인해 발생할 수 있습니다. 연결이 안 되거나 호스트가 로비에서 사용자를 제거하는 경우를 예로 들 수 있습니다. 사용자가 로비에서 퇴장당하면 로비 이벤트 연결 상태(
LobbyEventConnectionStateChanged
)가
unsubscribed
상태로 변경되었다는 메시지가 전달됩니다.
다음 코드 샘플은
OnKickedFromLobby
의 핸들러 예시입니다.
private void OnKickedFromLobby(){ // These events will never trigger again, so let’s remove it. this.m_LobbyEvents = null; // Refresh the UI in some way}
다음 코드 샘플은
OnLobbyEventConnectionStateChanged
의 핸들러 예시입니다.
참고: 로비 이벤트 연결에 오류가 있는 경우 Lobby에서 재연결을 시도하지 않습니다.
private void OnLobbyEventConnectionStateChanged(LobbyEventConnectionState state){ switch (state) { case LobbyEventConnectionState.Unsubscribed: /* Update the UI if necessary, as the subscription has been stopped. */ break; case LobbyEventConnectionState.Subscribing: /* Update the UI if necessary, while waiting to be subscribed. */ break; case LobbyEventConnectionState.Subscribed: /* Update the UI if necessary, to show subscription is working. */ break; case LobbyEventConnectionState.Unsynced: /* Update the UI to show connection problems. Lobby will attempt to reconnect automatically. */ break; case LobbyEventConnectionState.Error: /* Update the UI to show the connection has errored. Lobby will not attempt to reconnect as something has gone wrong. */ }}

로비에 변경 사항 적용

LobbyEventCallbacks.LobbyChanged
이벤트를 구독하면 로비가 업데이트될 때마다 일련의 변경 사항이 전송됩니다. 로비에는 언제든지 많은 변경 사항이 발생할 수 있으므로 Lobby 패키지에는 이러한 변경 사항을 로비에 적용하는 헬퍼 함수가 포함되어 있습니다.
다음의 코드 스니핏은
ApplyToLobby
헬퍼 함수를 사용하여 로비에 변경 사항을 적용하는 방법을 보여 줍니다.
private void OnLobbyChanged(ILobbyChanges changes){ changes.ApplyToLobby(m_Lobby); // Refresh the UI in some way}
changes.ApplyToLobby
를 호출하면 로비에서 변경된 모든 필드가 업데이트됩니다. 로비에서 변경 사항이 발생하면 호출은
ApplyToLobby
함수에 전달된 로비 오브젝트의 값을 수정합니다. 특정 변경 사항이 적용되었는지 확인하려면
ILobbyChanges
인터페이스에서
ChangedLobbyValue
멤버를 확인하십시오.
다음 코드 샘플은 이러한 값을 확인하는 방법을 보여 줍니다.
private void OnLobbyChanged(ILobbyChanges changes){ changes.ApplyToLobby(m_Lobby); if (changes.Name.Changed) { // Do something specific due to this change } // Refresh the UI in some way}

로비 버전

로비 버전은 마지막으로 관찰된 로비 이후에 새로 가져온 로비에 변경 사항이 있는지 확인하는 데 유용합니다. 모든 로비는
Version
프로퍼티를 공개합니다. 버전은 1로 시작하며 멤버가 관찰할 수 있는 플레이어 및 로비 상태가 변경될 때마다 숫자가 커집니다.
새로운 로비 변경 사항 세트와 관련된 버전이 마지막으로 관찰된 로비 버전보다 정확히 숫자 하나가 작은 버전이라면, 업데이트 순서가 맞지 않거나 누락된 경우일 수 있습니다. 누락 메시지가 표시된 경우 GET 작업을 수행하여 최신 버전을 검색하십시오.
GetLobby
API는 경우에 따라 로비 버전을 인수로 허용할 수 있습니다. 로비는 대역폭을 절약하기 위해 특정 버전이 현재 버전과 일치하지 않을 때만 반환됩니다.
다음 샘플을 통해 이러한 예시를 확인하십시오.
var lobby = await Lobbies.Instance.GetLobbyAsync("lobbyId");var version = lobby.Version;// check if a newer version of the lobby is available:var newLobby = await Lobbies.Instance.GetLobbyAsync("lobbyId", version);if (newLobby != null){ // New lobby version received version = lobby.Version; // observe changed values in newLobby:}

문제 해결

특히
OnLobbyEventConnectionStateChanged
OnKickedFromLobby
는 로비 이벤트가 중지되었음을 나타낼 수 있으므로 모든 제공된 이벤트가 처리되어야 합니다.

OnLobbyEventConnectionStateChanged

로비 이벤트의 연결 상태를 통해 이벤트 수신 여부를 알 수 있습니다. 다음은 연결 상태입니다.

구독 취소됨

  • ILobbyEvents.UnsubscribeAsync
    를 사용하여 구독 취소를 선택했습니다.
  • 더 이상 로비 이벤트를 받을 수 없습니다.

구독 연결 중

  • 로비 이벤트 연결을 시도 중입니다.
  • 로비 이벤트를 받을 수 없습니다.

구독됨

  • 로비 이벤트가 연결되었습니다.
  • 로비 이벤트를 받을 수 있습니다.

동기화 해제됨

  • 연결에 일시적인 문제가 발생했습니다.
  • 로비 이벤트에서 자동으로 재연결을 시도합니다.
  • 로비 이벤트를 받을 수 없습니다.

오류

  • 연결에서 복구할 수 없는 문제가 발생했습니다.
  • 인터넷 중단처럼 중대한 문제일 수 있습니다. 수동 개입으로 해결할 수 있으며 다시 구독해야 할 수도 있습니다.
  • 로비 이벤트를 받을 수 없습니다.

API

인터페이스

ILobbyServiceSDK

메서드/프로퍼티 이름

반환 유형

설명

SubscribeToLobbyEventsAsync작업<ILobbyEvents>로비 이벤트를 구독하고 해당 구독을 제어하는 오브젝트를 반환합니다.

ILobbyEvents

메서드/프로퍼티 이름

반환 유형

설명

CallbacksLobbyEventCallbacks
SubscribeToLobbyAsync
를 호출할 때 제공된 콜백 오브젝트를 가져옵니다.
SubscribeAsync작업이벤트를 구독합니다.
SubscribetoLobbyAsync
를 처음 호출할 때 자동으로 수행되지만, 구독 취소 시 나중에 다시 구독할 수 있습니다.
UnsubscribeAsync작업로비 이벤트에서 구독을 취소하면 변경 사항을 받을 수 없습니다.

ILobbyChanges

메서드/프로퍼티 이름

반환 유형

설명

LobbyDeletedbool부울 값으로 로비의 삭제 여부를 알 수 있습니다. 로비가 삭제되면 ture이고 여전히 사용 가능하면 false입니다.
NameChangedLobbyValue<string>로비 이름이 변경되면 해당 로비 이름으로 변경됩니다.
IsPrivateChangedLobbyValue<bool>비공개 로비가 변경되는 경우의 변경 사항입니다.
IsLockedChangedLobbyValue<bool>잠긴 로비가 변경되는 경우의 변경 사항입니다.
AvailableSlotsChangedLobbyValue<int>로비의 사용 가능한 슬롯이 변경되는 경우에 대한 변경 사항입니다.
MaxPlayersChangedLobbyValue<int>로비의 최대 플레이어 수가 변경되는 경우에 대한 변경 사항입니다.
DataChangedOrRemovedLobbyValue<Dictionary<string, ChangedOrRemovedLobbyValue<DataObject>>>로비의 데이터가 변경되는 경우에 대한 변경 사항입니다.
PlayerLeftChangedLobbyValue<List<int>>퇴장한 플레이어 목록입니다(해당되는 경우).
PlayerJoinedChangedLobbyValue<List<LobbyPlayerJoined>>참여한 플레이어 목록입니다(해당되는 경우).
PlayerDataChangedLobbyValue<Dictionary<int, LobbyPlayerUpdated>>플레이어의 데이터가 변경되는 경우에 대한 변경 사항입니다.
HostIdChangedLobbyValue<string>로비 호스트 ID가 변경되는 경우에 대한 변경 사항입니다.
Versionint로비의 최신 버전입니다.
LastUpdatedChangedLobbyValue<DateTime>로비에 변경 사항이 발생한 시간입니다.
ApplyToLobbyvoid로비와 변경 애플리케이터를 사용해 지정된 로비를 업데이트합니다.

클래스, 구조체, 열거형

LobbyEventCallbacks

이벤트 이름

인수 유형

설명

LobbyChangedILobbyChanges서버에서 로비가 변경되면 Lobby 서비스는 발생한 여러 변경 사항과 함께 이 이벤트를 발생시킵니다.
KickedFromLobby서버에서 로비의 구독이 끝난 경우입니다.
LobbyEventConnectionStateChangedLobbyEventConnectionState구독 연결 상태가 변경된 경우입니다.

ChangedLobbyValue<T>

프로퍼티 이름

반환 유형

설명

ValueT변경 사항에 따라 제공된 새 값입니다.
Changedbool변경 사항이 있으면 ture, 없으면 false입니다.

LobbyValueChangeType<T>

열거형 값 이름

열거형 값

설명

Unchanged0값이 변경되지 않았습니다.
Changed1값이 변경되었습니다.
Removed2값이 삭제되었습니다.

ChangedOrRemovedLobbyValue<T>

프로퍼티 이름

반환 유형

설명

ValueT변경 사항에 따라 제공된 새 값입니다.
Changedbool변경 사항이 있으면 ture, 없으면 false입니다.
ChangeTypeLobbyValueChangeType변경 또는 삭제 여부입니다.

오류 코드

다음과 같은 오류 코드가 추가되었습니다.

LobbyExceptionReason 열거형 값

오류 코드

설명

AlreadySubscribedToLobby16601이미 이 로비를 구독하고 있는 상태에서 다시 구독을 시도했습니다.
SubscriptionToLobbyLostWhileBusy16602구독 또는 구독 취소 등 연결 관련 작업을 시도하는 중에 연결이 끊기거나 중단되었습니다.
LobbyEventServiceConnectionError16603Lobby 서비스에 연결하는 중에 문제가 생겼습니다. 유효한 Lobby ID가 전송되었는지 확인하십시오.