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 created
    void 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 created
    void 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 created
    void 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);        // false
                Debug.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 created
    void 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 created
    void 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 created
    void 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 created
    void 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 created
    void 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 created
    void Start()
    {
        Addressables.LoadAssetsAsync<Object>(
            new[] { "Cube", "Red" },
            obj => { Debug.Log(obj.name); }, // 打印结果:"Cube"
            Addressables.MergeMode.Intersection,
            true
        );
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容

目录 1. Introduction&#xff1a;介绍 Registry 的作用和功能。2. Registry Contents&#xff1a;详细描述 Registry 的结构和内容&#xff0c;包括各个部分的条目类型。2.1. DIMSPEC ENTRIES&#xff08;维度规格条目&#xff09;2.2. STATE ENTRIES&#xff08;状态变量条目…

在阿里云/Linux环境搭建Gitblit服务

在阿里云/Linux环境搭建Gitblit服务 1. 整体描述2. 前期准备3. 安装步骤3.1 下载gitblit3.2 上传gitblit3.3 解压文件3.4 修改文件配置3.5 启动gitblit3.6 安全组配置 4. 总结 1. 整体描述 前段时间买了一个阿里云服务器&#xff0c;2核2G&#xff0c;3M固定带宽的配置&#x…

鸿蒙arkts怎么打印一个方法的调用堆栈

做鸿蒙开发的时候&#xff0c;也想看一下一个方法到底是哪里调用的&#xff0c;工程太大&#xff0c;断点太麻烦&#xff0c;可以加堆栈日志。 在你的方法中加上这两句&#xff0c;就可以跟到堆栈日志 let err new Error() console.log(>>>>>>err.stack) …

116. UE5 GAS RPG 实现击杀掉落战利品功能

这一篇&#xff0c;我们实现敌人被击败后&#xff0c;掉落战利品的功能。首先&#xff0c;我们将创建一个新的结构体&#xff0c;用于定义掉落体的内容&#xff0c;方便我们设置掉落物。然后&#xff0c;我们实现敌人死亡时的掉落函数&#xff0c;并在蓝图里实现对应的逻辑&…

亚马逊云服务器Amazon EC2

一、什么是Amazon EC2&#xff1f; Amazon Elastic Compute Cloud (Amazon EC2) 在 Amazon Web Services (AWS) 云中提供按需、可扩展的计算容量。使用 Amazon EC2 可降低硬件成本&#xff0c;让您能够更快地开发和部署应用程序。您可以使用 Amazon EC2 启动任意数量的虚拟服务…

Word 右键内容不显示段落/字体问题解决

有时需要调整图片的行间距&#xff0c;但是右键图片所在行&#xff0c;没有段落的选项。 可以将焦点保持在图片所在行&#xff0c;然后点击右下角的图标。同理不显示字体也可以点击左边字体中的右下角图标。

学生公寓智能限电系统的功能和作用

学生公寓智能限电系统‌是一种用于管理和限制学生公寓用电的设备和技术&#xff0c;旨在确保用电安全、防止火灾事故&#xff0c;并促进节能减排。以下是关于学生公寓智能限电系统的详细介绍&#xff1a; 1、功能和作用 智能限电系统通过以下功能来管理和限制用电&#xff1a…

[IT项管理(双语)]项目的基本概念

什么是项目 1.1项目的定义 项目&#xff08;project&#xff09;是为了创造一个特定的产品&#xff0c;服务&#xff0c;或者成果而采用的临时性的努力。 项目 产出唯一 临时性 1.2运营的定义 运营&#xff08;operation&#xff09;是 为了维持业务而进行的工作。 Imp1.3运…

ASP.NET Core SignalR 双工通信

01. 介绍 &#x1f3af; ASP.NET Core SignalR 是一个开放源代码库&#xff0c;它简化了向应用添加实时 Web 功能的过程。 实时 Web 功能使服务器端代码可以在服务器上激发事件时将事件推送到连接的客户端。 使用 SignalR&#xff0c;客户端也可以将消息发送到服务器&#xff…

Sonar基于SonarQube统一产品命名,助力提升开发者体验,以及本地、云端或IDE端的代码质量与安全

日前&#xff0c;领先的代码质量和安全解决方案提供商Sonar宣布&#xff0c;将围绕SonarQube简化其现有的产品命名。 作为Sonar的旗舰品牌&#xff0c;SonarQube代表了公司的核心使命&#xff1a;提高所有代码的质量和安全性&#xff0c;同时提供更好的开发人员体验。这些变化…

搭建高可用负载均衡系统:Nginx 与云服务的最佳实践

搭建高可用负载均衡系统&#xff1a;Nginx 与云服务的最佳实践 引言 在项目开发过程中&#xff0c;我们通常在开发和测试阶段采用单机架构进行开发和测试。这是因为在这个阶段&#xff0c;系统的主要目的是功能实现和验证&#xff0c;单机架构足以满足开发人员的日常需求&…

芯科科技突破性超低功耗Wi-Fi 6和低功耗蓝牙5.4模块加速设备部署

致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;今日宣布推出SiWx917Y超低功耗Wi-Fi 6和低功耗蓝牙&#xff08;Bluetooth LE&#xff09;5.4模块。 作为成功的第二代无线开发平台的新产品&…

CentOS7虚拟机 网络适配器 NAT模式和桥接模式区别

一、环境介绍 宿主机&#xff1a;Windows电脑 虚拟机&#xff1a;VMware下的CentOS7 局域网&#xff1a;路由器下的各真实主机组成的网络 内部局域网&#xff1a;宿主机构建的一个内部网路 二、NAT和桥接网络链接模式区别 NAT模式&#xff1a;相当于宿主机构建一个内部局域网&a…

【AIGC半月报】AIGC大模型启元:2024.12(上)

【AIGC半月报】AIGC大模型启元&#xff1a;2024.12&#xff08;上&#xff09; &#xff08;1&#xff09;OpenAI-12日发布会&#xff08;持续更新中........&#xff09;Day01-12.06&#xff1a;o1满血版上线&#xff08;已发布&#xff09;Day02-12.07&#xff1a;强化微调&a…

开源堡垒机JumpServer配置教程:使用步骤与配置

开源堡垒机JumpServer配置教程&#xff1a;使用步骤与配置 上一篇文章星哥讲了如何安装JumpServer堡垒机&#xff0c;本篇文章来讲如何配置和使用JumpServer。 安装成功后&#xff0c;通过浏览器访问登录 JumpServer 地址: http://<JumpServer服务器IP地址>:<服务运…

gulp应该怎么用,前端批量自动化替换文件

背景 最近公司准备把所有项目中用到的国际化相关的key规范化&#xff0c;原因是: 一直以来公司的app和web端 在针对相同的需求以及相同的国际化语言&#xff0c;需要设置不同的两份国际化文件&#xff0c;难以维护旧版的国际化文件中&#xff0c;存在的大量值重复&#xff0c…

【5G】5G Physical Layer物理层(一)

5G多址接入和物理层与长期演进&#xff08;LTE&#xff09;存在一些差异。在下行方向&#xff0c;5G与LTE相似&#xff0c;依旧采用正交频分多址&#xff08;OFDMA&#xff09;。而在上行方向&#xff0c;5G采用了OFDMA和单载波频分多址&#xff08;SC-FDMA&#xff09;&#x…

Docker 安装 中文版 GitLab

Docker 安装系列 安装GitLab、解决服务器内存不足问题、使用域名/IP地址访问项目 1、拉取 [rootTseng ~]# docker pull twang2218/gitlab-ce-zh:latest latest: Pulling from twang2218/gitlab-ce-zh 8ee29e426c26: Pull complete 6e83b260b73b: Pull complete e26b65fd11…

力扣-图论-4【算法学习day.54】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

减少30%人工处理时间,AI OCR与表格识别助力医疗化验单快速处理

在医疗行业&#xff0c;化验单作为重要的诊断依据和数据来源&#xff0c;涉及大量的文字和表格信息&#xff0c;传统的手工输入和数据处理方式不仅繁琐&#xff0c;而且容易出错&#xff0c;给医院的运营效率和数据准确性带来较大挑战。随着人工智能技术的快速发展&#xff0c;…