using System; // require keep for Windows Universal App using UnityEngine; namespace UniRx.Triggers { [DisallowMultipleComponent] public class ObservableDestroyTrigger : MonoBehaviour { bool calledDestroy = false; Subject onDestroy; CompositeDisposable disposablesOnDestroy; [Obsolete("Internal Use.")] internal bool IsMonitoredActivate { get; set; } public bool IsActivated { get; private set; } /// /// Check called OnDestroy. /// This property does not guarantees GameObject was destroyed, /// when gameObject is deactive, does not raise OnDestroy. /// public bool IsCalledOnDestroy { get { return calledDestroy; } } void Awake() { IsActivated = true; } /// This function is called when the MonoBehaviour will be destroyed. void OnDestroy() { if (!calledDestroy) { calledDestroy = true; if (disposablesOnDestroy != null) disposablesOnDestroy.Dispose(); if (onDestroy != null) { onDestroy.OnNext(Unit.Default); onDestroy.OnCompleted(); } } } /// This function is called when the MonoBehaviour will be destroyed. public IObservable OnDestroyAsObservable() { if (this == null) return Observable.Return(Unit.Default); if (calledDestroy) return Observable.Return(Unit.Default); return onDestroy ?? (onDestroy = new Subject()); } /// Invoke OnDestroy, this method is used on internal. public void ForceRaiseOnDestroy() { OnDestroy(); } public void AddDisposableOnDestroy(IDisposable disposable) { if (calledDestroy) { disposable.Dispose(); return; } if (disposablesOnDestroy == null) disposablesOnDestroy = new CompositeDisposable(); disposablesOnDestroy.Add(disposable); } } }