1. 程式人生 > >用 UniRx 實現 Timeline 式的異步操作

用 UniRx 實現 Timeline 式的異步操作

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 式的異步操作