구독자 - 레지스트리(Subscriber - Registry)

이 모듈은 등록/구독(registry/subscriber) 시스템을 구현할 수 있도록 일부 기본 클래스를 제공합니다.
이를 통해 원격 오브젝트의 가용성(스폰 및 사용자 정의 조건 기반)을 추적할 수 있으며, 오브젝트 생성 순서를 투명하게 관리할 수 있습니다.
이 시스템은 다음을 보장합니다:
- 구독자가 하나 이상의 중앙 레지스트리에 등록될 때, 모든 클라이언트에 알림이 전송됩니다.
- 구독자의 등록/해제는
IsAvailable
속성에 따라 결정됩니다. (등록은 사용 가능할 때만 가능하며, 기본적으로 사용 불가가 되면 등록 해제됩니다.) - 이
IsAvailable
속성은 네트워크로 동기화되지 않지만, 보통 네트워크 동기화된 값에 기반하여 설정해야 모든 클라이언트에서 동시에 등록/해제가 일어납니다.

핵심 로직
일반적인 사용 흐름은 다음과 같습니다:
- 씬에는 레지스트리가 네트워크 오브젝트로 존재합니다.
- 플레이어가 접속할 때마다 구독자 오브젝트가 스폰 됩니다.
- 레지스트리와 구독자의 스폰 순서는 항상 동일하지 않습니다.
- Subscriber/Registry 클래스가 이 순서에 상관없이 올바르게 연결될 수 있도록 보장합니다.
구독자가 레지스트리에 등록되기 위해 필요한 조건은:
- 스폰 된 상태여야 하고,
- 필요시 추가 사용자 정의 조건도 충족해야 합니다.
이 애드온의 목표는 다음 순서가 어떻게 일어나든 결과가 동일하도록 만드는 것입니다:
- 레지스트리가 스폰 됨
- 구독자가 스폰 됨
- 레지스트리가 사용 가능 상태가 됨
- 구독자가 사용 가능 상태가 됨
- 구독자가 레지스트리에 등록됨
- 콜백이 트리거 되고, 다른 리스너들에게 알림 전송
기본 클래스
Subscriber<T>
와 Registry<T>
는 제네릭(generic) 클래스입니다.
여러 서브클래스가 하나의 앱 안에 공존할 수 있도록 설계되었습니다.
T
타입은Subscriber<T>
의 서브클래스 자신이어야 합니다.
예:class SampleSubscriber : Subscriber<SampleSubscriber> {}
Subscriber
Subscriber<T>
서브클래스는, 자신과 레지스트리가 모두 IsAvailable
= true가 되면 레지스트리에 등록합니다.
IsAvailable
의 기준은 반드시 네트워크를 통해 동기화되어야 모든 클라이언트에서 동시 트리거가 가능합니다.
등록 알림을 받으려면 OnRegisterOnRegistry(IRegistry<T> registry)
/ OnUnregisterOnRegistry(IRegistry<T> registry)
를 오버라이드 하거나,
또는 RegistryListener<T>
를 구현하여 리스너로 등록할 수 있습니다.
서브클래스 예시:
C#
// When CustomAvailabilityCriteriaMatched will be set to true, the SampleSubscriber registration will trigger
class SampleSubscriber : Subscriber<SampleSubscriber> {
// Custom availability criteria
[Networked]
bool CustomAvailabilityCriteriaMatched { get; set; } = false;
// Availability override. The data to compute it needs to be synched so that the availability triggers everywhere (and hence the registration)
public override bool IsAvailable => base.IsAvailable && CustomAvailabilityCriteriaMatched;
}
Registry
Registry<T>
는 T
(Subscriber
서브클래스)의 등록을 수신합니다.
등록은 구독자와 레지스트리 모두 IsAvailable
= true일 때만 발생합니다.
등록/해제 알림을 받으려면 OnSubscriberRegistration
/OnSubscriberUnregistration
을 오버라이드 하거나,
IRegistryListener<T>
를 구현한 컴포넌트를 통해 리스너로 등록할 수 있습니다.
서브클래스 예시:
C#
class SampleRegistry : Registry<SampleSubscriber> {}
서브클래스 생성하기
Subscriber<T>
서브클래스는 동일한 T
타입의 Registry<T>
에 자동으로 등록됩니다.
만약 등록 대상을 더욱 제한하고 싶다면 RegistryType()
메서드를 오버라이드 해서 특정 레지스트리 타입만 허용할 수 있습니다.
또한, 등록/해제 콜백 외에 OnAvailableRegistryFound(Registry<T> registry)
를 오버라이드 하면,
레지스트리가 사용 가능 상태가 되었을 때 추가 알림을 받을 수 있습니다.
데모
데모 씬은 Assets\Photon\FusionAddons\SubscriberRegistry\Demo\
폴더에 있습니다.
- 이 씬에는 여러 레지스트리와 구독자가 존재합니다.
- 서로 다른 타이밍에 활성화되어도 등록 프로세스가 자연스럽게 동작하는 것을 보여줍니다.
의존성
- XRShared 애드온
다운로드
이 애드온의 최신 버전은 Industries 애드온 프로젝트에 포함되어 있습니다.
지원 토폴로지
- 공유 모드
변경 기록
- 버전 2.0.0: 첫 번째 릴리스