Addressable繼承了assetbundle 在unity2017之后官方開發的資源驗證流程,做到在游戲運行中讀取和更新資源不用關心bundle以及hash。
不是初級教程,初級教程網上很多,這里算是補全一些使用的重點和細節
addressable group 這個工具 去bilibili看教程 很快就會了,這里主要是筆者自己的使用心得
快速入門
Addressables.InitializeAsync; 初始化
Addressables.CheckForCatalogUpdates;檢查網絡端的資源表
Addressables.UpdateCatalogs 下載對應資源表
Addressables.GetDownloadSizeAsync 檢查要下載的資源所在的bundle還有依賴的bunlde的大小
Addressables.DownloadDependenciesAsync 下載資源和依賴的bundle
Addressables. LoadAssetAsync 從加載資源(具體資源同步流程看資源表章節)
AssetReference 可以直接用於選擇加入addressable groups里的物體
簡單的資源加載和更新函數都列出來了,其他unload的資源管理的自己琢磨把,我也沒琢磨過。
下面是Addressable的新特性
Catalogs 資源表
Addressable好在catalogs,也難在catalogs, catalogs很重要,所有資源都圍着catalogs.
基本上如果出現了難以理解的錯誤,不是catalogs和資源對不上,就是catalogs沒下到。
官方將bundle的hash還有bundle里的依賴全寫在catalogs里。
Catalogs是一張資源表,它在你build bundle的時候創建,對整個Addressable極為重要.
游戲在用Addressable加載資源的時候會根據資源地址檢測資源在哪個bundle,然后看看當前bundle是否存在,不存在就上網下,然后檢查bundle自身的hash直和catalogs里的是否一致,一致就直接讀取本地資源,不一致就上網下,下不到就報錯,你有老資源也不會讀取。它只認資源表
當你打開build remote catalogs,就支持了網絡更新資源表。
而不打開build remote catalogs, 可以下網絡的資源但是不能熱更,這里說的是出包的之后,就只能通過本地的catalogs下載固定的資源,並且下的時候還會校對hash,crc,你替換資源也沒用,嘗試關閉hash,crc會出錯。所以不用想着用addressable系統去更新資源表里沒有的資源了,要想那么做,只能另外用assetbundle
如果你不激活disable catalog update on startup,那么每當你第一次初始化Addressable. InitializeAsync 的時候,(如果你不調用 InitalizeAsync,那你用Addressable的任意功能依然都會自動初始化)會自動上網拉取資源表,如果你關閉自動拉取,那么你得用CheckForCatalogUpdates和UpdateCatalogs去主動下載資源表。
依賴
GetDownloadSizeAsync和DownloadDependenciesAsync 里面參數是具體的資源地址而不是bundle的組名,網上教程都沒說清楚。
如果本地有依賴對應的資源,就算再其他bundle里,也不用你去主動去管理。直接實例化就行
但是,如果那些依賴在本地沒有資源,你不使用DownloadDependenciesAsync無法自動下載其他依賴的bundle
DownloadDependenciesAsync多次使用也沒效果,本地資源表和資源對的上它不會下東西
Build Bundle的時候會自動將需要依賴的次級資源加入到對應的bundle里,比如,如果你一個group里有個cube.prefab,cube上有材質球和貼圖,而你並沒有將材質球和題圖加入到bundle列表里。它打包的時候會自動將材質球和貼圖加進去。如果你材質球和貼圖已經在其他bundle group里了,那么不會重復,資源永遠只有一份。所以你需要DownloadDependenciesAsync確保所有依賴的bundle都在本地。
熱更新
熱更新需要用到check for content update resdriction,你每次build bundle的時候它都會更新,當你需要熱更新的時候,使用check for content update resdriction, 去選一個bin文件,它會告訴你相對上一次的改動,是否有本地資源在列,然后自動把本地資源提出來新建一個組,這時候你不用build,build是完全重新構建,你需要增量更新 update previous build 去選那個bin文件。運行一下它會打增量包。
實例化
不要直接InstantiateAsync 要先load出來再instantiate,不要因為異步的關系,有可能導致你關掉運行模式回到編輯模式后,實例化依然再繼續,然后就出現在你場景里了
Bug:1.7.4資源表如果開遠程,那么就算設定了初始化不檢測,依然會連一次網絡檢測;
DownloadDependenciesAsync 有時候速度太快 它的task會變空,在await導致報錯,要處理一下。