UniRx精讲(二):定时功能实现&独立的 Update

2.定时功能实现

在 Unity 开发中,延时是我们经常要实现的功能,这个功能对于有点经验的开发者来说不难。
最常见的实现方式如下:
    
using UnityEngine ; public class CommonDelayExample : MonoBehaviour { private float mStartTime ; void Start ( ) { mStartTime = Time . time ; } void Update ( ) { if ( Time . time - mStartTime > 5 ) { DoSomething ( ) ; // 避免再次执行 mStartTime = float . MaxValue ; } } void DoSomething ( ) { Debug . Log ( "DoSomething" ) ; } }
这是很多初学者刚入门时候的实现方式,而初学者们随着深入学习后来接触到了 Coroutine(协程),使用 Coroutine 实现定时功能会更容易,而且也是更好的选择,实现如下:
    
using System ; using System . Collections ; using UnityEngine ; public class CoroutineDelayExample : MonoBehaviour { void Start ( ) { StartCoroutine ( Timer ( 5 , DoSomething ) ) ; } IEnumerator Timer ( float seconds , Action callback ) { yield return new WaitForSeconds ( seconds ) ; callback ( ) ; } void DoSomething ( ) { Debug . Log ( "DoSomething" ) ; } }
协程已经把代码精简了很多,不过接下来有更厉害的,使用 UniRx。
代码如下:
    
Observable . Timer ( TimeSpan . FromSeconds ( 5 ) ) . Subscribe ( _ => { /* do something */ } ) ;
当然以上代码是没有和 MonoBehaviour 进行生命周期绑定的,也就是说当 MonoBehaviour 销毁了之后,这个定时逻辑可能还在执行,这样就会有造成空指针异常的风险。
要解决也很简单,代码如下:
    
Observable . Timer ( TimeSpan . FromSeconds ( 5 ) ) . Subscribe ( _ => { /* do something */ } ) . AddTo ( this ) ;
只要加上一个 AddTo(this) 就可以了。 这样,当 this(MonoBehaviour) Destroy 的时候,这个延时逻辑也会销毁掉,从而避免造成空指针异常。
三行代码,写下来大约 20 秒的时间,就搞定了一个实现起来比较麻烦的逻辑。
今天的内容就这些。

知识地图

3.独立的 Update

在 UniRx 简介的时候,笔者讲了一种比较麻烦的情况:就是在 MonoBehaviour 的 Update 中掺杂了大量互相无关的逻辑,导致代码非常不容易阅读。
这种情况我们平时在项目开发中非常常见,代码如下:
    
private void Update ( ) { if ( A ) { .. . } if ( B ) { .. . if ( D ) { .. . } else { } } switch ( C ) { .. . } if ( Input . GetMouseButtonUp ( 0 ) ) { .. . } }
Update 方法中代码冗长,而且干扰视线,非常影响阅读。
而使用 UniRx 则可以改善这个问题。
    
void Start ( ) { // A 逻辑,实现了 xx Observable . EveryUpdate ( ) . Subscribe ( _ => { if ( A ) { .. . } } ) . AddTo ( this ) ; // B 逻辑,实现了 xx Observable . EveryUpdate ( ) . Subscribe ( _ => { if ( B ) { .. . if ( D ) { .. . } else { } } } ) . AddTo ( this ) ; // C 逻辑,实现了 xx Observable . EveryUpdate ( ) . Subscribe ( _ => { switch ( C ) { .. . } } ) . AddTo ( this ) ; // 鼠标点击检测逻辑 Observable . EveryUpdate ( ) . Subscribe ( _ => { { if ( Input . GetMouseButtonUp ( 0 ) ) { .. . } } ) . AddTo ( this ) ; }
虽然在代码长度上没有任何改善,但是最起码,这些 Update 逻辑互相之间独立了。 状态跳转、延时等等这些经常在 Update 里实现的逻辑,都可以使用以上这种方式独立。
使用 UniRx 可以对我们工程中的代码进行了改善,而笔者接触 UniRx 之后,就再也没有使用过 Update 方法了。
不过以上的这种 UniRx 使用方式,是比较初级的,而这种使用方式,随着对 UniRx 的深入学习,也会渐渐淘汰,因为等我们入门之后,会学习更好的实现方式。
今天的内容就这些。

知识地图

转载请注明地址:凉鞋的笔记: liangxiegame.com

更多内容

  • 关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。
基于TROPOMI高光谱遥感仪器获取的大气成分观测资料,本研究聚焦于大气污染物一氧化氮(NO₂)的空间分布与浓度定量反演问题。NO₂作为影响空气质量的关键指标,其精确监测对环境保护与大气科学研究具有显著价值。当前,利用卫星遥感数据结合先进算法实现NO₂浓度的高精度反演已成为该领域的重要研究方向。 本研究构建了一套以深度学习为核心的技术框架,整合了来自TROPOMI仪器的光谱辐射信息、观测几何参数以及辅助气象数据,形成多维度特征数据集。该数据集充分融合了不同来源的观测信息,为深入解析大气中NO₂的时空变化规律提供了数据基础,有助于提升反演模型的准确性与环境预测的可靠性。 在模型架构方面,项目设计了一种多分支神经网络,用于分别处理光谱特征与气象特征等多模态数据。各分支通过独立学习提取代表性特征,并在深层网络中进行特征融合,从而综合利用不同数据的互补信息,显著提高了NO₂浓度反演的整体精度。这种多源信息融合策略有效增强了模型对复杂大气环境的表征能力。 研究过程涵盖了系统的数据处理流程。前期预处理包括辐射定标、噪声抑制及数据标准化等步骤,以保障输入特征的质量与一致性;后期处理则涉及模型输出的物理量转换与结果验证,确保反演结果符合实际大气浓度范围,提升数据的实用价值。 此外,本研究进一步对不同功能区域(如城市建成区、工业带、郊区及自然背景区)的NO₂浓度分布进行了对比分析,揭示了人类活动与污染物空间格局的关联性。相关结论可为区域环境规划、污染管控政策的制定提供科学依据,助力大气环境治理与公共健康保护。 综上所述,本研究通过融合TROPOMI高光谱数据与多模态特征深度学习技术,发展了一套高效、准确的大气NO₂浓度遥感反演方法,不仅提升了卫星大气监测的技术水平,也为环境管理与决策支持提供了重要的技术工具。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值