zoukankan      html  css  js  c++  java
  • 用 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 了,更适合其他场景。
  • 相关阅读:
    串口通信(2)
    串口通信(1)
    extern关键字的使用
    volatile关键字的使用
    Uart串口与RS232串口的区别
    DSP5509的时钟发生器(翻译总结自TI官方文档)
    DSP中的cmd文件
    pragma伪指令
    在C语言中嵌入汇编语言
    another app is currently holding the yum lock;waiting for it to exit...
  • 原文地址:https://www.cnblogs.com/seesawgame/p/9349056.html
Copyright © 2011-2022 走看看