加班加了三個月終于喘了口氣,博客很久沒有更新了,這段期間框架加了很多 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 獲取第一時間更新通知及更多的免費內容。

- 正文
- 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 (二十四) 小結