Unity Addressables跨工程加載資源
工程配置
通過 輸出工程 進行資源打包,然後在 加載工程 中進行跨工程資源加載。需要對兩個工程進行以下設置:
- 在 Assets/AddressableAssetsData/AddressableAssetSettings.asset 文件的 Catalog 欄目中,啓用 Build Remote Catalog 選項,然後設置 Build Path 和 Load Path 屬性,兩個工程可以分別設置不同的 Build Path 和 Load Path 屬性。這兩個屬性可以使用C#的內插字符串語法。
- 在 加載工程 中創建和 輸出工程 的 Load Path 屬性值同名的文件夾,並將 輸出工程 的打包輸出文件複製到此文件夾中。如果文件夾路徑不能完全匹配,在進行跨工程資源加載時將會報錯:Exception encountered in operation Resource<IAssetBundleResource>(xxx.bundle): Invalid path in AssetBundleProvider: ‘xxx.bundle’. 。
加載資源的代碼
Catalog文件的路徑是 Load Path 文件夾下處於最高層的那個 catalog*.json 文件的路徑(子文件夾中也可能有 catalog*.json 文件)。
// 來自其他工程的Addressable資源的catalog*.json文件路徑
var catalogPath = @"D:\UnityProjects\AddressablesTest\Mods\mod_01\catalog_2020.03.09.05.54.27.json";
// 加載catalog,並在加載完成事件回調中進行資源加載
Addressables.LoadContentCatalogAsync(catalogPath).Completed += (resLocatorAopHandler) =>
{
// 要加載的資源
var assetKey = "Assets/ModAssets/Prefabs/cube_01.prefab";
// 可以直接進行全局查找並加載
//Addressables.InstantiateAsync(assetKey);
// 也可以只在本次加載的Catalog數據中查找並加載(理論上性能應該更好,沒有見到相關文檔)
if (resLocatorAopHandler.Result.Locate(assetKey, typeof(GameObject), out var locations))
{
var resourceLocation = locations[0];
Addressables.InstantiateAsync(resourceLocation);
}
};