AssetBundle上層框架

被迫吃冰淇淋的小学生發表於2024-06-15

專案地址:

YuanJinSen/Demo: Ghost Runner (github.com)

原因

Unity自帶的AssetBundle擁有一個巨大的缺點:

比方說我只想要物體A,但A存在於一個巨大的AB包內,想載入A就必須下載一堆無關的東西。

因此有了該上層框架,可以做到,像Resource那樣去載入物體,我只載入A。

載入:

AssetBundle上層框架

解除安裝:

AssetBundle上層框架

整體邏輯

打包時:

視窗工具:呼叫Builder.Build

Builder:選擇平臺,初始化BuildSetting打包設定,蒐集打包物件,打包,回收多餘物件,將Manifest檔案打包

BuildSetting:根據策劃的配置進行路徑初始化和檔案蒐集,使用Directory.GetFiles獲取給資料夾下所有的檔案的Url,並存進HashSet<string> files中

Builder.Collect:根據上一步蒐集到的所有路徑進行操作/獲取檔案依賴,進行檔案分類/蒐集需要打的包/生成Manifest

  Resource:來自Dic<檔名,檔案型別>,將files所有物件存進去,並生成ResourceTxt、ResourceByte檔案

  Bundle:來自Dic<包路徑,List<包內容檔案>>,將包和包內容對應地存起來,並生成BundleTxt、BundleByte檔案

  Dependency:來自Dic<檔名,List<檔案依賴>>,將檔案和檔案依賴對應地存起來,並生成DependencyTxt、DependencyByte檔案

Builder.ClearAssetBundle:獲取所有打好的包,會有多餘的依賴包,將這些包回收

Builder.BuildManifest:打包ResourceByte、BundleByte、DependencyByte進一個AB包,用於初始化時讀取

初始化

某個Mono的Start:ResourceManager.Init()

ResourceManager:BundleManager.Init()

BundleManager:載入Manifest檔案,所有的包都是該包的依賴,後續所有的包都從該檔案中讀取

ResourceManager:讀取打包時最後一步打的Manifest包,將ResourceByte、BundleByte、DependencyByte解碼出來,並存起來

執行時:

發起者:呼叫ResourceManager.Load,傳遞Url

ResourceManager:new一個AResource用於存放資源,呼叫AResource.Load,傳遞Url

AResource:根據Url查詢AB包Url,並呼叫BundleManager.Load,傳遞AB包Url

BundleManager:new一個ABundle擁有存放AB包,呼叫AResource.Load,傳遞AB包Url

ABundle:根據AB包Url載入AB包,快取,透過BundleManager返回包給AResource

AResource:在ABundle中載入目標Url物件,快取,透過ResourceManager返回物件給發起者

--------------------------------------------------------------------------------------------------------------------------------------------------------

還有很多細節,比如說快取、解除安裝、依賴、非同步等等

相關文章