Unity Addressables跨工程加载资源

Unity Addressables跨工程加载资源

工程配置

通过 输出工程 进行资源打包,然后在 加载工程 中进行跨工程资源加载。需要对两个工程进行以下设置:

  1. Assets/AddressableAssetsData/AddressableAssetSettings.asset 文件的 Catalog 栏目中,启用 Build Remote Catalog 选项,然后设置 Build PathLoad Path 属性,两个工程可以分别设置不同的 Build PathLoad Path 属性。这两个属性可以使用C#的内插字符串语法。
    “加载工程”的配置
    “输出工程”的配置
  2. 加载工程 中创建和 输出工程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);
    }
};
发布了76 篇原创文章 · 获赞 131 · 访问量 39万+

猜你喜欢

转载自blog.csdn.net/qq_21397217/article/details/104752829