UniRx操作符_自Rx.Net

本文介绍了UniRx库在游戏开发中的应用,详细讲解了如何利用时间操作符如Timer、Delay,分页操作符如TakeUntil、SkipUntil,以及并发控制操作符如Amb。这些工具能帮助开发者更好地管理和控制游戏事件,实现精确的时间调度、动态分页以及高效的并发处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Time:时间

Timer

它在⼀个给定的延迟后发射⼀个值/执行任务

        Observable.Timer(TimeSpan.FromSeconds(1.0), TimeSpan.FromSeconds(0.1f))
                .Subscribe(_ => Debug.Log("after 1 seconds"));

Interval

        Observable.Interval(TimeSpan.FromSeconds(0.5f))
                .Subscribe(times => Debug.Log(times));

Throttle

节流阀 仅在过了⼀段指定的时间还没发射数据时才发射⼀个数据

        Observable.EveryUpdate()
                .Where(_ => Input.GetMouseButtonDown(0))
                .Throttle(TimeSpan.FromSeconds(1.0f))
                .Subscribe(_ => Debug.Log("after 1 seconds"));

Delay

延迟⼀段指定的时间再发射来⾃ Observable 的发射物

        Observable.Timer(TimeSpan.FromSeconds(1.0f))
                      .Select(_ =>
                      {
   
                          Debug.Log("1 seconds");
                          return _;
                      })
                      .Delay(TimeSpan.FromSeconds(1.0f))
                      .Select(_ =>
                      {
   
                          Debug.Log("2 seconds");
                          return _;
                      })
                      .Delay(TimeSpan.FromSeconds(1.0f))
                      .Subscribe(_ => Debug.Log("3 seconds"));


            Observable.ReturnUnit()
                .Delay(TimeSpan.FromSeconds(5.0f))
                .Subscribe(_ => Debug.Log("has return"));

Sample

定期发射 Observable 最近发射的数据项

定时查看⼀个Observable,然后发射⾃上次采样以来它最近发射的数据

        Observable.EveryUpdate()
                .Where(_ => Input.GetMouseButtonDown(0))
                .Select(_ => clickCount++)
                .Sample(TimeSpan.FromSeconds(3))
                .Subscribe(_ => Debug.LogFormat("第 {0} 次点击", clickCount));

Timestamp

给发射的数据项附加⼀个时间戳

        Observable.EveryUpdate()
                .Where(_ => Input.GetMouseButtonDown(0))
                .Timestamp()
                .Subscribe(timestamp => {
    Debug.LogFormat("timestamp:{0}", timestamp.Timestamp.LocalDateTime); });

ThrottleFirst

它总是发射原始的第⼀项数据,⽽不是最近的⼀项
它默认在 computation 调度器上执⾏,但是可以使⽤第三个参数指定其它的调度器

        Observable.EveryUpdate()
                .Where(_ => Input.GetMouseButtonDown(0))
                .ThrottleFirst(TimeSpan.FromSeconds(2.0))
                .Subscribe(_ => Debug.Log("clicked!"));

⿏标点击之后,⽴即输出 “clicked”,输出之后的 2 秒内点击⽆效


TimeInterval

将⼀个发射数据的 Observable 转换为发射那些数据发射时间间隔的 Observable

        Observable.EveryUpdate()
                .Where(_ => Input.GetMouseButtonDown(0)).Select(_ => "clicked")
                .TimeInterval()
                .Subscribe(timeInterval => Debug.LogFormat("{0},{1}", timeInterval.Interval, timeInterval.Value));

表示了每次点击之间的 时间间隔


Timeout

对原始 Observable 的⼀个镜像,如果过了⼀个指定的时⻓仍没有发射数据,它会发⼀个错误通知,以⼀个 onError 通知
终⽌这个 Observable

       Observable.EveryUpdate()
                      .Where(_ => Input.GetMouseButtonDown(0))
                      .Timeout(TimeSpan.FromSeconds(3.0f))
                      .Subscribe(_ =>
                      {
   
                          Debug.Log("mouse clicked");
                      });


            ObservableWWW.Get("http://baidu.com")
                         .Timeout(TimeSpan.FromSeconds(0.1f))
                         .Subscribe(_ => {
    }, e =>
                         {
   
                             Debug.LogErrorFormat("发生了异常:{0}", e.Message);
                         });

Paging:分页

TakeUntil

TakeUntil 订阅并开始发射原始 Observable,它还监视你提供的第⼆个 Observable。如果第⼆个 Observable 发射了⼀项数据或者发射了⼀个终⽌通知, TakeUntil 返回的Observable会停⽌发射原始 Observable 并终⽌

        Observable.EveryUpdate()
                .TakeUntil(Observable.EveryUpdate
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值