Subscribe to real-time lobby events to receive updates when lobby or player state changes occur.
읽는 시간 2분최근 업데이트: 한 달 전
참고
중요: 로비 이벤트는 1.0.0 및 이후 버전에서만 사용 가능합니다.
Lobby 패키지에는 실시간 로비 이벤트를 구독할 수 있는 로비 이벤트 시스템이 포함되어 있습니다. 이벤트는 멤버가 관찰할 수 있는 플레이어 및 로비 상태가 변경될 때마다 전송됩니다. 예를 들어 플레이어가 참여하거나 나갈 때 플레이어는 공개/멤버 데이터를 업데이트하거나, 호스트는 공개/멤버 로비 데이터를 업데이트합니다. 플레이어나 호스트가 로비의 비공개 프로퍼티를 업데이트하면 이벤트는 전송되지 않습니다.특히 일부 데이터가 변경될 때까지 작업이 필요하지 않으므로 이벤트를 사용하는 것이 GET을 통해 로비 상태를 폴링하는 것보다 더 효율적일 수 있습니다. 초당 GET의 개수가 초당 수신되는 이벤트 개수보다 현저하게 많으면 이벤트가 더 효율적입니다. 게다가 이벤트 페이로드에는 패치만 포함되므로 일반적으로 GET에서 반환되는 페이로드보다 훨씬 작다는 이점도 있습니다. 이벤트의 가장 큰 단점은 신뢰성이 떨어지고 순서에 따른 전송이 보장되지 않는다는 점입니다. 자세히 알아보려면 Lobby 버전을 참고하십시오.참고: 이벤트는 신뢰성이 떨어지고 순서에 따른 전송이 보장되지 않습니다.Lobby 인스턴스에서
SubscribeToLobbyEventsAsync
메서드를 호출하여 해당 인스턴스의 업데이트를 수신하도록 구독합니다. 구독이 완료되면 Lobby 서비스는 변경 사항이 발생할 때마다
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
,
OnKickedFromLobby
,
OnLobbyEventConnectionStateChanged
코드가 이벤트를 처리합니다.
다음 코드 샘플은
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
메서드/프로퍼티 이름
반환 유형
설명
Callbacks
LobbyEventCallbacks
SubscribeToLobbyAsync
를 호출할 때 제공된 콜백 오브젝트를 가져옵니다.
SubscribeAsync
작업
이벤트를 구독합니다.
SubscribetoLobbyAsync
를 처음 호출할 때 자동으로 수행되지만, 구독 취소 시 나중에 다시 구독할 수 있습니다.
UnsubscribeAsync
작업
로비 이벤트에서 구독을 취소하면 변경 사항을 받을 수 없습니다.
ILobbyChanges
메서드/프로퍼티 이름
반환 유형
설명
LobbyDeleted
bool
부울 값으로 로비의 삭제 여부를 알 수 있습니다. 로비가 삭제되면 ture이고 여전히 사용 가능하면 false입니다.