你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦。

大智:“小新,这周学习有没有遇到什么问题呢?”

小新:“确实遇到了,那个Addressables.LoadAssetsAsyncAPI,我有一次怎么都加载不出来资源,倒腾了半天,最后发现是参数传的不对。。。”

大智:“那你现在搞明白了没?”

小新:“基本搞明白了。。。”

大智:“那你把Addressable中的加载API总结一下吧~我看看你到底搞明白了没。”

小新:“好嘞。”

Addressable系统的加载资源API

Addressable中加载资源主要有两个途径:

  • 通过AssetReference加载
  • 使用Addressables类中的静态方法通过地址/Label加载

1.AssetReference加载的API

使用AssetReference类访问Addressable资产时无需知道他们的地址字符串,但是需要在Inspector上关联。使用流程如下:

  1. 新建一个脚本,任何可序列化的组件都支持AssetReference变量(例如,继承MonoBehaviour的脚本,ScriptableObject或其他可序列化的类)。
  2. 在组件中添加一个AssetReference类型的公共变量(例如public AssetReference explosion;)。
  3. 在Inspector中,将资产从“ Project”窗口拖到AssetReference字段上(非Addressable资产也可以拖,会自动标记为Addressable),或从项目中已经设置的可寻址资产的下拉列表中进行选择(如下所示)。

要加载或实例化AssetReference资产,需要调用其相应的方法。例如:

仅加载到内存中,多用于贴图、材质、动画、音频等资产:

[AssetReference的变量名].LoadAssetAsync<GameObject>();

直接实例化到场景中,一般用于Prefab:

[AssetReference的变量名].InstantiateAsync(pos, rot);

加载场景:

[AssetReference的变量名].LoadSceneAsync();

:这几个API都是异步操作,异步操作详解在大智的教程中有(洪流学堂公众号中回复addr可以获取),在这就不多说了。

2. 使用Addressables类中的静态方法通过地址/Label加载

Addressables类中有加载单个资源的API和多个资源的API。

加载单个资源

在脚本中使用字符串地址加载资产,先声明using UnityEngine.AddressableAssets;名称空间,然后调用以下方法:

仅加载到内存中,多用于贴图、材质、动画、音频等资产:

Addressables.LoadAssetAsync<GameObject>("AssetAddress");

加载完成后并不会将所需的资产实例化到场景中。要将资产添加到场景中,还需要一步:实例化。

还有一个加载和实例化二合一的接口,这个接口会加载资产,然后立即将其实例化到场景中:

Addressables.InstantiateAsync("AssetAddress");

这会将指定地址的资产实例化到场景中。

注意:上面的API是异步操作。你可以在资产完成加载后提供一个回调来使用资产,异步操作详解在大智的教程中有(洪流学堂公众号中回复addr可以获取),在这就不多说了。

using System.Collections;
using System.Collections.Generic;
using UnityEngine.AddressableAssets;
using UnityEngine;public class AddressablesExample : MonoBehaviour {GameObject myGameObject;void Start{Addressables.LoadAssetAsync<GameObject>("AssetAddress").Completed += OnLoadDone;}private void OnLoadDone(UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle<GameObject> obj){// In a production environment, you should add exception handling to catch scenarios such as a null result.myGameObject = obj.Result;}
}

一次加载多个资产

一次加载多个资产通常是使用Label加载。

如上图所示的分组策略,可以按如下方式加载HD的皮肤贴图。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;public class TextureController : MonoBehaviour
{public Renderer m_ReferencedMaterial;public void SwitchToHighDef(){LoadTexture("ArcherColor", "HD");}void LoadTexture(string key, string label){Addressables.LoadAssetsAsync<Texture2D>(new List<object> { key, label }, null, Addressables.MergeMode.Intersection).Completed+= TextureLoaded;}void TextureLoaded(AsyncOperationHandle<IList<Texture2D>> obj){m_ReferencedMaterial.material.mainTexture = obj.Result[0];}
}

在这一定要注意:LoadAssetsAsync有三个重载:

public static AsyncOperationHandle<IList<TObject>> LoadAssetsAsync<TObject>(object key, Action<TObject> callback);
public static AsyncOperationHandle<IList<TObject>> LoadAssetsAsync<TObject>(IList<object> keys, Action<TObject> callback, MergeMode mode);
public static AsyncOperationHandle<IList<TObject>> LoadAssetsAsync<TObject>(IList<IResourceLocation> locations, Action<TObject> callback);

通常我们使用前两种重载:

第一种:用于加载单个标签或地址。

第二种:用于加载地址+标签的形式。用第二种时一定要注意加上第三个参数MergeMode。否则重载匹配时就会去匹配第一个重载,会导致找不到资源。

MergeMode是什么呢?翻译过来是合并模式。

public enum MergeMode
{None = 0,UseFirst = 0,Union,Intersection
}

采用第二种重载加载时,其实会去先查询每一个地址/标签对应的资源,然后再根据MergeMode进行最终结果的计算。

举个栗子:

比如传入的参数是new List<object>{"cube", "red"},根据cube查询出来的资源有A、B、D,根据red查询出来的资源有C、D、E。

那么MergeMode是Node或UseFirst时,会取第一个key查询到的资源:A、B、D;

MergeMode是Union时,会取所有key查询到的资源的并集:A、B、C、D、E;

MergeMode是Intersection时,会取所有key查询到的资源的交集:D。


总结

大智:“看来这个LoadAssetsAsync就是你栽了的API吧?”

小新:“没错。”

大智:“之前我都有讲过哦,一定要注意这些细节。特别是方法有重载的时候,要注意查阅API文档或者阅读源码,不能想当然。”


《大话Unity2019》,大智带小新学Unity2019的有趣经历,让你学Unity更简单。

https://edu.hongliu.cc

Addressable系统的加载资源API总结相关推荐

  1. 【Android 插件化】基于插件化的恶意软件的加载策略分析 ( 自定义路径加载插件 | 系统路径加载插件 | 用户同意后加载插件 | 隐藏恶意插件 )

    文章目录 一.自定义路径加载插件 二.系统路径加载插件 三.用户同意后加载插件 四.隐藏恶意插件 一.自定义路径加载插件 插件化应用中 , 宿主应用 加载 插件 APK , 需要获取该插件 APK 文 ...

  2. iOS和tvOS游戏按需加载资源简介

    2019独角兽企业重金招聘Python工程师标准>>> 戴维营教育翻译:感谢Davis Allie的An Introduction to On-Demand Resources on ...

  3. Unity加载资源时的常用路径或文件夹

    加载资源或者下载资源时的常用路径,我们平常开发下用的是编辑器下的路径. 编辑器下使用的资源路径和Windows端打包后并没有什么区别.你在编辑器下写的资源路径代码,大概率是可以在Windows下无缝运 ...

  4. 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  5. java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

    java 根据类名示例化类 Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为Input ...

  6. 如何使用示例从Java中的类路径加载资源

    Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为InputStream或URL. 假设 ...

  7. p服务器不响应,无法加载资源:服务器响应状态为500

    这里我; m使用角度与mvc当我; m试图发送数据我收到错误如上所示,我也得到一些脚本errr无法加载资源:服务器响应状态为500 $scope.DeleteCustomer = function(l ...

  8. On-Demand Resources Guide中文版(按需加载资源--下)

    本文由唧唧歪歪翻译自Apple文档 On-Demand Resources Guide  该文档的上部分包含:按需加载资源基础以及创建和编辑tag两部分 (三)管理按需加载资源 下载和管理按需加载资源 ...

  9. 华为鸿蒙小插件,mate30pro鸿蒙系统无法加载时钟小部件

    [问题反馈] mate30pro鸿蒙系统无法加载时钟小部件 15937 电梯直达 huafen004964406 新学乍练 发表于 2021-3-12 07:10:53 来自:HUAWEI Mate ...

最新文章

  1. CSS代码重构与优化之路
  2. SDK使用xp风格控件
  3. java函數_函數(Java版)
  4. 3.关于QT中的MainWindow窗口,MenuBar,ToolBar,QuickTip等方面的知识点
  5. 此 sqltransaction 已完成;它再也无法使用_手把手教你如何修眉毛,学会再也不用花钱去美容院了...
  6. Python使用select实现异步通信
  7. python中如何追加_如何在Python中将元素添加到列表中-追加,扩展和插入
  8. LeetCode经典算法精解-字符串编辑距离
  9. postman接口测试如何发送json
  10. 安卓逆向助手反编译apk后文件夹为空
  11. SteamVR简介(Yanlz+Steam+VR+Unity+AR+MR+XR+立钻哥哥+==)
  12. 博客怎么写出好的文章吸引读者,只有7个基本的写作技巧
  13. Unsupported Modules Detected: Compilation is not supported for following modules: app, library. Unfo
  14. 10——Filter过滤器
  15. 6-25漏洞利用-irc后门利用
  16. CeisumLabApkServe--为CeisumLab工具下载地图,影像数据的.pak文件架设地图服务
  17. 计算机网络教研活动讨论,创新教研活动形式, 开展网络教研。是提高教师有效...
  18. SAP 技术原理搬砖 - ARAP重分类:为啥我和外币评估设计原理不一样?
  19. 爬虫(三)- 寻找周杰伦的歌单,json()
  20. OPC通讯的安全防护

热门文章

  1. 华为p10 鸿蒙,全面上线!华为鸿蒙新消息传来,这是要彻底替换安卓
  2. c替代if else_答应我,别再if/else走天下了可以吗
  3. python的knn算法list_【风马一族_Python】 实施kNN算法
  4. 依据imu姿态角计算z轴倾角_[姿态估计] DenseFusion详解
  5. python画图颜色表示大小变化_Python matplotlib减少色条标签的大小
  6. 解救电商大促没灵感的设计师|攻略模板奉上
  7. java中注释的嵌套,java – 使用mybatis注释获取嵌套对象
  8. ansys 内聚力模型_《ANSYS Workbench有限元分析实例详解(静力学)》,9787115446312
  9. 子网ip和子网掩码不匹配_【详解】你知道什么是IP路由查找的“最长匹配原则”吗?...
  10. 【R】数据框data.frame的基本操作【1】