Unity遊戲裡面的場景、模型、圖片等資源,是如何管理和載入的?
這就是本文要講的資源管理方式——bundle打包和載入。
圖片
Unity遊戲資源管理有很多方式:
(1)簡單遊戲比如demo,可以直接在scene場景中引用住相關資源,然後打出真機包即可。
(2)場景靜態引用資源過多會導致loding變慢,為了實現動態載入,加快場景載入速度,可以把資源放到Resources目錄下。
(3)但這樣還不行,因為沒法實現熱更新。實際專案大多使用的是AssetBundle,即AB打包方式。
熱更新後面再展開講,本文主要介紹下bundle打包和載入方案。
市面上有不同的AB打包方案和策略,這主要取決於遊戲具體情況,包括遊戲資源規模、遊戲型別等。大致講下幾種方案的優缺點:
(1)直接打包prefab和scene。
優點是不用關心資源依賴關係,直接對prefab或scene打包即可,unity會自動把其依賴資源都打進同一個包裡。缺點是造成資源冗餘,包體變大。
(2)收集prefab和scene的依賴資源,先對依賴資源打包,再對prefab和scene打包,同時維護依賴關係,載入時要用到。
而對依賴資源打包又有不同的策略:比如將依賴資源和prefab/scene打到同一個包;將每個依賴資源單獨打成一個個雜湊包;將被兩個以上其他資源依賴的公共資源單獨打一個包......
優點是可以定製適合遊戲專案的依賴資源打包策略,可以避免資源冗餘,減小包體;缺點是當依賴關係異常複雜時,可能會瘋,比如場景A的依賴prefab A1-A100,prefab A1-A100各自又依賴一堆資源,且互相存在資源重疊......而且在載入Bundle時可能會引起記憶體峰值爆炸。
(3)各個專案的黑科技方案,模擬Unity的資源管理。篇幅有限,且屬於進階內容,本文就不深入講了,有興趣的可以關注公眾號私聊或加微信。
這裡來看一下Unity的資源打包和載入實現Demo例子。
Demo需求:一個場景,3個shader,使用AB方式打包,並載入到安卓真機顯示。
(1)打包
首先,我們總共打2個AB包:shader單獨打一個AB包,場景單獨打一個AB包。Unity的打包API是BuildPipeline.BuildAssetBundles,打包程式碼如下:
圖片
然後就可以點選進行打包
圖片
打包結束之後,可以看到以下bundle,除了生成shaderbundle和scenebundle,還自動生成了與目錄同名的AB,以及每個bundle對應的manifest檔案。
圖片
其中AB.manifest記錄了本次打包的所有bundle資源及其依賴關係,該檔案可用於載入。可以看到scenebundle依賴shaderbundle。
圖片
其他兩個manifest檔案則是隻用於編輯器打包除錯輔助,包含每個bundle包含的asset資源、依賴的其他bundle資源。
圖片圖片
(2)載入
遊戲啟動之後顯示一個UI介面,自動載入shader資源。同時提供一個按鈕,點選之後載入場景。介面邏輯程式碼如下:
圖片
載入場景,應該先載入其依賴資源。上面我們知道場景依賴shader,所以這裡就跳過收集依賴關係的邏輯了。
先載入shader資源,這裡使用的是AssetBundle.LoadFromFileAsync這個Unity API。
圖片
然後載入場景資源。
圖片
(3)工程構建
最後打出apk真機包,可以使用編輯器構造。
圖片
最後生成如下apk包。即可安裝到真機。
圖片
最終結果如下:真機啟動遊戲,顯示介面。
圖片
點選按鈕,載入場景。完成。
圖片
本節內容就介紹到這裡,有問題歡迎留言或私聊~~~
歡迎關注我的微信公眾號【unity大話東遊】,更多的unity技術類和渲染類文章等著你哦!