AddTo:添加到Unity的GameObject或MonoBehaviour。
为什么要添加到GameObject或MonoBeaviour上呢?
是因为:GameObject和MonoBehaviour可以获取到OnDestroy事件。也就是GameObject或MonoBehaviour的销毁事件。
那么用这个销毁事件干嘛呢?
答案是:用来进行与UniRx销毁事件的绑定,也就是当 GameObject或MonoBehaviour被销毁时,去销毁与之绑定的UniRx 任务。
这就是 AddTo的作用。
其实用起来很简单,代码如下:
Observable.Timer(TimeSpan.FromSeconds(5.0f).Subscribe( _ => { 执行任务 }).AddTo(this); // 或 AddTo(gameObject);
只要在事件流的最后添加AddTo(this),当this所在的GameObject销毁时,这个Timer就会被销毁。
为什么会这样?
本质上,AddTo是一个静态扩展关键字,它对IDisposable进行了扩展。
只要任何实现了IDisposable的接口,都可以使用AddTo,不管是不是UniRx的API。
当GameObject销毁时,就会调用IDisposable的OnDispose方法。
AddTo能做什么?
有了AddTo,在开启Observable.EveryUpdate时调用当前脚本的方法,就不会造成引用异常等错误,它使得UniRx的使用更加安全。
当然,也可以使用触发器的方式书写,语法更简单。
// 使用触发器的形式进行监听,不用再写AddTo(this);
this.FixedUpdateAsObservable().Subscribe(_ => { 执行任务 });
this.UpdateAsObservable().Subscribe(_ => { 执行任务 });
this.LateUpdateAsObservable().Subscribe(_ => { 执行任务 });
this.OnDestroyAsObservable().Subscribe(_ => { 执行任务 });
// 碰撞检测
this.OnCollisionEnterAsObservable(collision => { 执行任务 });
this.OnCollisionStayAsObservable(collision => { 执行任务 });
this.OnCollisionExitAsObservable(collision => { 执行任务 });
// 同样2D的也支持
this.OnCollision2DEnterAsObservable(collision2D => { 执行任务 });
this.OnCollision2DStayAsObservable(collision2D => { 执行任务 });
this.OnCollision2DExitAsObservable(collision2D => { 执行任务 });
// 监听脚本可用和禁用
this.OnEnableAsObservable().Subscribe(_ => { 执行任务 });
this.OnDisableAsObservable().Subscribe(_ => { 执行任务 });