using System; // require keep for Windows Universal App using UnityEngine; namespace UniRx.Triggers { [DisallowMultipleComponent] public class ObservableCollisionTrigger : ObservableTriggerBase { Subject onCollisionEnter; /// OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider. void OnCollisionEnter(Collision collision) { if (onCollisionEnter != null) onCollisionEnter.OnNext(collision); } /// OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider. public IObservable OnCollisionEnterAsObservable() { return onCollisionEnter ?? (onCollisionEnter = new Subject()); } Subject onCollisionExit; /// OnCollisionExit is called when this collider/rigidbody has stopped touching another rigidbody/collider. void OnCollisionExit(Collision collisionInfo) { if (onCollisionExit != null) onCollisionExit.OnNext(collisionInfo); } /// OnCollisionExit is called when this collider/rigidbody has stopped touching another rigidbody/collider. public IObservable OnCollisionExitAsObservable() { return onCollisionExit ?? (onCollisionExit = new Subject()); } Subject onCollisionStay; /// OnCollisionStay is called once per frame for every collider/rigidbody that is touching rigidbody/collider. void OnCollisionStay(Collision collisionInfo) { if (onCollisionStay != null) onCollisionStay.OnNext(collisionInfo); } /// OnCollisionStay is called once per frame for every collider/rigidbody that is touching rigidbody/collider. public IObservable OnCollisionStayAsObservable() { return onCollisionStay ?? (onCollisionStay = new Subject()); } protected override void RaiseOnCompletedOnDestroy() { if (onCollisionEnter != null) { onCollisionEnter.OnCompleted(); } if (onCollisionExit != null) { onCollisionExit.OnCompleted(); } if (onCollisionStay != null) { onCollisionStay.OnCompleted(); } } } }