約定 還記得上版本的第二十四篇的約定嘛?現在出來履行啦~ 為什麼要重製? 之前寫的專欄都是按照心情寫的,在最初的時候筆者什麼都不懂,而且文章的發佈是按照很隨性的一個順序。結果就是說,大家都看完了,都還對框架沒有一個感覺,感覺很亂。而現在,經過兩年多的摸索,筆者已經對框架的體系有了一個瞭解,所以希望再 ...
約定
還記得上版本的第二十四篇的約定嘛?現在出來履行啦~
為什麼要重製?
之前寫的專欄都是按照心情寫的,在最初的時候筆者什麼都不懂,而且文章的發佈是按照很隨性的一個順序。結果就是說,大家都看完了,都還對框架沒有一個感覺,感覺很亂。而現在,經過兩年多的摸索,筆者已經對框架的體系有了一個瞭解,所以希望再版一次此系列的專欄。
為什麼不在原來的文章里直接修改呢?
在上一輪的專欄第二十四篇里有講過過:雖然以前的內容過時了,但是這些專欄對筆者有很重要的意義,它們記錄了筆者成長的一個經歷,在評論區有著大家的支持和鼓勵也有一些很有意義的問答,所以筆者捨不得破壞掉這些寶貴的回憶。
更新哪些內容?
這次的重製更新的內容圍繞如下幾點:
- 在原有內容的基礎上補充更多內容。
- 語句不通順、不太容易理解、有歧義的地方、不夠嚴謹的地方進行修改優化。
- 順序調整:會按照從易到難、由淺入深、由常用到不常用這三個角度進行內容上的排版,以提高閱讀體驗,使只是掌握更容易更充分。
- QFramework 的介紹與原理,重點是 UI 和 資源管理兩個模塊的介紹與原理。
整理後的內容結構如下:
- 理論與方法論:包含架構與框架搭建、重構、命名、測試、設計模式等內容。
- 資源管理神器: ResKit (重點)
- UI 框架: UIKit (重點)
- QFramework 最佳實踐與 Demo
- 歸納和總結。
希望這次可以大家展現一個比較清晰的框架知識體系。
此次專欄重製的背景就寫到這裡。接下來開始正文。
架構與框架初識
什麼是架構?
架構是一個約定,一個規則,一個大家都懂得遵守的共識。那這是什麼樣的約定、什麼樣的規則、什麼樣的共識呢?
我以包為例,我經常出差,雙肩背包里裝了不少東西。筆記本電腦、電源、2 個上網卡、滑鼠、USB 線、一盒大的名片、一盒小的名片、口香糖、Mini-DisplayPort 轉 VGA 介面、U 盤、幾根筆、小螺絲刀、洗漱用品、乾凈衣服、襪子、香水、老婆給我帶的抹臉膏(她嫌我最近累,臉有點黃)、錢包、Token 卡、耳機、紙巾、USB 線、U 盤等。這個包有很多格子,最外面的格子我放常用的,比如筆、紙、一盒小的名片等;中間的格子一般放的是衣服、襪子、洗漱用品、香水等;靠背的那個大格子放了筆記本電腦,和筆記本電腦相近的小格子放的是兩個上網卡、Mini-DisplayPort 轉 VGA 介面、大盒名片、記事本,和筆記本電腦相近的大格子放的是電源、滑鼠、口香糖等。
我閉著眼睛都可以將我的東西從包里掏出來,閉著眼睛都可以將東西塞到包里!但是,非常不幸的是,一旦我老婆整理過我的包,那我就很慘了,老是因為找不到東西而變得抓狂!更不幸的,要是我那個不到兩歲的“小可愛”翻過,就更不得了了。
這個包就是我放所有物品的“架構”,每一個東西放置的位置就是我的“約定、規則、共識”。倘若我老婆也知道我的“架構”、我的“約定、規則、共識”,那麼不管她怎麼動我的包,我都照樣能夠輕易的拿東西或者放東西。進一步,如果我的同事也知道我的“架構”,知道我的“約定、規則、共識”,那麼他們什麼時候動我的包,我也毫無所知!——道法自然 《10 年感觸:架構是什麼?——消滅架構!》
什麼是框架?
框架(framework)是一個框子--指其約束性,也是一個架子--指其支撐性。——360 百科
小結
本小節對框架和架構概念做了簡單的認識,得出了以下兩個結論:
- 架構是“約定、規則、共識”
- 框架具有約束性和支撐性
到這裡,大家應該對這兩個概念有點感覺了。但是還是會有很多疑問,比如“如何去做架構?”、“框架的約束性和支撐性分別指的什麼怎麼體現的?”等等。這些在後續的專欄中詳細講解。關於架構與框架的初識就介紹到這裡。
QFramework 簡介
兩年前,筆者畢業半年,剛從 cocos2d 轉 Unity 不到兩個月,當時所在的公司有一套游戲開發框架。筆者用它做了兩個月的項目,使用框架做項目的時候並沒有去思考框架是什麼,只是開始的時候覺得很新鮮,而且越用越順手,嘗到了它的甜頭。
後來筆者接到了一個跑酷游戲項目,於是就把工作辭掉了,決定出來全職做這個項目。辭職後,公司的框架由於保密協議就不可以用了。項目就只能從零開始開發,那麼結果就是在跑酷項目的開發的過程中各種中水土不服。
於是,筆者就開始了市面上開源框架的選型,折騰了幾天,發現要麼上手太難,要麼學習成本很高文檔不齊全,有的框架光是理解概念就要很久,對於像筆者一樣剛畢業的初學者來說,市面上的開源框架真的很不友好。
從那時候筆者就決定要 為自己,開發一套符合自己使用習慣的框架,也就是現在的 QFramework。
為什麼叫 QFramework
筆者在做 cocos2dx 的時候,市面上有個叫 Quick-Cocos2d-x 的開源框架,用兩個詞形容就是簡單、強大。
而筆者一直堅信好的工具就應該簡單。
QFramework 的目標是要做到像 Quick-Cocos2d-x 一樣 “簡單、強大”。當時筆者糾結過很多名字,比如 QuickEngine,QuickUnity 等等。Q 代表 Quick,並且 Q 這個字母給人感覺靈活有彈性,所以最終確定為 QFramework。
QFramework 的目標
記得在此系列上一輪的第十篇中有如下一段話:
筆者意願是想把 QFramework 打造成,讓使用的人覺得所有框架中出現的概念要非常清晰,沒有任何模糊的概念,出現的概念已經達成共識的概念,沒有任何生僻概念,使用門檻盡很低:)。
這個 flag 是 2016 年立的,目前從用戶的反饋來看完成得還不錯。
QFramework 群里有人形容 QFramework 三個詞:簡單、粗暴、還有點小精緻,筆者覺得形容地非常地貼切。
目前主要三個模塊,UIKit,ResKit,ActionKit。目前還有一個模塊 EditorKit 正在開發中。
看到這裡大家可能對 ActionKit 有些陌生,它的前身就是 QChain,負責所有的非同步邏輯,包含 UniRx 和 Promise 還有一套輕量級的行為樹。之後會用一個非常詳細的文章介紹它。
QFramework 快速入門:
要介紹 QFramework 只要附上三段代碼就夠了:
1.Action Kit
- chainning style(Driven by MonoBehaviour or Update)
this.Sequence()
.Delay(1.0f)
.Event(()=>Log.I("Delayed 1 second"))
.Until(()=>something is done)
.Begin();
- object oriented style
var sequenceNode = new SequenceNode();
sequenceNode.Append(DelayAction.Allocate(1.0f));
sequenceNode.Append(EventAction.Allocate(()=>Log.I("Delayed 1 second"));
sequenceNode.Append(UntilAction.Allocate(()=>something is true));
this.ExecuteNode(sequenceNode);
2.Res Kit
// allocate a loader when initialize a panel or a monobehavour
var loader = ResLoader.Allocate<ResLoader>();
// load someth in a panel or a monobehaviour
loader.LoadSync<GameObject>("Resources/smobj");
loader.LoadSync<Texture2D>("Resources/Bg");
// load by asset bundle's assetName
loader.LoadSync<Texture2D>("HomeBg");
// load by asset bundle name and assetName
loader.LoadSync<Texture2D>("home","HomeBg");
// resycle this panel/monobehaivour's loaded res when destroyed
loader.Recycle2Cache()
loader = null
3.UI Kit
// open a panel from assetBundle
UIMgr.OpenPanel<UIMainPanel>();
// load a panel from specified Resources
UIMgr.OpenPanel<UIMainPanel>(prefabName:"Resources/UIMainPanel");
// load a panel from specield assetName
UIMgr.OpenPanel<UIMainPanel>(prefabName:"UIMainPanel1");
QFramework 介紹到這裡。
Unity 里的常用架構
一份六一禮物
今天是六一,作為禮物先送上一段對筆者影響最大的一段話:
在寫一個項目的時候,不要短視地說我就把這個項目做完了,就是交一個差上線了就完了,我們希望每寫一個游戲的時候,我們都積累一些東西,把寫的每一行代碼,都當成是一個可以收藏的,甚至是可以傳遞下去的這樣的一個資產。有了這樣一個思想,可能我們在寫代碼的時候,整個的思維模式會完全不一樣。——劉鋼《Unity 項目架構和開發管理》
以上這段話來自劉鋼老師的講座《Unity項目架構設計與開發管理》 的結尾。
Unity 項目架構設計與開發管理
筆者比較幸運,在學習 Unity 之後不久就看了劉鋼老師的這個視頻,筆者當時很受啟發。而視頻中所提出的 Manager Of Managers 很好地為 QFramework 指明瞭方向。視頻講得通俗易懂,裡邊很多內容都值得反覆咀嚼,筆者之後花了很長時間去消化裡邊的內容。直到今天,筆者再看一遍視頻還是會有很多收穫的,希望大家看完之後也有所收穫有所啟發。
視頻中比較精彩的部分是從一個什麼架構都沒有的項目一點一點演化到 MVVM 和 StrangeIOC 架構。
關於Unity的架構有如下幾種常用的方式簡單總結如下:
1.EmptyGO:
在 Hierarchy 上創建一個空的 GameObject,然後掛上所有與 GameObject 無關的邏輯控制的腳本。使用GameObject.Find() 訪問對象數據。
缺點:邏輯代碼散落在各處,不適合大型項目。
2.Simple GameManager:
所有與 GameObject 無關的邏輯都放在一個單例中。
缺點:單一文件過於龐大。
3.Manager Of Managers:
將不同的功能單獨管理。如下:
- MainManager: 作為入口管理器。
- EventManager: 消息管理。
- GUIManager: 圖形視圖管理。
- AudioManager: 音效管理。
- PoolManager: GameObject管理(減少動態開闢記憶體消耗,減少GC)。
- LevelManager: 關卡管理。
- GameManager: 游戲管理。
- SaveManager: 配置&存儲管理。
- MenuManager 菜單管理。
4.將 View 和 Model 之間增加一個媒介層。
MVCS:StrangeIOC 插件。
MVVM:uFrame 插件。
5. ECS (Entity Component Based System)
Unity 是基於 ECS,比較適合 GamePlay 模塊使用。
還有比較有名的 Entitas-CSharp
相關鏈接:
我的框架地址:https://github.com/liangxiegame/QFramework
教程源碼:https://github.com/liangxiegame/QFramework/tree/master/Assets/HowToWriteUnityGameFramework/
QFramework&游戲框架搭建QQ交流群: 623597263
轉載請註明地址:涼鞋的筆記http://liangxiegame.com/
微信公眾號:liangxiegame
如果有幫助到您:
如果覺得本篇教程或者 QFramework 對您有幫助,不妨通過以下方式贊助筆者一下,鼓勵筆者繼續寫出更多高質量的教程,也讓更多的力量加入 QFramework 。
- 給 QFramework 一個 Star:https://github.com/liangxiegame/QFramework
- 下載 Asset Store 上的 QFramework 並給個五星:http://u3d.as/SJ9
- 購買 gitchat 話題並給 5 星好評: http://gitbook.cn/gitchat/activity/5abc3f43bad4f418fb78ab77 (6 元,會員免費)
- 購買同名的蠻牛視頻課程錄播課程並給 5 星好評:http://edu.manew.com/course/431 (目前定價 29.8 元,正在漲價哦)
- 購買同名電子書 :https://www.kancloud.cn/liangxiegame/unity_framework_design( 29.9 元,內容會在 2018 年 10 月份完結)
筆者在這裡保證 QFramework、入門教程、文檔和此框架搭建系列的專欄永遠免費開源。以上捐助產品的內容對於使用 QFramework 的使用來講都不是必須的,所以大家不用擔心,各位使用 QFramework 或者 閱讀此專欄 已經是對筆者團隊最大的支持了。