加班加了三个月终于喘了口气,博客很久没有更新了,这段期间框架加了很多 Feature,大部分不太稳定,这些 Feature中实现起来比较简单而且用的比较稳定的就是链式编程支持了。

什么是链式编程?

我想大家应该都接触过DOTween,用起来是这样的。

transform.DOMove(Vector3.one, 0.5f)
.SetEase(Ease.InBack)
.OnKill(() => Debug.Log("on killed"))
.OnComplete(() => Debug.Log("on completed"));

像以上.XXX().YYY().ZZZ()这种写法就叫链式编程了。

QChain是什么?

QFramework 中有零零散散支持了链式写法,打算整理出来作为一个独立的库进行过维护。目前的使用方式如下:

this.Show()
.LocalIdentity() // 归一化
.LocalPosition(Vector3.back)
.LocalPositionX(1.0f)
.Sequence() // 开始序列
.Delay(1.0f)
.Event(() => Log.I("frame event"))
.Until(() => count == 2)
.Event(() => Log.I("count is 2"))
.Begin() // 执行序列
.DisposeWhen(() => count == 3)
.OnDisposed(() => Log.I("On Disposed")); this.Repeat()
.Delay(1.0f)
.Event(() => count++)
.Begin()
.DisposeWhenGameObjDestroyed(); this.Repeat(5)
.Event(() => Log.I(" Hello workd"))
.Begin()
.DisposeWhenFinished(); // 默认是这个 this.Sequence()
.Delay(1.0f)
.Event(() => Log.I("delay one second"))
.Delay(1.0f)
.Event(() => Log.E("delay two second"))
.Begin();

为什么要用 QChain

前段时间在给公司写一个蓝牙的插件,比较麻烦的是蓝牙管理类的状态同步和当状态改变时通知其他对象的问题。但是有了 QChain,蓝牙连接的代码可以这样写:

this.Sequence()
.Event(() => PTBluetooth.Initialize(true, false))
.Until(() => PTBluetooth.IsInitialized)
.Until(() => PTBluetooth.IsOpened)
.Event(() => PTBluetooth.ScanPeripheral((address, name, rssi, adInfo) => name.Contains("device")))
.Until(() => PTBluetooth.ScannedDevices.Count >= 1)
.Event(() => PTBluetooth.ConnectToPeripheral(PTBluetooth.ScannedDevices[0].Address))
.Begin()
.DisposeWhen(()=>
{
if (PTBluetooth.IsInitialized && !PTBluetooth.IsOpened)
{
// TODO: 这里处理初始化失败逻辑
return true;
} // ... 其他失败逻辑处理
return false;
});

这样写的好处是,逻辑不会分散到处都是。相比于协程,生命周期更好进行管理(不用管理协程对象),可作为协程的替代方案。还有其他的好处随着本系列的更新逐个讨论。

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

更多内容

Unity 游戏框架搭建 (十五) 优雅的QChain (零)的更多相关文章

  1. Unity 游戏框架搭建 (十四) 优雅的QSignleton(零) QuickStart

      好久不见 !之前想着让各位直接用QFramework,但是后来想想,如果正在进行的项目直接使用QFramework,这样风险太高了,要改的代码太多,所以打算陆续独立出来一些工具和模块,允许各位一个 ...

  2. Unity 游戏框架搭建 (十) QFramework v0.0.2小结

    从框架搭建系列的第一篇文章开始到现在有四个多月时间了,这段时间对自己来说有很多的收获,好多小伙伴和前辈不管是在评论区还是私下里给出的建议非常有参考性,在此先谢过各位. 说到是一篇小节,先列出框架的概要 ...

  3. Unity 游戏框架搭建 (十六) v0.0.1 架构调整

    背景: 前段时间用Xamarin.OSX开发一些工具,遇到了两个问题. QFramework的大部分的类耦合了Unity的API,这样导致不能在其他CLR平台使用QFramework. QFramew ...

  4. Unity 游戏框架搭建 2019 (五十、五十一) 消息机制小结&MonoBehaviourSimplify 是框架?

    我们花了 5 篇文章学习了消息机制的方方面面.并且完成了一个简易消息机制,之后集成到了我们的 MonoBehaviourSimplify 里. 现在 MonoBehaviourSimplify 有一点 ...

  5. Unity 游戏框架搭建 2019 (五十二~五十四) 什么是库?&第四章总结&第五章简介

    在上一篇,我们对框架和架构进行了一点探讨.我们在这一篇再接着探讨. 什么是库呢? 来自同一位大神的解释: 库, 插到 既有 架构 中, 补充 特定 功能. 很形象,库就是搞这个的.我们的库最初存在的目 ...

  6. Unity 游戏框架搭建 2019 (五十六/五十七) 需求分析-架构中最重要的一环&从 EmptyGO 到 Manager Of Managers

    我们的项目开始立项的时候,最常见的一个情况就是:几个人的小团队,一开始什么也不做,就开始写代码,验证逻辑,游戏就开始写起来了.而公司的一些所谓的领导层面一开始就把游戏定义为我们要做一个大作.这个事情本 ...

  7. Unity 游戏框架搭建 (十九) 简易对象池

    在Unity中我们经常会用到对象池,使用对象池无非就是解决两个问题: 一是减少new时候寻址造成的消耗,该消耗的原因是内存碎片. 二是减少Object.Instantiate时内部进行序列化和反序列化 ...

  8. Unity 游戏框架搭建 (十八) 静态扩展 + 泛型实现transform的链式编程

    本篇文章介绍如何实现如下代码的链式编程: C# this.Position(Vector3.one) .LocalScale(1.0f) .Rotation(Quaternion.identity); ...

  9. Unity 游戏框架搭建 (十二) 简易AssetBundle打包工具(二)

    上篇文章中实现了基本的打包功能,在这篇我们来解决不同平台打AB包的问题. 本篇文章的核心api还是: BuildPipeline.BuildAssetBundles (outPath, 0, Edit ...

随机推荐

  1. 不使用XMLHttpRequest实现异步加载:Iframe和script

    运用Iframe和script可以实现简单的异步加载: 调用页面如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  2. TD不换行 nowrap属性

    表格table的td单元格中,文字长了往往会撑开单元格,但是如果table都不够宽了,就换行了好像(不要较真其他情况,我只说会换行的情况).换行后的表格显得乱糟糟,不太好看,我不喜欢这样的换行.当然可 ...

  3. 如何取得GridView被隐藏列的值

    如何取得GridView被隐藏列的值         分类:             ASP.net              2009-06-25 12:47     943人阅读     评论(1 ...

  4. 纯代码编写的vc跳转SB

    今天遇到个问题,我整个项目都是纯代码,突然有个引用的VC用了storyboard,导航的跳转不知道如何操作,最后试了很多方法总算可以了 首先,找到要跳转的sb. UIStoryboard *story ...

  5. Java 枚举 获取前后元素,下一个元素

    https://blog.csdn.net/jiangshanwe/article/details/79119219

  6. VS2012 无法启动 IIS Express Web

    用记事本打开项目的.csproj文件,定位到<WebProjectProperties>,把关于IIS的配置<DevelopmentServerPort>.<Develo ...

  7. 有关ie9 以下不支持placeholder属性以及获得焦点placeholder的移除

    (一)placeholder 属性起到提示客户输入信息作用 (二)ie9以下出问题了 placeholder不支持 (三)解决办法 先贴html 加上jquery代码就可以了 关于表单获取焦点,chr ...

  8. SQL Server中的高可用性----复制

    在本系列文章的前两篇对高可用性的意义和单实例下的高可用性做了阐述.但是当随着数据量的增长,以及对RTO和RPO要求的严格,单实例已经无法满足HA/DR方面的要求,因此需要做多实例的高可用性.本文着重对 ...

  9. 开通cnblogs博客

    开通博客,准备记录学习和开发过程

  10. Hadoop ->> MapReduce编程模型

    对于MapReduce模型的实现,有Java等一些语言实现了接口,或者用像Hive/Pig这样的平台来操作.MapReduce由Map函数.Reduce函数和Main函数实现.第一步,源数据文件按默认 ...