用 UniRx 實現 Timeline 式的異步操做

   沒接觸 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);


    // 將 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());
}

這種思路和作動畫相似,就是時間點到了各自去執行本身的演出任務。動畫

  固然你 DoB() 也能夠等待 DoA() 給個信號再執行,只要把 DoA() 變成一個 Observable 對象就能夠了。但那也就不是 Timeline 了,更適合其餘場景。
相關文章
相關標籤/搜索