2024-12-06 Unity Addressables3——资源加载

文章目录

  • 1 引用加载
    • 1.1 Addressables 的资源引用类
    • 1.2 加载资源
    • 1.3 加载场景
    • 1.4 释放资源
  • 2 Label 介绍
  • 3 动态加载
    • 3.1 加载单个资源
    • 3.2 加载多个资源

  • Unity 版本:6000.0.26f1c1
  • Addressables 版本:2.3.1

1 引用加载

1.1 Addressables 的资源引用类

  • AssetReference:通用资源引用类,可加载任意类型资源。
  • AssetReferenceAtlasedSprite:图集资源引用类。
  • AssetReferenceGameObject:游戏对象资源引用类。
  • AssetReferenceSprite:精灵图片资源引用类。
  • AssetReferenceTexture:贴图资源引用类。
  • AssetReferenceT<>:指定类型引用类。

​ 通过申明不同类型引用类对象,可以在 Inspector 窗口中筛选关联的 Addressables 对象。

public class Lesson3 : MonoBehaviour
{public AssetReference              AssetReference;public AssetReferenceAtlasedSprite AssetReferenceAtlasedSprite;public AssetReferenceGameObject    AssetReferenceGameObject;public AssetReferenceSprite        AssetReferenceSprite;public AssetReferenceTexture       AssetReferenceTexture;public AssetReferenceT<AudioClip>                 AssetReferenceTAudioClip;public AssetReferenceT<RuntimeAnimatorController> AssetReferenceTRuntimeAnimatorController;public AssetReferenceT<TextAsset>                 AssetReferenceTTextAsset;public AssetReferenceT<Material>                  AssetReferenceTMaterialRed;public AssetReference                             AssetReferenceTScene;
}
image-20241206164715350

1.2 加载资源

注意:所有 Addressables 加载相关都使用异步加载。

需要引用命名空间:using UnityEngine.ResourceManagement.AsyncOperations;

public class Lesson3 : MonoBehaviour
{public AssetReference AssetReference;...// Start is called once before the first execution of Update after the MonoBehaviour is createdvoid Start(){// 1. 使用异步操作句柄AsyncOperationHandle<GameObject> handle = assetReference.LoadAssetAsync<GameObject>();handle.Completed += TestFun;// 2. 简化写法AssetReference.LoadAssetAsync<GameObject>().Completed += handle =>{// 判断是否加载成功// 建议使用传入参数if (handle.Status == AsyncOperationStatus.Succeeded){var obj = Instantiate(handle.Result);obj.name = "Loaded GameObject";}// 不建议使用标识类创建// if(assetReference.IsDone)// {//    Instantiate(assetReference.Asset);// }};}private void TestFun(AsyncOperationHandle<GameObject> handle){// 加载成功后,使用加载的资源嘛// 判断是否加载成功if(handle.Status == AsyncOperationStatus.Succeeded){Instantiate(handle.Result);}}
}

1.3 加载场景

public class Lesson3 : MonoBehaviour
{public AssetReference AssetReferenceTScene; // 需要引用 Scene 资源...// Start is called once before the first execution of Update after the MonoBehaviour is createdvoid Start(){AssetReferenceTScene.LoadSceneAsync().Completed += (handle) =>{// 初始化场景的一些信息print("场景加载结束");};}
}

1.4 释放资源

        AssetReference.ReleaseAsset();

  1. 释放资源方法后,资源引用类中的资源会置空,但是 AsyncOperationHandle 类中的对象不为空。
  2. 释放资源不会影响场景中被实例化出来的对象,但是会影响使用的资源。
public class Lesson3 : MonoBehaviour
{public AssetReference AssetReference;...// Start is called once before the first execution of Update after the MonoBehaviour is createdvoid Start(){AssetReference.LoadAssetAsync<GameObject>().Completed += handle =>{if (handle.Status == AsyncOperationStatus.Succeeded){var obj = Instantiate(handle.Result);obj.name = "Loaded GameObject";// 加载完成后,释放资源AssetReference.ReleaseAsset();Debug.Log(handle.Result == null);        // falseDebug.Log(AssetReference.Asset == null); // true}};}
}

2 Label 介绍

​ 引用加载必须在脚本中声明各种引用类来指定加载的资源,不够灵活,只适合做一些小项目。

​ 实际商业项目开发中,很多时候根据配置文件决定加载的资源,即动态加载。

​ 通过给定名称和标签,来加载指定资源。

image-20241206170645705

Label 作用举例:

  1. 游戏装备中有一顶帽子:Hat,拥有不同的品质,比如:红、绿、白、蓝。

    通过标签 Label 来区分,Label 分别是:Red、Green、White、Blue。

  2. 游戏中根据设备好坏选择不同质量的图片或者模型,比如:高清、标清、超清。

    但在不同标准下,这些模型的命名应该是相同的,Label 分别是:HD、SD、FHD。

  3. 游戏中逢年过节时更换模型和 UI 显示,比如:中秋节、春节、圣诞节。

    不同节日时角色或者 UI 等资源看起来是不同的,但资源的命名应该都遵循同样的规范。

    比如登录面板,在中秋节、春节、圣诞节时它的资源名都是登录面板,Label 分别可以是:MidAutumn、Spring、Christmas。

3 动态加载

  • 命名空间:

    UnityEngine.AddressableAssets

    UnityEngine.ResourceManagement.AsyncOperations

​ 以下是打包示例:

image-20241206172212626

3.1 加载单个资源

(1)通过资源名或标签名动态加载单个资源

​        public static AsyncOperationHandle<TObject> LoadAssetAsync<TObject>(object key);

注意:

  1. 如果存在同名或同标签的同类型资源,会自动加载第一个满足条件的对象。
  2. 如果存在同名或同标签的不同类型资源,可以根据泛型类型来决定加载哪一个。

​ 以加载标签为 “Red” 的 GameObject 资源为例:

public class Lesson5 : MonoBehaviour
{// Start is called once before the first execution of Update after the MonoBehaviour is createdvoid Start(){Addressables.LoadAssetAsync<GameObject>("Red").Completed += handle =>{if (handle.Status == AsyncOperationStatus.Succeeded){Instantiate(handle.Result);}};}
}

​ 以加载名称为 “Red” 的 GameObject 资源为例:

public class Lesson5 : MonoBehaviour
{// Start is called once before the first execution of Update after the MonoBehaviour is createdvoid Start(){Addressables.LoadAssetAsync<GameObject>("Cube").Completed += handle =>{if (handle.Status == AsyncOperationStatus.Succeeded){Instantiate(handle.Result);}};}
}

(2)动态加载场景

public static AsyncOperationHandle<SceneInstance> LoadSceneAsync(

​        object key,

        LoadSceneMode loadMode = LoadSceneMode.Single,

        bool activateOnLoad = true,

​        int priority = 100,

​        SceneReleaseMode releaseMode = SceneReleaseMode.ReleaseSceneWhenSceneUnloaded

);

  • key:场景名。
  • loadMode:加载模式。
    • LoadSceneMode.Single:单独加载,只保留新加载的场景;
    • LoadSceneMode.Additive:叠加加载,两个场景一起显示(不常用)。
  • activateOnLoad:场景加载是否激活。如果为 false,加载完成后不会直接切换,需要自己使用返回值中的 ActivateAsync 方法。
  • priority:场景加载的异步操作优先级。
  • releaseMode:释放模式。
    • SceneReleaseMode.ReleaseSceneWhenSceneUnloaded:卸载场景时释放;
    • SceneReleaseMode.OnlyReleaseSceneOnHandleRelease:手动释放。

​ 例如,加载 SampleScene 场景并手动激活:

public class Lesson5 : MonoBehaviour
{// Start is called once before the first execution of Update after the MonoBehaviour is createdvoid Start(){Addressables.LoadSceneAsync("SampleScene", LoadSceneMode.Single, false, 100).Completed += (obj) =>{// 手动激活场景obj.Result.ActivateAsync();};}
}

(3)释放资源

        public static void Release<TObject>(AsyncOperationHandle<TObject> handle)

​ 释放资源时,需要记录加载后的 Handle。

public class Lesson5 : MonoBehaviour
{public AsyncOperationHandle<GameObject> Handle;// Start is called once before the first execution of Update after the MonoBehaviour is createdvoid Start(){Handle = Addressables.LoadAssetAsync<GameObject>("Cube");Handle.Completed += operationHandle =>{if (operationHandle.Status == AsyncOperationStatus.Succeeded){Instantiate(operationHandle.Result);// 加载完成后,释放资源Addressables.Release(Handle);}};}
}

注意:

​ 一定要保证资源使用完毕过后再释放资源。

​ 建议将 Play Mode Script 改为 “Use Existing Build” 测试,因为 “Use Asset Database” 模式下,不会真正地从 AB 包释放资源。

image-20241206173338294

3.2 加载多个资源

(1)重载一

public static AsyncOperationHandle<IList<TObject>> LoadAssetsAsync<TObject>(

        object key,

        Action<TObject> callback,

        bool releaseDependenciesOnFailure

);

  • key:资源名或标签名。
  • callback:每个加载资源结束后会调用的函数,会把加载到的资源传入该函数中。
  • releaseDependenciesOnFailure:为 true,当资源加载失败时自动将已加载的资源和依赖释放;为 false,需要自己手动来管理释放。
public class Lesson6 : MonoBehaviour
{// Start is called once before the first execution of Update after the MonoBehaviour is createdvoid Start(){var handle = Addressables.LoadAssetsAsync<GameObject>("Red", obj =>{// (1):应用于每个 GameObject,与 (2) 等价Debug.Log(obj.name);}, true);// (2):遍历 GameObject 列表,与 (1) 等价handle.Completed += (obj) =>{foreach (var o in obj.Result){Debug.Log(o.name);}};}
}

(2)重载二

public static AsyncOperationHandle<IList<TObject>> LoadAssetsAsync<TObject>(

        IEnumerable keys,

        Action<TObject> callback,

        MergeMode mode,

        bool releaseDependenciesOnFailure

);

  • keys:想要加载资源的条件列表(资源名、Lable 名)。

  • callback:每个加载资源结束后会调用的函数,会把加载到的资源传入该函数中。

  • mode:可寻址的合并模式,用于合并请求结果的选项。

    如果键 “Cube”、“Red” 分别对应结果 [1, 2, 3]、[1, 3, 4](数字代表不同的资源):

    • MergeMode.None:不发生合并,将使用第一组结果 结果为 [1, 2, 3];
    • MergeMode.UseFirst:应用第一组结果,结果为 [1, 2, 3];
    • MergeMode.Union:合并所有结果,结果为 [1, 2, 3, 4];
    • MergeMode.Intersection:使用相交结果,结果为 [1, 3]。
  • releaseDependenciesOnFailure:为 true,当资源加载失败时自动将已加载的资源和依赖释放;为 false,需要自己手动来管理释放。

public class Lesson6 : MonoBehaviour
{// Start is called once before the first execution of Update after the MonoBehaviour is createdvoid Start(){Addressables.LoadAssetsAsync<Object>(new[] { "Cube", "Red" },obj => { Debug.Log(obj.name); }, // 打印结果:"Cube"Addressables.MergeMode.Intersection,true);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

相机动态/在线标定

图1 图2 基本原理 【原理1】平行线在射影变换后会交于一点。如图所示,A为相机光心,蓝色矩形框为归一化平面,O为平面中心。地面四条黄色直线为平行且等距的车道线。HI交其中两条车道线于H、I, 过G作HI的平行线GM交车道线于M。HI、GM在归一化平面上的投影分别为JK、PN,二者会…

工作:SolidWorks从3D文件导出2D的DWG或DXF类型文件方法

工作&#xff1a;SolidWorks从3D文件导出2D的DWG或DXF类型文件方法 SolidWorks从3D文件导出2D的DWG或2D DXF类型文件方法&#xff08;一&#xff09;打开3D文件&#xff08;二&#xff09;从装配体到工程图&#xff08;三&#xff09;拖出想要的角度的图型&#xff08;四&#…

【AI系统】低比特量化原理

低比特量化原理 计算机里面数值有很多种表示方式&#xff0c;如浮点表示的 FP32、FP16&#xff0c;整数表示的 INT32、INT16、INT8&#xff0c;量化一般是将 FP32、FP16 降低为 INT8 甚至 INT4 等低比特表示。 模型量化则是一种将浮点值映射到低比特离散值的技术&#xff0c;可…

【ETCD】【源码阅读】ETCD启动流程源码解读

启动流程的图如下&#xff1a; 1、主函数入口 ETCD 启动的入口在 etcd/server/main.go 文件中。 package mainimport ("os""go.etcd.io/etcd/server/v3/etcdmain" )func main() {etcdmain.Main(os.Args) }这里调用了 etcdmain.Main()&#xff0c;这是 …

计算机网络-应用层/运输层

应用层 在上一篇已经提到过, 计算机网络, 最核心的功能就是个产生信息, 发送信息.而并不关注其中的接受方究竟是人, 机器. 而协议, 就是双方约定的 可以表达一定含义的 消息内容. 符合协议的, 就能够被机器解读, 并进行下一步操作, 可能还会返回一定的响应内容. 而应用层, 有…

AD20 原理图库更新到原理图

一 点击工具&#xff0c;从库更新。快捷键TL 二 点击完成 三 执行变更&#xff0c;最后点击关闭

位运算符I^~

&运算&#xff1a;上下相等才是1&#xff0c;有一个不同就是0 |运算&#xff1a;只要有1返回的就是1 ^(亦或)运算&#xff1a;上下不同是1&#xff0c;相同是0 ~运算&#xff1a;非运算&#xff0c;与数据全相反 cpu核心运算原理&#xff0c;四种cpu底层小电路 例&#xf…

Python毕业设计选题:基于django的民族服饰数据分析系统的设计与实现_hadoop+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 民族服饰管理 看板展示 系统首页 民族服饰 服饰…

mac port 安装redis 并设置为系统服务 自定义配置方法

mac系统中&#xff0c;port 包管理工具比brew的速度快N倍&#xff0c;今天就给大家分享一下在macos系统中如何使用 port安装 redis数据库并配置为服务自动启动和自定义redis.conf配置的方法。 1. 安装redis sudo port install redis 2. 启动redis服务 sudo port load redis …

MySQL导入.sql文件后数据库乱码问题

问题分析&#xff1a; 当导入.sql文件后&#xff0c;发现数据库中的备注出现乱码&#xff0c;通常是由于一下原因导致&#xff1a; 字符集不匹配&#xff1a;.sql文件、MySQL服务器、客户端连接使用的字符集不一致。备注内容编码问题&#xff1a;备注内容本身的编码格式与数据…

RabbitMQ 架构介绍:深入理解与应用

RabbitMQ 是一个开源的消息代理&#xff08;Message Broker&#xff09;软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xff0c;并提供了可靠的消息传递机制。RabbitMQ 广泛应用于分布式系统中&#xff0c;用于解耦系统组件、异步处理任务和实现消…

【西门子PLC.博途】——在S71200里写时间设置和读取功能块

之前我们在这篇文章中介绍过如何读取PLC的系统时间。我们来看看在西门子1200里面有什么区别。同时也欢迎关注gzh。 我们在S71200的帮助文档中搜索时间后找到这个数据类型 在博途中他是一个结构体&#xff0c;具体为 然后我们再看看它带的读取和写入时间块 读取时间&#xff1…

vue聊天对话语音消息播放动态特效

vue2写法&#xff0c;vue3也能用&#xff0c;粘之即走&#xff1a; 示例&#xff1a; <template><div class"voice-hidden"><divclass"voice-play-chat":class"[className, { animate-stop: !isPlaying }]"><div class&q…

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

【链表】力扣 141. 环形链表

一、题目 二、思路 龟兔进行赛跑 龟的速度是 1&#xff0c;兔的速度是 2龟兔从同一起点出发&#xff0c;若 龟追上兔 则说明 有环 存在&#xff1b;若追不上&#xff0c;则说明无环。 三、代码 /*** Definition for singly-linked list.* class ListNode {* int val;* …

Spring中使用Async进行异步功能开发实战-以大文件上传为例

目录 前言 一、场景再现 1、Event的同步机制 二、性能优化 1、异步支持配置 2、自定义处理线程池扩展 3、将线程池配置类绑定到异步方法 三、总结 前言 在之前的博客中&#xff0c;曾将讲了在SpringBoot中如何使用Event来进行大文件上传的解耦&#xff0c;原文地址&am…

PyTorch 深度学习框架简介:灵活、高效的 AI 开发工具

PyTorch 深度学习框架简介&#xff1a;灵活、高效的 AI 开发工具 PyTorch 作为一个深度学习框架&#xff0c;以其灵活性、可扩展性和高效性广受欢迎。无论是在研究领域进行创新实验&#xff0c;还是在工业界构建生产级的深度学习模型&#xff0c;PyTorch 都能提供所需的工具和…

Qt 2D绘图之五:图形视图框架的结构、坐标系统和框架间的事件处理与传播

参考文章链接: Qt 2D绘图之五:图形视图框架的结构和坐标系统 Qt 2D绘图之六:图形视图框架的事件处理与传播 图形视图框架的结构 在前面讲的基本绘图中,我们可以自己绘制各种图形,并且控制它们。但是,如果需要同时绘制很多个相同或不同的图形,并且要控制它们的移动、…

Qt开发技巧(二十四)滚动部件的滑动问题,Qt设置时区问题,自定义窗体样式不生效问题,编码格式问题,给按钮左边加个图,最小化后的卡死假象

继续记录一些Qt开发中的技巧操作&#xff1a; 1.滚动部件的滑动问题 再Linux嵌入式设备上&#xff0c;有时候一个页面的子部件太多&#xff0c;一屏放不下是需要做页面滑动&#xff0c;可以使用“QScrollArea”控件&#xff0c;拖来一个“QScrollArea”控件&#xff0c;将子部件…

基于yolov4深度学习网络的排队人数统计系统matlab仿真,带GUI界面

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 在现代社会…