UniRx精讲(一):UniRx简介&定时功能实现 (2)

最常见的实现方式如下:

using UnityEngine; public class CommonDelayExample : MonoBehaviour { private float mStartTime; void Start() { mStartTime = Time.time; } void Update() { if (Time.time - mStartTime > 5) { DoSomething(); // 避免再次执行 mStartTime = float.MaxValue; } } void DoSomething() { Debug.Log("DoSomething"); } }

这是很多初学者刚入门时候的实现方式,而初学者们随着深入学习后来接触到了 Coroutine(协程),使用 Coroutine 实现定时功能会更容易,而且也是更好的选择,实现如下:

using System; using System.Collections; using UnityEngine; public class CoroutineDelayExample : MonoBehaviour { void Start() { StartCoroutine(Timer(5, DoSomething)); } IEnumerator Timer(float seconds, Action callback) { yield return new WaitForSeconds(seconds); callback(); } void DoSomething() { Debug.Log("DoSomething"); } }

协程已经把代码精简了很多,不过接下来有更厉害的,使用 UniRx。

代码如下:

Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(_ => { /* do something */ });

当然以上代码是没有和 MonoBehaviour 进行生命周期绑定的,也就是说当 MonoBehaviour 销毁了之后,这个定时逻辑可能还在执行,这样就会有造成空指针异常的风险。

要解决也很简单,代码如下:

Observable.Timer(TimeSpan.FromSeconds(5)) .Subscribe(_ => { /* do something */ }) .AddTo(this);

只要加上一个 AddTo(this) 就可以了。
这样,当 this(MonoBehaviour) Destroy 的时候,这个延时逻辑也会销毁掉,从而避免造成空指针异常。

三行代码,写下来大约 20 秒的时间,就搞定了一个实现起来比较麻烦的逻辑。

今天的内容就这些。

知识地图

image.png

转载请注明地址:liangxiegame.com

更多内容

QFramework 地址:https://github.com/liangxiegame/QFramework

QQ 交流群:623597263

Unity 进阶小班

UniRx精讲(一):UniRx简介&定时功能实现

权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro

关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。

UniRx精讲(一):UniRx简介&定时功能实现

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspfxs.html