Addressable系统的加载资源API总结
你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦。
大智:“小新,这周学习有没有遇到什么问题呢?”
小新:“确实遇到了,那个Addressables.LoadAssetsAsync
API,我有一次怎么都加载不出来资源,倒腾了半天,最后发现是参数传的不对。。。”
大智:“那你现在搞明白了没?”
小新:“基本搞明白了。。。”
大智:“那你把Addressable中的加载API总结一下吧~我看看你到底搞明白了没。”
小新:“好嘞。”
Addressable系统的加载资源API
Addressable中加载资源主要有两个途径:
- 通过AssetReference加载
- 使用Addressables类中的静态方法通过地址/Label加载
1.AssetReference加载的API
使用AssetReference
类访问Addressable资产时无需知道他们的地址字符串,但是需要在Inspector上关联。使用流程如下:
- 新建一个脚本,任何可序列化的组件都支持
AssetReference
变量(例如,继承MonoBehaviour的脚本,ScriptableObject或其他可序列化的类)。 - 在组件中添加一个
AssetReference
类型的公共变量(例如public AssetReference explosion;
)。 - 在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总结相关推荐
- 【Android 插件化】基于插件化的恶意软件的加载策略分析 ( 自定义路径加载插件 | 系统路径加载插件 | 用户同意后加载插件 | 隐藏恶意插件 )
文章目录 一.自定义路径加载插件 二.系统路径加载插件 三.用户同意后加载插件 四.隐藏恶意插件 一.自定义路径加载插件 插件化应用中 , 宿主应用 加载 插件 APK , 需要获取该插件 APK 文 ...
- iOS和tvOS游戏按需加载资源简介
2019独角兽企业重金招聘Python工程师标准>>> 戴维营教育翻译:感谢Davis Allie的An Introduction to On-Demand Resources on ...
- Unity加载资源时的常用路径或文件夹
加载资源或者下载资源时的常用路径,我们平常开发下用的是编辑器下的路径. 编辑器下使用的资源路径和Windows端打包后并没有什么区别.你在编辑器下写的资源路径代码,大概率是可以在Windows下无缝运 ...
- 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- java 根据类名示例化类_如何使用示例从Java中的类路径加载资源
java 根据类名示例化类 Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为Input ...
- 如何使用示例从Java中的类路径加载资源
Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为InputStream或URL. 假设 ...
- p服务器不响应,无法加载资源:服务器响应状态为500
这里我; m使用角度与mvc当我; m试图发送数据我收到错误如上所示,我也得到一些脚本errr无法加载资源:服务器响应状态为500 $scope.DeleteCustomer = function(l ...
- On-Demand Resources Guide中文版(按需加载资源--下)
本文由唧唧歪歪翻译自Apple文档 On-Demand Resources Guide 该文档的上部分包含:按需加载资源基础以及创建和编辑tag两部分 (三)管理按需加载资源 下载和管理按需加载资源 ...
- 华为鸿蒙小插件,mate30pro鸿蒙系统无法加载时钟小部件
[问题反馈] mate30pro鸿蒙系统无法加载时钟小部件 15937 电梯直达 huafen004964406 新学乍练 发表于 2021-3-12 07:10:53 来自:HUAWEI Mate ...
最新文章
- CSS代码重构与优化之路
- SDK使用xp风格控件
- java函數_函數(Java版)
- 3.关于QT中的MainWindow窗口,MenuBar,ToolBar,QuickTip等方面的知识点
- 此 sqltransaction 已完成;它再也无法使用_手把手教你如何修眉毛,学会再也不用花钱去美容院了...
- Python使用select实现异步通信
- python中如何追加_如何在Python中将元素添加到列表中-追加,扩展和插入
- LeetCode经典算法精解-字符串编辑距离
- postman接口测试如何发送json
- 安卓逆向助手反编译apk后文件夹为空
- SteamVR简介(Yanlz+Steam+VR+Unity+AR+MR+XR+立钻哥哥+==)
- 博客怎么写出好的文章吸引读者,只有7个基本的写作技巧
- Unsupported Modules Detected: Compilation is not supported for following modules: app, library. Unfo
- 10——Filter过滤器
- 6-25漏洞利用-irc后门利用
- CeisumLabApkServe--为CeisumLab工具下载地图,影像数据的.pak文件架设地图服务
- 计算机网络教研活动讨论,创新教研活动形式, 开展网络教研。是提高教师有效...
- SAP 技术原理搬砖 - ARAP重分类:为啥我和外币评估设计原理不一样?
- 爬虫(三)- 寻找周杰伦的歌单,json()
- OPC通讯的安全防护
热门文章
- 华为p10 鸿蒙,全面上线!华为鸿蒙新消息传来,这是要彻底替换安卓
- c替代if else_答应我,别再if/else走天下了可以吗
- python的knn算法list_【风马一族_Python】 实施kNN算法
- 依据imu姿态角计算z轴倾角_[姿态估计] DenseFusion详解
- python画图颜色表示大小变化_Python matplotlib减少色条标签的大小
- 解救电商大促没灵感的设计师|攻略模板奉上
- java中注释的嵌套,java – 使用mybatis注释获取嵌套对象
- ansys 内聚力模型_《ANSYS Workbench有限元分析实例详解(静力学)》,9787115446312
- 子网ip和子网掩码不匹配_【详解】你知道什么是IP路由查找的“最长匹配原则”吗?...
- 【R】数据框data.frame的基本操作【1】