재접속(Reconnection)
이 모듈은 사용자가 세션을 끊었다가 다시 접속할 때를 처리할 수 있도록 합니다.
같은 사용자인지를 식별하고, 이전에 소유했던 오브젝트에 대한 권한을 쉽게 복구할 수 있도록 지원합니다.
로직 개요
사용자 ID
사용자는 Runner.GetPlayerUserId로 반환되는 사용자 ID로 식별됩니다.
Fusion 인증이 설정되어 있으면 이 값은 고정되며, 인증이 없으면 접속할 때마다 변경됩니다.
이 경우를 대비해 생성된 사용자 ID를 유니티의 PlayerPrefs에 저장합니다.
각 플레이어를 위해 스폰 되는 프리팹에는 ReconnectionHandler 컴포넌트가 포함되어 있습니다.
이 컴포넌트는 사용자 식별 정보를 UserId 네트워크 변수에 저장하고, 이를 다른 플레이어와 공유합니다.
중앙의 ReconnectionManager는 모든 ReconnectionHandler를 추적하여 사용자 ID와 핸들러에 대한 참조를 저장합니다.
Recoverable
네트워크 오브젝트는 Recoverable 네트워크 비헤이비어를 가질 수 있습니다.
처음에 ReconnectionHandler에서 사용자 ID가 정의되었다면, 동일한 사용자가 재접속할 때 그 오브젝트의 상태 권한을 복구할 수 있습니다.
또한 복구된 Recoverable마다 onRecovery 이벤트가 ReconnectionHandler에서 호출됩니다.
Recoverable은 등록된 IRecoverableListener에도 알림을 보낼 수 있습니다.
ReconnectionManager / ReconnectionHandler 등록
ReconnectionHandler와 ReconnectionManager 간 통신은 Registry/Subscriber 애드온을 기반으로 합니다.
ReconnectionManager는Registry<ReconnectionHandler>입니다.ReconnectionHandler는Subscriber입니다.
ReconnectionHandler는 UserId가 설정된 후에만 사용 가능합니다.
이 UserId는 ReconnectionManager가 활성화된 후 설정되는데, 먼저 세션 사용자 목록(SessionUsers)에 자신이 재접속 중인지 확인한 후 등록하기 위함입니다.
재접속 처리
예상치 못한 연결 끊김이나 정상적인 종료가 이루어지지 않는 경우, 사용자가 동일한 ID로 재접속하면서 충돌이 발생할 수 있습니다.
이를 처리하기 위해 다음과 같은 동작 모드를 설정할 수 있습니다:
C#
public enum UserIdCollisionHandling {
// Consider the collision user id comes from a reconnecting user that is still in the room because its disonnection was not detected (under timeout and no clean quit)
AlwaysConsiderReconnectionUnderTimeout,
// Consider user id collision is just a collision, calling OnUserIdCollision (this handler won't take its Recoverable back)
AlwaysConsiderCollision,
// Check if LastReceivedTick evolves after collisionCheckLastReceivedTickEvolutionWindow seconds, to choose between reconnection (value does not evolve - probably handled by our previous disconnecting user) and collision (value is evolving). Mostly relevant in XR, where we are sure that the user always send data
CheckIfLastReceivedTickEvolves,
}
(XR처럼 사용자가 항상 데이터를 보내는 환경에서는 마지막 옵션이 특히 유용합니다.)
설정 방법
씬(Scene)
ReconnectionManager와 연결된 네트워크 오브젝트는 씬 시작 시 존재해야 합니다.- 이 오브젝트는 상태 권한 변경을 허용하고, 상태 권한 상실 시에도 파괴되지 않아야 합니다.
- 이를 통해 항상 하나의 상태 권한 보유자가 유지됩니다.
SessionUsers 네트워크 배열에 세션 사용자 기록을 저장합니다.
- 기본 사용자 기록(
MAX_USER_HISTORY)은 50명이며, 최대 100명까지 설정할 수 있습니다. - 기록이 초과되면 오래된 기록이 제거될 수 있습니다.
참고: 더 많은 기록을 원하면 별도 문의가 필요합니다.
플레이어 오브젝트
- 플레이어용 네트워크 오브젝트는 반드시
ReconnectionHandler를 포함해야 합니다.
Recoverable
- 복구 가능한 오브젝트는
Recoverable컴포넌트를 추가해야 합니다. - 상태 권한 변경을 허용하고, 권한이 끊겨도 파괴되지 않아야 합니다.
- 오브젝트를 스폰 할 때,
Recoverable의UserId를 해당 플레이어의ReconnectionHandler의UserId로 설정해야 합니다.
의존성
- XRShared 애드온
- Registry/Subscriber 애드온
다운로드
이 애드온의 최신 버전은 Industries 애드온 프로젝트에서 확인할 수 있습니다.
지원 토폴로지
- 공유 모드(Shared Mode)
변경 기록
- 버전 2.0.0: 첫 릴리스