用 UniRx 實現 Timeline 式的異步操作
阿新 • • 發佈:2018-07-22
lin code property set pos llb 等待 all 適合 沒接觸 UniRx 之前,我在 Unity 中通常用 Coroutine 或 Callback 來實現異步操作。根據我的任務,一般都是去實現遊戲組件的演出,比如:敵方角色圖形顯示後,我方角色 UI 出現,再跳出信息窗口什麽的。
舉個抽象例子:一開始執行 A ——第 3 秒執行 B ——第 5 秒執行 C
用 Coroutine 方式:
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()); }
這種思路和做動畫類似,就是時間點到了各自去執行自己的演出任務。
當然你 DoB() 也可以等待 DoA() 給個信號再執行,只要把 DoA() 變成一個 Observable 對象就可以了。但那也就不是 Timeline 了,更適合其他場景。
用 UniRx 實現 Timeline 式的異步操作