This document is about: FUSION 2
SWITCH TO

재접속(Reconnection)

Fusion XR 프로토타이핑 애드온

이 모듈은 사용자가 세션을 끊었다가 다시 접속할 때를 처리할 수 있도록 합니다.
같은 사용자인지를 식별하고, 이전에 소유했던 오브젝트에 대한 권한을 쉽게 복구할 수 있도록 지원합니다.

로직 개요

사용자 ID

사용자는 Runner.GetPlayerUserId로 반환되는 사용자 ID로 식별됩니다.
Fusion 인증이 설정되어 있으면 이 값은 고정되며, 인증이 없으면 접속할 때마다 변경됩니다.
이 경우를 대비해 생성된 사용자 ID를 유니티의 PlayerPrefs에 저장합니다.

각 플레이어를 위해 스폰 되는 프리팹에는 ReconnectionHandler 컴포넌트가 포함되어 있습니다.
이 컴포넌트는 사용자 식별 정보를 UserId 네트워크 변수에 저장하고, 이를 다른 플레이어와 공유합니다.

중앙의 ReconnectionManager는 모든 ReconnectionHandler를 추적하여 사용자 ID와 핸들러에 대한 참조를 저장합니다.

Recoverable

네트워크 오브젝트는 Recoverable 네트워크 비헤이비어를 가질 수 있습니다.
처음에 ReconnectionHandler에서 사용자 ID가 정의되었다면, 동일한 사용자가 재접속할 때 그 오브젝트의 상태 권한을 복구할 수 있습니다.

또한 복구된 Recoverable마다 onRecovery 이벤트가 ReconnectionHandler에서 호출됩니다.
Recoverable은 등록된 IRecoverableListener에도 알림을 보낼 수 있습니다.

ReconnectionManager / ReconnectionHandler 등록

ReconnectionHandlerReconnectionManager 간 통신은 Registry/Subscriber 애드온을 기반으로 합니다.

  • ReconnectionManagerRegistry<ReconnectionHandler>입니다.
  • ReconnectionHandlerSubscriber입니다.

ReconnectionHandlerUserId가 설정된 후에만 사용 가능합니다.
UserIdReconnectionManager가 활성화된 후 설정되는데, 먼저 세션 사용자 목록(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 컴포넌트를 추가해야 합니다.
  • 상태 권한 변경을 허용하고, 권한이 끊겨도 파괴되지 않아야 합니다.
  • 오브젝트를 스폰 할 때, RecoverableUserId를 해당 플레이어의 ReconnectionHandlerUserId로 설정해야 합니다.

의존성

  • XRShared 애드온
  • Registry/Subscriber 애드온

다운로드

이 애드온의 최신 버전은 Industries 애드온 프로젝트에서 확인할 수 있습니다.

지원 토폴로지

  • 공유 모드(Shared Mode)

변경 기록

  • 버전 2.0.0: 첫 릴리스
Back to top