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);
}
};