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.rhkb.cn/news/487826.html

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

相关文章

详解RabbitMQ在Ubuntu上的安装

​​​​​​​ 目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 ​编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…

`yarn list --pattern element-ui` 是一个 Yarn 命令,用于列出项目中符合指定模式(`element-ui`)的依赖包信息

文章目录 命令解析&#xff1a;功能说明&#xff1a;示例输出&#xff1a;使用场景&#xff1a; yarn list --pattern element-ui 是一个 Yarn 命令&#xff0c;用于列出项目中符合指定模式&#xff08; element-ui&#xff09;的依赖包信息。 命令解析&#xff1a; yarn list…

IO进程 学习笔记

……接上文 fputs&#xff08;输入字符串&#xff09; int fputs(const char *s, FILE *stream);功能&#xff1a;向指定文件中输入一串字符参数&#xff1a;s:输入字符串的首地址stream&#xff1a;文件流指针返回值&#xff1a;成功返回输出字符个数失败返回EOF文件指针偏移函…

Ubuntu压缩打包解压

ubuntu压缩打包 上图&#xff0c;压缩当前目录svn 为svn.tar.gaz&#xff0c;解压后再当前解压目录生成svn文件 在Ubuntu中&#xff0c;你可以使用tar命令来创建一个压缩包&#xff0c;或者使用zip命令来创建一个.zip压缩文件。以下是两种常见的压缩方法&#xff1a; 下图&am…

支付宝租赁小程序助力便捷生活新方式

内容概要 支付宝租赁小程序为现代人带来了许多惊喜&#xff0c;它不仅仅是一个简单的租赁平台&#xff0c;更是生活中不可或缺的好帮手。想象一下&#xff0c;无论你缺少什么&#xff0c;从工具到家居用品&#xff0c;只需轻轻一点&#xff0c;便能轻松找到需要的物品。这个小…

springboot413福泰轴承股份有限公司进销存系统(论文+源码)_kaic

摘 要 使用旧方法对福泰轴承股份有限公司进销存系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在福泰轴承股份有限公司进销存系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不…

y3编辑器文档3:物体编辑器

文章目录 一、物体编辑器简介1.1 界面介绍1.2 复用(导入导出)1.3 收藏夹(项目资源管理)1.4 对象池二、单位2.1 数据设置2.2 表现设置2.3 单位势力和掉率设置2.4 技能添加和技能参数修改2.5 商店2.5.1 商店属性设置2.5.2 商店物品设置三、装饰物3.1 属性编辑3.2 碰撞体积四、…

C++作业3(类)

1、思维导图 2、类中存在引用成员情况下有参构造 #include <iostream>using namespace std; class Cy {float &r; public:Cy(float &r):r(r){cout<<"类中存在引用成员情况下有参构造"<<endl;};float set_r(float);void show(); }; float…

【开源】一款基于SpringBoot 的全开源充电桩平台

一、下载项目文件 下载源码项目文件口令&#xff1a;动作璆璜量子屏多好/~d1b8356ox2~:/复制口令后&#xff0c;进入夸克网盘app即可保存&#xff08;如果复制到夸克app没有跳转资源&#xff0c;可以复制粘贴口令到夸克app的搜索框也可以打开&#xff08;不用点搜索按钮&#…

定制链接类名,两类跳转传参,vue路由重定向,404,模式设置

router-link-exact-active 和 router -link-active两个类名都太长&#xff0c;可以在router路由对象中定制进行简化 // index.js// 路由的使用步骤 52 // 1.下载 v3.6.5 // 2.引入 // 3.安装注册Vue.use(Vue插件) // 4.创建路由对象 // 5.注入到new Vue中&#xff0c;建立关联…

鼠标右键单击Git Bash here不可用

最近在学习git时突然发现右键的git bash没反应&#xff0c;但是去点击应用图标就能正常运行&#xff0c;通常是因为你在安装git之后改变了它的目录名称或者位置&#xff0c;我就是因为安装后改变了一个文件夹的文件名导致不可用 在安装git时系统会默认给鼠标右键选项的git Bas…

探索Web3:从去中心化应用到全球数字化未来

Web3 是互联网发展的下一步&#xff0c;它通过去中心化的理念重新定义了数字世界。与传统的Web2相比&#xff0c;Web3将数据主权交还给用户&#xff0c;让每个人都可以在没有中介的情况下安全地交换信息和价值。本文将探索Web3的基本概念&#xff0c;去中心化应用&#xff08;D…

给我的小程序加了个丝滑的搜索功能,踩坑表情包长度问题

前言 最近在用自己的卡盒小程序的时候&#xff0c;发现卡片越来越多&#xff0c;有时候要找到某一张来看看笔记要找半天&#xff0c;于是自己做了一个搜索功能&#xff0c;先看效果&#xff1a; 怎么样&#xff0c;是不是还挺不错的&#xff0c;那么这篇文章就讲讲这样一个搜索…

HarmonyOS 线性容器List 常用的几个方法

List底层通过单向链表实现&#xff0c;每个节点有一个指向后一个元素的引用。当需要查询元素时&#xff0c;必须从头遍历&#xff0c;插入、删除效率高&#xff0c;查询效率低。List允许元素为null。 List和LinkedList相比&#xff0c;LinkedList是双向链表&#xff0c;可以快速…

华为HarmonyOS NEXT 原生应用开发:页面路由、页面和组件生命周期函数

页面路由、组件生命周期 一、路由的基本使用 1. 如何新建页面 直接右键新建Page。【这个是最直接最常用的】新建普通ets文件&#xff0c;然后通过配置变成页面。 【该方法是遇到这种情况的解决方案】 2. 路由 - 页面之间的跳转 使用 **router.pushUrl&#xff08;{}&#xff…

二叉树概述

目录 一、二叉树的基本结构 二、二叉树的遍历 1.前序 2.中序 3.后序 4.层序遍历 三.计算二叉树的相关参数 1.计算节点总个数 2.计算叶子节点的个数 3.计算树的高度 4.计算第k层的子树个数 5.查找树中val为x的节点 四.刷题 1.单值二叉树 2.检查两棵树是否相同 3.一…

【从零开始入门unity游戏开发之——C#篇01】理论开篇

文章目录 前言前置条件什么是编程&#xff1f;什么是代码&#xff1f;什么是编程语言&#xff1f;常见的编程语言什么是C#&#xff1f;学习Unity为什么要先学习C#&#xff1f;选择适合自己的IDE集成开发环境VSCode安装和环境配置VSCode调试模式专栏推荐完结 前言 这个系列我想…

汽车总线协议分析-CAN总线

随着汽车工业的发展&#xff0c;汽车各系统的控制逐步向自动化和智能化转变&#xff0c;汽车电气系统变得日益复杂。许多车辆设计使用CAN、CAN-FD、LIN、FlexRay或SENT在电子控制单元(ECU)之间以及ECU与传感器&#xff0c;执行器和显示器之间进行通信。这些ECU之间的通信允许车…

SQL 获取今天的当月开始结束范围:

使用 GETDATE() 结合 DATEADD() 和 DATEDIFF() 函数来获取当前月的开始和结束时间范围。以下是实现当前月时间范围查询的 SQL&#xff1a; FDATE > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) FDATE < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) 1, 0) …

【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤

&#x1f399;告诉你&#xff1a;Java是世界上最美好的语言 &#x1f48e;比较擅长的领域&#xff1a;前端开发 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持续下去的动力&#xff01; 目录 一. 作者有话说 …