Unity 遊戲框架搭建 2018 (一) 架構、框架與 QFramework 簡介

Unity 遊戲框架搭建 2018 (一) 架構、框架與 QFramework 簡介

約定

還記得上版本的第二十四篇的約定嘛?如今出來履行啦~html

爲何要重製?

以前寫的專欄都是按照心情寫的,在最初的時候筆者什麼都不懂,並且文章的發佈是按照很隨性的一個順序。結果就是說,你們都看完了,都還對框架沒有一個感受,感受很亂。而如今,通過兩年多的摸索,筆者已經對框架的體系有了一個瞭解,因此但願再版一次此係列的專欄。git

爲何不在原來的文章裏直接修改呢?

在上一輪的專欄第二十四篇裏有講過過:雖然之前的內容過期了,可是這些專欄對筆者有很重要的意義,它們記錄了筆者成長的一個經歷,在評論區有着你們的支持和鼓勵也有一些頗有意義的問答,因此筆者捨不得破壞掉這些寶貴的回憶。github

更新哪些內容?

此次的重製更新的內容圍繞以下幾點:設計模式

  1. 在原有內容的基礎上補充更多內容。
  2. 語句不通順、不太容易理解、有歧義的地方、不夠嚴謹的地方進行修改優化。
  3. 順序調整:會按照從易到難、由淺入深、由經常使用到不經常使用這三個角度進行內容上的排版,以提升閱讀體驗,使只是掌握更容易更充分。
  4. 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

相關連接:

轉載請註明地址:涼鞋的筆記:liangxiegame.com

更多內容

相關文章
相關標籤/搜索