Demo示例——Bundle打包和載入

unity大話東遊發表於2022-03-31

Unity遊戲裡面的場景、模型、圖片等資源,是如何管理和載入的?

這就是本文要講的資源管理方式——bundle打包和載入。

Demo示例——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,打包程式碼如下:

Demo示例——Bundle打包和載入圖片

然後就可以點選進行打包

Demo示例——Bundle打包和載入圖片

打包結束之後,可以看到以下bundle,除了生成shaderbundle和scenebundle,還自動生成了與目錄同名的AB,以及每個bundle對應的manifest檔案。

Demo示例——Bundle打包和載入圖片

其中AB.manifest記錄了本次打包的所有bundle資源及其依賴關係,該檔案可用於載入。可以看到scenebundle依賴shaderbundle。

Demo示例——Bundle打包和載入圖片

其他兩個manifest檔案則是隻用於編輯器打包除錯輔助,包含每個bundle包含的asset資源、依賴的其他bundle資源。

Demo示例——Bundle打包和載入圖片Demo示例——Bundle打包和載入圖片

 

(2)載入

遊戲啟動之後顯示一個UI介面,自動載入shader資源。同時提供一個按鈕,點選之後載入場景。介面邏輯程式碼如下:

Demo示例——Bundle打包和載入圖片

載入場景,應該先載入其依賴資源。上面我們知道場景依賴shader,所以這裡就跳過收集依賴關係的邏輯了。

先載入shader資源,這裡使用的是AssetBundle.LoadFromFileAsync這個Unity API。

Demo示例——Bundle打包和載入圖片

然後載入場景資源。

Demo示例——Bundle打包和載入圖片

 

(3)工程構建

最後打出apk真機包,可以使用編輯器構造。

Demo示例——Bundle打包和載入圖片

最後生成如下apk包。即可安裝到真機。

Demo示例——Bundle打包和載入圖片

 

 

最終結果如下:真機啟動遊戲,顯示介面。

Demo示例——Bundle打包和載入圖片

點選按鈕,載入場景。完成。

Demo示例——Bundle打包和載入圖片

 

本節內容就介紹到這裡,有問題歡迎留言或私聊~~~

歡迎關注我的微信公眾號【unity大話東遊】,更多的unity技術類和渲染類文章等著你哦!

Demo示例——Bundle打包和載入

相關文章