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()); }
這種思路和作動畫相似,就是時間點到了各自去執行本身的演出任務。動畫