官术网_书友最值得收藏!

1.3 如何構建Unity3D項目

前面我們對軟件架構進行了解釋,并且對軟件架構抽象的思維方式進行了詳細介紹,包括分層、分治、演化。本書將具體介紹架構中的誤區,以及如何做前端架構,并且了解如何構建Unity3D項目。

1.前端與后端架構之間的共性

前后端架構的目標都是高性能、高可用、可擴展、安全、可容錯。對于前端來說,除了這些目標特性外,還需要加入更多的用戶體驗,包括視覺效果和操作靈敏度。

作為前端工程師,用戶體驗是比較重要的,這種體驗涉及很多方面,包括性能、視覺效果,以及操作上的人性化等。例如,如何讓游戲加載速度更流暢、如何制作更絢麗的特效、如何減少電量的消耗、如何最快地響應用戶操作等。

前端技術與后端技術都是在同一個系統層面上建立起來的,都是建立在Linux、Windows、Android、iOS操作系統之上的,兩者最后都需要開發者了解操作系統的接口以及底層運作原理。它們的區別在于,后端在操作系統上構建了一套服務端框架,而前端在操作系統上構建了一個渲染引擎,它們需要在此之上做業務架構。我們自己構建或選擇某個商業渲染引擎后,再在渲染引擎之上建立游戲應用的業務架構。因此,我們其實有兩套架構要學習,一套是渲染引擎架構,一套是游戲業務架構。

對渲染引擎架構的探討偏離了本書的范圍,這里不做詳細闡述。游戲業務架構中有很多需要我們搭建的框架,可以以模塊形式來命名它們,包括網絡框架、UI框架、數據框架、核心戰斗框架、AI框架等,后面將進行討論。

2.培養架構設計思維

良好的架構設計思維的培養,離不開工作中大量高質量項目的實戰鍛煉,以及平時的學習、思考和總結。

基本的架構設計思維在大學計算機課程(比如數據結構和算法)中可以找到,大學里以學習理論知識為主。回頭看,基本的架構設計思維在那時就已經埋下種子,后面的工程實踐會進一步消化和應用所學的理論知識,隨著經驗的積累,我們能夠解決的問題的復雜性和規模逐漸變大,但所用的方法依然是抽象、分層、分治和演化。

架構設計并不是靜態的,而是動態的。只有不斷應對環境變化的系統,才是有生命力的系統。所以,即使你掌握了抽象、分層和分治這三種基本思維,仍然需要演化式思維,在設計的同時,借助反饋和進化的力量推動架構的持續演進。

架構師在關注技術、開發應用的同時,需要定期梳理自己的架構設計思維,積累的時間長了,看待世界事物的方式會發生根本性的變化,你會發現我們生活的世界,其實也是在抽象、分層、分治和演化的基礎上構建起來的。架構設計思維的形成會對你的系統架構設計能力產生重大影響。可以說,對抽象、分層、分治和演化掌握的深度和靈活應用的水平,直接決定架構師解決問題域的復雜性和規模大小,是區分普通應用型架構師和平臺型/系統型架構師的一個分水嶺。

3.試著構建Unity3D項目

我們可以使用以上方法來試著構建Unity3D項目。下面采用分層的思維方式先確定架構的層級,如圖1-8所示。

圖1-8 Unity3D分層設計

把整個項目分成五大層級,即網絡層、數據管理層、資源管理層、核心邏輯框架層、UI框架層。

這樣一分就清晰地知道了我們需要做哪幾大類的東西。只是這樣拆分太籠統,特別是核心邏輯框架層,完全是概括性的層級,無法表達具體的系統。所以我們要再次拆分層級,把太過于籠統的層級進行分層,如圖1-9所示。

經過分層后再采用分治的方法,把核心邏輯框架層拆成為工具編輯器、角色行為框架、AI框架、地圖場景與尋路框架、著色器與特效、設備平臺等。這些子層都在核心邏輯框架層中,它們有自己的框架,也可以互相調用,它們一起構成核心邏輯部分,也就是核心玩法或核心戰斗的主要部分。

圖1-9 分層后再分治

我們再將資源管理層和數據管理層進行拆分,分為AssetBundle資源管理和Prefab資源管理,以及內存數據管理和外部數據管理,這樣更清晰地分工了各層的職能。其實還有很多其他的層級這里沒有提到,包括常用庫、工具庫、動畫控制等,這里暫不一一提出。

在游戲項目中,最常用的是數據表、網絡層、UI層、常用庫這幾個模塊。我們可以使用這種層級的方式來試著搭建一個完整的項目,只是做抽象的編寫,就可以清晰地知道這個項目需要哪些模塊和層級。

比如,如果項目是單機的策略類游戲,可能就沒有很多角色上的東西,而多了很多2D動畫行為控制上的需求。這時在進行層級劃分時,就可以把注意力重點放在2D動畫行為控制、UI框架、數據管理、資源管理及AI上。

如果項目是以3D人物角色為主的網絡游戲,則應有地形地圖、角色行為控制等內容,此外,還需要一套角色技能、特效、動畫編輯工具等。網絡游戲項目前期我們會對網絡這塊內容進行決策,確定是TCP-Socket、UDP還是Web形式的HTTP。3D MMRPG的難度主要集中在了解角色技能動畫、AI、地圖、物理模擬上。我們可以把重點提取出來,讓擅長的同事專門做這塊內容的深度挖掘,把最難把控的放在最優先的位置去做,再對這些層級進行細致化構建。

對模塊進行細致化構建時,我們可以使用分治法去構建。如果某個要解決的問題已經確定,且這個問題的規模太大,無法直接下手解決,那么可以使用分治法,把一個問題分成幾個小問題來處理,把小問題再劃分成更小的問題,直到能直接解決為止,再依次對它們進行處理。

下面拿網絡層的設計來說,對它進行分而治之的設計如圖1-10所示。

圖1-10 網絡層設計

圖1-10中,我們把網絡層拆分成HTTP、TCP-Socket、UDP這三種類型的形式,再對每個類型的具體接口進行拆分,對于拆分出來的每個接口,如果還不能直接使用,則再進行細致的拆分,直到拆分到可以具體實施為止。在圖1-10中,我們以接口的形式進行拆分,先將接口拆分成連接、斷開連接、發送數據、收到數據,以及(斷開、連接、終結)網絡事件,然后再對每個接口進行拆分,把接口需要處理的問題拆分出來各個擊破。

除了我們列舉的網絡層外,其他層級部分的框架也可以用同樣的方式進行分解,即用分而治之的方法逐個擊破每個模塊。下面描述了各個模塊的拆分原則。

·數據表:EXL導為二進制文件、JSON或其他格式,讀取接口和解析接口的定義。

·UI層:確定是使用NGUI還是UGUI,并針對界面基類、界面管理、輸入事件封裝進行選擇,且自定義通用組件基類和各類通用組件。

·外部資源管理:確定是否使用AssetBundle,是否對AssetBundle資源進行分類,是否依賴AssetBundle資源間的關系,是否加載與釋放AssetBundle的管理,是否加密AssetBundle。

·AI層:確定是使用狀態機還是行為樹或者其他,以及狀態機或行為樹接口的實現、AI可視化工具、AI擴展接口。

·地形地圖:包括地圖是2D的還是3D的,場景編輯器的結構是否需要網絡合并,場景內的大小物件區別對待,大地形在游戲里如何顯示,是否要劃分區塊。

·尋路與網格:確定是使用A星算法還是跳點算法或者其他算法;是使用網格柵格還是三角網格;是使用長距離尋路的解決方案還是地圖數據管理。

·常用庫:包括時間函數、數學函數、數字變量加密封裝、坐標轉換函數、Debug調試工具、各大邏輯系統通用工具等。

·角色行為控制:包括人物移動處理方案、攝像機的碰撞檢測、動畫特效編輯器、技能編輯器、行為流的建立。

·2D動畫控制:包括動畫組件封裝、2D動畫的制作流程、2D圖合并為圖集。

實際工作中,我們對層級和模塊逐個攻破的同時,也進入了架構演化模式。在一開始構建的架構中,某部分的設計可能并不十分合適,在后面的工作中我們需要對其逐步修復、完善甚至替換,這些都是演化的重要步驟。

在不斷完善架構的過程中,原本簡單抽象的架構開始復雜化。每個模塊都在有條不紊地演進,也會不斷冒出各種各樣不適應或者不符合實際需求的問題,我們需要及時跟進演化內容,包括剔除、重構、改善、修補前面由于各種原因而導致的錯誤。

最后應該注意架構設計的文檔要及時跟進完善,在抽象的過程中,我們需要整理和記錄整個過程,以便在今后完善架構時有途徑獲得前面在做決策時所考慮的各方面問題。

主站蜘蛛池模板: 西青区| 三原县| 潜山县| 北流市| 鹤庆县| 安西县| 正定县| 新源县| 浦北县| 吴桥县| 林周县| 郸城县| 德化县| 南木林县| 吴忠市| 奉新县| 柳林县| 尤溪县| 巴青县| 静海县| 娄烦县| 洪江市| 拉萨市| 高邮市| 崇阳县| 宜川县| 西安市| 策勒县| 稷山县| 阜宁县| 东山县| 靖江市| 常熟市| 怀仁县| 普兰县| 贺兰县| 辰溪县| 五河县| 方正县| 和平区| 佛教|