本篇本來是作為原來優雅的 QChain 的第一篇的內容,但是 QChain 流產了,所以收錄到了游戲框架搭建系列。本篇介紹如何實現 GameObject 的鏈式編程。
鏈式編程的實現技術之一是 C# 的靜態擴展。靜態擴展可以做到無需繼承 GameObject 就可以為 GameObject 的對象添加成員方法。其實這么說不太嚴謹,但是看起來就是這樣:)
## C# 靜態擴展快速入門
首先我們要實現給 GameObject 添加一個DestroySelf方法。使用方式如下:
```cs
gameObject.DestroySelf();
```
貼上具體實現代碼 :
```cs
using System;
using UnityEngine;
/// <summary>
/// GameObject's Util/This Extension
/// </summary>
public static class GameObjectExtension
{
...
public static void DestroySelf(this GameObject selfObj)
{
GameObject.Destroy(selfObj);
}
...
}
```
代碼非常簡單。
以上代碼要注意的是:
1. 靜態擴展方法必須在靜態類中實現。
2. 第一個參數前要加this關鍵字。
當然也可以用這種方式使用:
``` csharp
GameObjectExtension.DestroySelf(gameObject);
```
這樣寫的意義不大,不如直接用Object/GameObject.Destroy(gameObject);不過也有可以使用的情形,就是當導出給腳本層使用的時候。這里不多說。
初步入門就介紹到這里。下面實現鏈式編程。
## GameObject 實現鏈式編程
鏈式編程實現方式多種多樣。但是對于 GameObject 來說有一種最簡單并且最合適的方法,就是靜態擴展 + 返回 this 的方式。
為什么呢?鏈式編程如果可以使用繼承實現的話有很多種玩法,只不過 GameObject 是 sealed class,不能被繼承。所以只能通過靜態擴展 + 返回this的方式。這也是為什么會把這篇文章作為第一篇的原因。
先看下如何使用。
```cs
gameObject.Show() // active = true
.Layer(0) // layer = 0
.Name("Example"); // name = "Example"
```
接下來貼出實現:
```cs
using System;
using UnityEngine;
/// <summary>
/// GameObject's Util/This Extension
/// </summary>
public static class GameObjectExtension
{
public static GameObject Show(this GameObject selfObj)
{
selfObj.SetActive(true);
return selfObj;
}
public static GameObject Hide(this GameObject selfObj)
{
selfObj.SetActive(false);
return selfObj;
}
public static GameObject Name(this GameObject selfObj,string name)
{
selfObj.name = name;
return selfObj;
}
public static GameObject Layer(this GameObject selfObj, int layer)
{
selfObj.layer = layer;
return selfObj;
}
public static void DestroySelf(this GameObject selfObj)
{
GameObject.Destroy(selfObj);
}
...
}
```
可以看到新增的幾個靜態方法與 DestroySelf 不同的是,多了個 return selfObj,就是調用方法時返回自己,這樣可以接著調用自己的方法。原理很簡單。
## 目前 GameObject 鏈式編程的優劣:
* 優點:代碼緊湊,寫起來很爽快,以自己的習慣設計接口,會提高開發效率。
* 缺點:性能會損耗一丟丟,調試不方便,出異常時候會發現堆棧信息超級長,別人看了會誤認為Unity 升級又加了API。不過 DoTween,UniRx 都在這么用…
執行效率 vs 開發效率 + 低 bug 率,就看各位怎么權衡啦。
OK,本篇就介紹到這里。
轉載請注明地址:涼鞋的筆記:[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 (二十四) 小結