# Unity 游戲框架搭建 2017(一)概述
為了重構手頭的一款項目,翻出來當時未接觸Unity時候收藏的視頻[ 《Unity項目架構設計與開發管理》 ](http://v.qq.com/boke/page/d/0/u/d016340mkcu.html "《Unity項目架構設計與開發管理》")對于我這種初學者來說全是干貨。簡單的總結了一下,以后慢慢提煉。
關于Unity的架構有如下幾種常用的方式。
## 1.EmptyGO:
??在 Hierarchy 上創建一個空的GameObject,然后掛上所有與 GameObject 無關的邏輯控制的腳本。使用GameObject.Find() 訪問對象數據。
缺點:邏輯代碼散落在各處,不適合大型項目。
## 2.Simple GameManager:
??所有與 GameObject 無關的邏輯都放在一個單例中。
缺點:單一文件過于龐大。
## 3.Manager Of Managers:
將不同的功能單獨管理。如下:
* MainManager: 作為入口管理器。
* EventManager: 消息管理。
* GUIManager: 圖形視圖管理。
* AudioManager: 音效管理。
* PoolManager: GameObject管理(減少動態開辟內存消耗,減少GC)。
## 實現一個簡單的 PoolManager:
```cs
// 存儲動可服用的GameObject。
private List<GameObject> dormantObjects = new List<GameObject>();
// 在dormantObjects獲取與go類型相同的GameObject,如果沒有則new一個。
public GameObject Spawn(GameObject go)
{
GameObject temp = null;
if (dormantObjects.Count > 0)
{
foreach (GameObject dob in dormantObjects)
{
if (dob.name == go.name)
{
// Find an available GameObject
temp = dob;
dormantObjects.Remove(temp);
return temp;
}
}
}
// Now Instantiate a new GameObject.
temp = GameObject.Instantialte(go) as GameObject;
temp.name = go.name;
return temp;
}
// 將用完的GameObject放入dormantObjects中
public void Despawn(GameObject go)
{
go.transform.parent = PoolManager.transform;
go.SetActive(false);
dormantObject.Add(go);
Trim();
}
//FIFO 如果dormantObjects大于最大個數則將之前的GameObject都推出來。
public void Trim()
{
while (dormantObjects.Count > Capacity)
{
GameObject dob = dormantObjects[0];
dormantObjects.RemoveAt(0);
Destroy(dob);
}
}
```
### 缺點:
* 不能管理prefabs。
* 沒有進行分類。
更好的實現方式是將一個PoolManager分成:
* 若干個 SpawnPool。
- 每個 SpawnPool 分成 PrefabPool 和 PoolManager。
* PrefabPool 負責 Prefab的加載和卸載。
* PoolManager 與之前的 PoolMananger 功能一樣,負責 GameObject 的 Spawn、Despawn 和 Trim。
## 要注意的是:
* 每個 SpawnPool 是 EmeptyGO。
* 每個 PoolManager 管理兩個 List (Active,Deactive)。
講了一堆,最后告訴有一個NB的插件叫 PoolManager- -。
* LevelManager: 關卡管理。
推薦插件: MadLevelManager。
GameManager: 游戲管理。
??[C#程序員整理的Unity 3D筆記(十二):Unity3D之單體模式實現GameManager](http://www.tuicool.com/articles/u6NN7v)
* SaveManager: 配置管理。
* 實現 Resume,功能玩到一半數據臨時存儲。
推薦 SaveManager 插件。可以 Load、Save 均采用二進制(快!!!)
所有 C# 類型都可以做 Serialize。
數據混淆,截屏操作。
MenuManager 菜單管理。
## 4.將 View 和 Model 之間增加一個媒介層。
MVCS:Strange IOC 插件。
MVVM:uFrame 插件。
## 5. ECS(Entity Component Based System)
Unity 是基于 ECS,比較適合 GamePlay 模塊使用。
還有比較有名的 [Entitas-CSharp](https://github.com/sschmid/Entitas-CSharp)
此篇的內容就這些。
## 更多內容
* 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 (二十四) 小結