專案地址:
YuanJinSen/Demo: Ghost Runner (github.com)
原因
Unity自帶的AssetBundle擁有一個巨大的缺點:
比方說我只想要物體A,但A存在於一個巨大的AB包內,想載入A就必須下載一堆無關的東西。
因此有了該上層框架,可以做到,像Resource那樣去載入物體,我只載入A。
載入:
解除安裝:
整體邏輯
打包時:
視窗工具:呼叫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返回物件給發起者
--------------------------------------------------------------------------------------------------------------------------------------------------------
還有很多細節,比如說快取、解除安裝、依賴、非同步等等