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