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

来源:https://www.cnblogs.com/liangxiegame/archive/2018/06/07/9150834.html
-Advertisement-
Play Games

約定 還記得上版本的第二十四篇的約定嘛?現在出來履行啦~ 為什麼要重製? 之前寫的專欄都是按照心情寫的,在最初的時候筆者什麼都不懂,而且文章的發佈是按照很隨性的一個順序。結果就是說,大家都看完了,都還對框架沒有一個感覺,感覺很亂。而現在,經過兩年多的摸索,筆者已經對框架的體系有了一個瞭解,所以希望再 ...


約定

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

為什麼要重製?

之前寫的專欄都是按照心情寫的,在最初的時候筆者什麼都不懂,而且文章的發佈是按照很隨性的一個順序。結果就是說,大家都看完了,都還對框架沒有一個感覺,感覺很亂。而現在,經過兩年多的摸索,筆者已經對框架的體系有了一個瞭解,所以希望再版一次此系列的專欄。

為什麼不在原來的文章里直接修改呢?

在上一輪的專欄第二十四篇里有講過過:雖然以前的內容過時了,但是這些專欄對筆者有很重要的意義,它們記錄了筆者成長的一個經歷,在評論區有著大家的支持和鼓勵也有一些很有意義的問答,所以筆者捨不得破壞掉這些寶貴的回憶。

更新哪些內容?

這次的重製更新的內容圍繞如下幾點:

  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

相關鏈接:

我的框架地址:https://github.com/liangxiegame/QFramework

教程源碼:https://github.com/liangxiegame/QFramework/tree/master/Assets/HowToWriteUnityGameFramework/

QFramework&游戲框架搭建QQ交流群: 623597263

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

微信公眾號:liangxiegame

如果有幫助到您:

如果覺得本篇教程或者 QFramework 對您有幫助,不妨通過以下方式贊助筆者一下,鼓勵筆者繼續寫出更多高質量的教程,也讓更多的力量加入 QFramework 。

筆者在這裡保證 QFramework、入門教程、文檔和此框架搭建系列的專欄永遠免費開源。以上捐助產品的內容對於使用 QFramework 的使用來講都不是必須的,所以大家不用擔心,各位使用 QFramework 或者 閱讀此專欄 已經是對筆者團隊最大的支持了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如圖為jd的廣告頁面 如果想給每個盒子加上美觀的border,實現如下效果 如果給每個li加border的話盒子就會被撐開,則依照浮動特性一行就容納不下4個li,li會自動掉下來。這時,可以給ul一個寬度,li就不會掉下來,如下圖所示 這時,剛好ul會比外面的盒子高幾像素和幾及像素(如果不清除浮動u ...
  • 在windows系統中如何查看文件的擴展名,預設情況下windows系統是不顯示文件的擴展名的,但是作為一個開發者而言,查看文件的擴展名是我們必備的技能 win10:隨便打開一個文件夾 點擊查看 將文件擴展名的選項勾上 html文件的擴展名是.html 電腦上的一個文件是可以“同時”被多個軟體打開的 ...
  • HTTP是Hypertext Transfer Protocol的縮寫,譯為:超文本傳輸協議 什麼是協議? 在現實生活中有很多的協議,例如租房協議/買賣協議/離婚協議 無論是什麼協議它們都有一個共同點,就是用來規範/約束某一類事物 HTTP協議是用來規範/約束哪一類事物? HTTP協議就是相當於我們 ...
  • ...
  • 請求報文:請求行+請求頭+空行+請求體 響應報文:響應行+響應頭+響應體 如何打開谷歌的開發者工具? ...
  • 什麼是伺服器? 伺服器也是電腦,只不過是比我們的電腦配置更高的電腦,並且24小時不斷電,不關機的電腦 伺服器是專門用於存儲數據的電腦,訪問者可以訪問伺服器獲得伺服器上存儲的數據 伺服器一旦關機,訪問者就無法訪問 3.瀏覽器訪問網頁原理(理解) 所以綜合我們的第二點和第三點,我們得出一個結論,這些系 ...
  • body{ font family: SimSun,PingFang SC; } ubuntu搭建nodejs生產環境——快速部署手冊 為什麼不用CentOS而用Ubuntu作為生產環境的運行平臺?這個我也比較好奇,公司訂的只能沿用傳統,從使用成本的角度來說,此舉也是值得肯定的。 測試環境 騰訊雲 ...
  • 本書是Eric Evans對他自己寫的《領域驅動設計-軟體核心複雜性應對之道》的一本字典式的參考書,可用於快速查找《領域驅動設計》中的諸多概念及其簡明解釋。 其它本系列其它文章地址: [譯文]Domain Driven Design Reference(一)—— 前言 [譯文]Domain Driv ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...