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); // 将 1 秒所用的 frames 做为间隔参数,进行每秒执行 timer.SampleFrame((int)(1 / Time.fixedDeltaTime)).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()); }
这种思路和作动画相似,就是时间点到了各自去执行本身的演出任务。动画