加班加了三个月终于喘了口气,博客很久没有更新了,这段期间框架加了很多 Feature,大部分不太稳定,这些 Feature中实现起来比较简单而且用的比较稳定的就是链式编程支持了。
## 什么是链式编程?
我想大家应该都接触过DOTween,用起来是这样的。
```cs
transform.DOMove(Vector3.one, 0.5f)
.SetEase(Ease.InBack)
.OnKill(() => Debug.Log("on killed"))
.OnComplete(() => Debug.Log("on completed"));
```
像以上.XXX().YYY().ZZZ()这种写法就叫链式编程了。
## QChain是什么?
QFramework 中有零零散散支持了链式写法,打算整理出来作为一个独立的库进行过维护。目前的使用方式如下:
```cs
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,蓝牙连接的代码可以这样写:
```cs
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](http://liangxiegame.com)
## 更多内容
* QFramework 地址:[https://github.com/liangxiegame/QFramework](https://github.com/liangxiegame/QFramework)
* QQ 交流群:[623597263](http://shang.qq.com/wpa/qunwpa?idkey=706b8eef0fff3fe4be9ce27c8702ad7d8cc1bceabe3b7c0430ec9559b3a9ce66)
* **Unity 进阶小班**:
* 主要训练内容:
* 框架搭建训练(第一年)
* 跟着案例学 Shader(第一年)
* 副业的孵化(第二年、第三年)
* 权益、授课形式等具体详情请查看[《小班产品手册》](https://liangxiegame.com/master/intro):https://liangxiegame.com/master/intro
* 关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。
![](http://file.liangxiegame.com/38eccb55-40b2-4845-93d6-f5fb50ff9492.png)
- 正文
- Unity 游戏框架搭建 2017(一)概述
- Unity 游戏框架搭建 2017(二)单例的模板
- Unity 游戏框架搭建 2017(三)MonoBehaviour 单例的模板
- Unity 游戏框架搭建 2017(四)简易有限状态机
- Unity 游戏框架搭建 2017(五)简易消息机制
- Unity 游戏框架搭建 2017 (六) 关于框架的一些好文和一些思考
- Unity 游戏框架搭建 2017 (七) 减少加班利器-QApp类
- Unity 游戏框架搭建 2017 (八) 减少加班利器-QLog
- Unity 游戏框架搭建 2017 (九) 减少加班利器-QConsole
- Unity 游戏框架搭建 2017 (十) QFramework v0.0.2小结
- Unity 游戏框架搭建 2017 (十一) 简易 AssetBundle 打包工具 (一)
- Unity 游戏框架搭建 2017 (十二) 简易 AssetBundle 打包工具 (二)
- Unity 游戏框架搭建 2017 (十三) 无需继承的单例的模板
- Unity 游戏框架搭建 2017 (十四) 优雅的 QSingleton (零) QuickStart
- Unity 游戏框架搭建 2017 (十四) 优雅的 QSingleton (一) Singleton 单例实现
- Unity 游戏框架搭建 2017 (十四) 优雅的 QSingleton (二) MonoSingleton单例实现
- Unity 游戏框架搭建 2017 (十四) 优雅的 QSignleton (三) 通过属性器实现 Singleton
- Unity 游戏框架搭建 2017 (十四) 优雅的 QSingleton (四) 属性器实现 Mono 单例
- Unity 游戏框架搭建 2017 (十四) 优雅的 QSingleton (五) 优雅地进行GameObject命名
- Unity 游戏框架搭建 2017 (十五) 优雅的 QChain (零)
- Unity 游戏框架搭建 2017 (十六) v0.0.3 架构调整
- Unity 游戏框架搭建 2017 (十七) 静态扩展GameObject 实现链式编程
- Unity 游戏框架搭建 2017 (十八) 静态扩展 + 泛型实现 transform 的链式编程
- Unity 游戏框架搭建 2017 (十九) 简易对象池
- Unity 游戏框架搭建 2017 (二十) 安全的对象池
- Unity 游戏框架搭建 2017 (二十一) 使用对象池时的一些细节
- Unity 游戏框架搭建 2017 (二十二) 简易引用计数器
- Unity 游戏框架搭建 2017 (二十三) 重构小工具 Platform
- Unity 游戏框架搭建 2017 (二十四) 小结