IEnumerator Play() { DoA(); yield return WaitForSeconds(3); DoB(); yield return WaitForSeconds(2); DoC(); } StartCoroutine(Play());
用 DOTween CallBack 方式:
DoA().OnComplete(() => { DoB().SetDelay(3).OnComplete(() => { DoC().SetDelay(2); }); });
这些做法并无不妥,但我在学习 UniRX 之后发现了更加逻辑清晰的方式,那就是实现一个 Timeline 时间轴:
void PlayTimeline() { // 设置计时器 var timer = new IntReactiveProperty(0); // 以 60 frames 为 1 秒计时 timer.SampleFrame(60).BatchFrame().Subscribe(_ => timer.Value += 1); // 根据时间表安排执行任务 timer.Where(t => t == 1).Subscribe(_ => DoA()); timer.Where(t => t == 3).Subscribe(_ => DoB()); timer.Where(t => t == 5).Subscribe(_ => DoC()); // 执行完取消订阅 timer.Where(t => t == 6).Subscribe(_ => timer.Dispose()); }
这种思路和做动画类似,就是时间点到了各自去执行自己的演出任务。
原文:https://www.cnblogs.com/seesawgame/p/9349056.html