재접속(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: 첫 릴리스