15.根据资源定位信息加载资源

15.其他_资源加载相关_根据资源定位信息加载资源


15.1 知识点

回顾学过的加载可寻址资源的方式

  • 通过标识类进行加载(指定资源加载)
    • AssetReference.LoadAssetAsync<GameObject>();
  • 通过资源名或标签名加载单个资源(动态加载)
    • Addressables.LoadAssetAsync<GameObject>("Cube")
  • 通过资源名或标签名或两者组合加载多个资源(动态加载)
    • Addressables.LoadAssetsAsync<GameObject>(new List<string>() { "Cube", "SD" }, (obj) => { }, Addressables.MergeMode.Intersection);

加载资源时Addressables帮助我们做了哪些事情?

  • 主要做的事

    • 查找指定键的资源位置
    • 收集依赖项列表
    • 下载所需的所有远程AB包
    • 将AB包加载到内存中
    • 设置Result资源对象的值
    • 更新Status状态变量参数并且调用完成事件Completed
  • 如果加载成功Status状态为成功,并且可以从Result中得到内容

  • 如果加载失败除了Status状态为失败外,如果我们启用了AddressableAssetSettings配置的LogRuntimeExceptions选项吗,会在Console窗口打印信息

根据名字或者标签获取 资源定位信息 加载资源

Addressables.LoadResourceLocationsAsync 异步加载单Key资源定位信息

Addressables.LoadAssetAsync 传入ResourceLocation资源定位信息进行一步加载

// Addressables.LoadResourceLocationsAsync 异步加载资源定位信息 返回列表型handle
//参数一:资源名或者标签名
//参数二:资源类型
AsyncOperationHandle<IList<IResourceLocation>> asyncOperationHandle = Addressables.LoadResourceLocationsAsync("Cube", typeof(GameObject));
asyncOperationHandle.Completed += (handle) =>
{
    if (handle.Status == AsyncOperationStatus.Succeeded)
    {
        //handle.Result是所有满足条件的资源的资源定位信息列表
        foreach (var resourceLocation in handle.Result)
        {
            //我们可以利用定位信息 再去加载资源
            print(resourceLocation.PrimaryKey);//打印出资源名
            //根据资源定位信息异步加载资源
            Addressables.LoadAssetAsync<GameObject>(resourceLocation).Completed += (obj) => { Instantiate(obj.Result); };
        }
    }
    else
    {
        Addressables.Release(asyncOperationHandle);
    }
};

根据名字标签组合信息获取 资源定位信息 加载资源

Addressables.LoadResourceLocationsAsync 异步加载多Key资源定位信息

// Addressables.LoadResourceLocationsAsync 异步加载组合型资源定位信息 返回列表型handle
//参数一:资源名和标签名的组合
//参数二:合并模式
//参数三:资源类型
AsyncOperationHandle<IList<IResourceLocation>> asyncOperationHandle2 = Addressables.LoadResourceLocationsAsync(new List<string>() { "Cube", "Sphere", "SD" }, Addressables.MergeMode.Union, typeof(Object));
asyncOperationHandle2.Completed += (handle) =>
{
    if (handle.Status == AsyncOperationStatus.Succeeded)
    {
        //资源定位信息加载成功
        foreach (var resourceLocation in handle.Result)
        {
            //使用定位信息来加载资源
            //我们可以利用定位信息 再去加载资源
            print("******");
            print(resourceLocation.PrimaryKey);//资源名
            print(resourceLocation.InternalId);//资源路径
            print(resourceLocation.ResourceType.Name);//资源类型

            Addressables.LoadAssetAsync<Object>(resourceLocation).Completed += (obj) =>
            {
                //Instantiate(obj.Result);
            };
        }
    }
    else
    {
        Addressables.Release(asyncOperationHandle2);
    }
};

根据资源定位信息加载资源的注意事项

  • 资源信息当中提供了一些额外信息
    • PrimaryKey:资源主键(资源名)
    • InternalId:资源内部ID(资源路径)
    • ResourceType:资源类型(Type可以获取资源类型名)
      我们可以利用这些信息处理一些特殊需求
      比如加载多个不同类型资源时 可以通过他们进行判断再分别进行处理
  • 根据资源定位信息加载资源并不会加大我们加载开销
    只是分部完成加载了而已

15.2 知识点代码

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceLocations;
using UnityEngine.Serialization;

public class Lesson15_其他_资源加载相关_根据资源定位信息加载资源 : MonoBehaviour
{
    public AssetReference assetReference;
    
    void Start()
    {
        #region 知识点一 回顾学过的加载可寻址资源的方式

        //1.通过标识类进行加载(指定资源加载) AssetReference
        //2.通过资源名或标签名加载单个资源(动态加载)
        //Addressables.LoadAssetAsync<GameObject>("Cube")
        //3.通过资源名或标签名或两者组合加载多个资源(动态加载)
        //Addressables.LoadAssetsAsync<GameObject>(new List<string>() { "Cube", "SD" }, (obj) => { }, Addressables.MergeMode.Intersection);

        #endregion

        #region 知识点二 加载资源时Addressables帮助我们做了哪些事情?

        //1.查找指定键的资源位置
        //2.收集依赖项列表
        //3.下载所需的所有远程AB包
        //4.将AB包加载到内存中
        //5.设置Result资源对象的值
        //6.更新Status状态变量参数并且调用完成事件Completed

        //如果加载成功Status状态为成功,并且可以从Result中得到内容

        //如果加载失败除了Status状态为失败外
        //如果我们启用了 Log Runtime Exceptions选项 会在Console窗口打印信息

        #endregion

        #region 知识点三 根据名字或者标签获取 资源定位信息 加载资源

        // Addressables.LoadResourceLocationsAsync 异步加载资源定位信息 返回列表型handle
        //参数一:资源名或者标签名
        //参数二:资源类型
        AsyncOperationHandle<IList<IResourceLocation>> asyncOperationHandle = Addressables.LoadResourceLocationsAsync("Cube", typeof(GameObject));
        asyncOperationHandle.Completed += (handle) =>
        {
            if (handle.Status == AsyncOperationStatus.Succeeded)
            {
                //handle.Result是所有满足条件的资源的资源定位信息列表
                foreach (var resourceLocation in handle.Result)
                {
                    //我们可以利用定位信息 再去加载资源
                    print(resourceLocation.PrimaryKey);//打印出资源名
                    //根据资源定位信息异步加载资源
                    Addressables.LoadAssetAsync<GameObject>(resourceLocation).Completed += (obj) => { Instantiate(obj.Result); };
                }
            }
            else
            {
                Addressables.Release(asyncOperationHandle);
            }
        };

        #endregion

        #region 知识点四 根据名字标签组合信息获取 资源定位信息 加载资源

        // Addressables.LoadResourceLocationsAsync 异步加载组合型资源定位信息 返回列表型handle
        //参数一:资源名和标签名的组合
        //参数二:合并模式
        //参数三:资源类型
        AsyncOperationHandle<IList<IResourceLocation>> asyncOperationHandle2 = Addressables.LoadResourceLocationsAsync(new List<string>() { "Cube", "Sphere", "SD" }, Addressables.MergeMode.Union, typeof(Object));
        asyncOperationHandle2.Completed += (handle) =>
        {
            if (handle.Status == AsyncOperationStatus.Succeeded)
            {
                //资源定位信息加载成功
                foreach (var resourceLocation in handle.Result)
                {
                    //使用定位信息来加载资源
                    //我们可以利用定位信息 再去加载资源
                    print("******");
                    print(resourceLocation.PrimaryKey);//资源名
                    print(resourceLocation.InternalId);//资源路径
                    print(resourceLocation.ResourceType.Name);//资源类型

                    Addressables.LoadAssetAsync<Object>(resourceLocation).Completed += (obj) =>
                    {
                        //Instantiate(obj.Result);
                    };
                }
            }
            else
            {
                Addressables.Release(asyncOperationHandle2);
            }
        };

        #endregion

        #region 知识点五 根据资源定位信息加载资源的注意事项

        //1.资源信息当中提供了一些额外信息
        //  PrimaryKey:资源主键(资源名)
        //  InternalId:资源内部ID(资源路径)
        //  ResourceType:资源类型(Type可以获取资源类型名)
        //  我们可以利用这些信息处理一些特殊需求
        //  比如加载多个不同类型资源时 可以通过他们进行判断再分别进行处理

        //2.根据资源定位信息加载资源并不会加大我们加载开销
        //  只是分部完成加载了而已

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏