Unity 之 Addressable可寻址系统 -- 将Resources加载资源方式修改为Addressable加载 -- 实战(一)

这篇具有很好参考价值的文章主要介绍了Unity 之 Addressable可寻址系统 -- 将Resources加载资源方式修改为Addressable加载 -- 实战(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一,两种资源加载方式对比

  1. 加载方式:

    • Resources 使用同步加载方式;Resources 加载资源时,应用程序将会被阻塞,直到资源加载完成,这可能会导致应用程序出现卡顿或挂起的情况。
    • Addressables 使用异步加载方式。这意味着使用 Unity 而使用 Addressables 加载资源时,应用程序可以继续运行,而不会出现卡顿或挂起的情况。
  2. 动态加载:

    • Resources 只能从项目的 Assets 文件夹中加载资源,只能在编译时加载资源。
    • Addressables 可以在运行时动态加载资源,从而实现更灵活的资源管理。
  3. 资源管理:

    • Resources 只能带在安装包中,资源过多的情况下,会增大包体。
    • Addressables 可以从本地或远程服务器加载资源,并可以通过 Addressables Group 进行灵活的资源管理和打包。
  4. 资源更新:

    • Resources 中的资源只能通过重新打包应用程序来更新
    • Addressables 可以通过简单的资源更新或替换来更新应用程序中的资源,而无需重新打包整个应用程序。

综上所述,Addressables 比 Resources 更灵活、更高效、更可靠,特别是在处理大量或较大的资源时,Addressables 的异步加载和灵活资源管理功能能够大大提高应用程序的性能和可扩展性。但是,在加载少量或较小的资源时,使用 Resources 会更简单和方便。


二,将Resource项目转为Addressables

2.1 实现逻辑

  • 当一个Resources文件夹内的资源被标记为Addressable时,系统会自动将它从Resources文件夹移动到Resources_moved的新文件夹中。
  • 若有多层目录,系统也会保留,同步在Resources_moved的新文件夹中创建和Resources中的目录结构
  • 被标记的资源可寻址路径(加载路径Key),也会使用Resources目录下的目录结构。
  • 原来的加载代码会从Resources.Load<GameObject>("CZY/Czhenya.prefab") 变成 Addressables.LoadAssetAsync<GameObject>("CZY/Czhenya.prefab")
  • 若工程中有使用public GameObject Czhenya; 这种公开变量拖拽赋值的情况,
    只需将定义代码修改为public AssetReference Czhenya;
    实例化Instaniate() 修改为 AssetRefName.InstantiateAsync();

需要注意的是: 移动后的路径Key使用在Resources文件夹下的目录命名。而在Resources文件夹下加载资源时路径名称是不区分大小写的,而AA的路径Key是需要区分大小写的。

分享一个工具脚本:

可导入下面脚本到工程中,而后只需将工程中的Resources.Load 修改 为 AAResources.Load 即可完成资源加载方式的转换。

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class AAResources
{
    /// <summary>
    /// 可寻址资源加载
    ///     强制同步加载GameObject的基本用法
    /// </summary>
    /// <param name="pathKey">路径key</param>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public static T Load<T>(string pathKey)
    {
        var op = Addressables.LoadAssetAsync<T>(pathKey);
        T go = op.WaitForCompletion();
        if (op.Status == AsyncOperationStatus.Failed)
        {
            Debug.LogError($"加载资源失败,路径:{pathKey},异常 {op.OperationException}");
            return default(T);
        }
        return go;
    }
}

注意:这种同步加载的方式在WebGL上是不支持的,在其他平台是没问题的。
Unity 之 Addressable可寻址系统 -- 将Resources加载资源方式修改为Addressable加载 -- 实战(一)

异步写法如下:

public async Task<T> LoadAssetAsync<T>(string pathKey) where T : UnityEngine.Object
{
    AsyncOperationHandle<T> handle = Addressables.LoadAssetAsync<T>(pathKey);
    await handle.Task;
    return handle.Result;
}

Addressable代码加载的其他方式,可以参考:Unity 之 Addressable可寻址系统 – 代码加载介绍 – 进阶(一)


2.2 操作步骤

将Unity资源加载方式从Resources修改到Addressables需要进行以下步骤:

  1. 安装 Addressables 包:在 Unity 的 Package Manager 中安装 Addressables 包,以便在项目中使用 Addressables 相关功能。

  2. 配置 Addressables:在 Unity 的菜单栏中选择 Window -> Asset Management -> Addressables -> Groups,创建一个新的 Addressables Group 并将所需的资源添加到其中。

  3. 修改代码:修改引用 Resources 加载方式的代码,改为使用 Addressables 加载资源。您可以使用 Addressables.LoadAssetAsync 方法来异步加载资源,或者使用 Addressables.LoadAsset 方法来同步加载资源。


三,使用Addressables的注意事项

在使用Addressables加载资源时,需要注意资源的生命周期和线程安全问题,下面是一些处理方法:

  • 生命周期管理:在使用Addressables加载资源后,需要注意资源的生命周期问题,以免资源泄漏或者被意外释放。一般来说,可以使用AsyncOperationHandle.Release()方法来释放加载的资源。在释放资源之前,需要确保所有的引用都已经被释放了,否则会导致资源泄漏。如果资源被多次加载,需要在所有的引用都释放之后,再调用Release()方法释放资源。

  • 线程安全:在使用Addressables加载资源时,需要注意线程安全问题,以免出现竞态条件和其他线程问题。一般来说,可以使用异步加载的方式来避免线程问题。如果需要在主线程中访问异步加载的结果,可以使用Unity的协程(Coroutine)来处理异步操作,并在协程中访问异步加载的结果。另外,需要注意在异步加载的回调函数中,不要直接修改Unity对象的属性或者调用Unity API,否则会导致线程问题。如果需要在回调函数中修改Unity对象的属性或者调用Unity API,需要使用Unity的主线程调用(MainThreadDispatcher)来确保线程安全。

  • 错误处理:在使用Addressables加载资源时,需要注意错误处理问题,以免出现未处理的异常和错误信息。一般来说,可以使用AsyncOperationHandle.OperationException属性获取异步操作的错误信息,并对错误进行处理。如果出现异常,可以使用try-catch语句来捕获并处理异常。需要注意的是,在异步操作中,异常和错误信息可能会被延迟到异步操作完成后才能被捕获和处理,所以需要在异步操作完成后再进行错误处理。


四,使用中遇到问题

报错:

UnityEngine.AddressableAssets.InvalidKeyException: Exception of type ‘UnityEngine.AddressableAssets.InvalidKeyException’ was thrown., Key=Sound, Type=UnityEngine.AudioClip

可能原因:

  1. 检查指定的组名称是否正确,需要保证与Addressable系统中的组名称一致,包括大小写。可以在Addressables窗口中查看所有的组名称和其中的资源。

  2. 检查指定的组中是否存在指定的资源,需要保证资源名称与Addressable系统中的名称一致,包括大小写。

  3. 检查指定的资源类型是否正确,需要保证与实际使用的资源类型一致。例如,如果需要加载的是音频资源,需要使用Addressables.LoadAssetsAsync而不是Addressables.LoadAssetsAsync。

  4. 如果使用了Addressables的标签(label)功能,需要保证指定的标签名称与实际使用的标签名称一致,包括大小写。文章来源地址https://www.toymoban.com/news/detail-454386.html


到了这里,关于Unity 之 Addressable可寻址系统 -- 将Resources加载资源方式修改为Addressable加载 -- 实战(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity基础3——Resources资源动态加载

    ​ 注意:需要我们自己创建 ​ 作用:资源文件夹 需要通过 Resources 相关 API 动态加载的资源需要放在其中 该文件夹下所有文件都会被打包出去 打包时 Unity 会对其压缩加密 该文件夹打包后只读 只能通过 Resources 相关 API 加载 ​ 注意:需要我们自己将创建 ​ 作用:流文件

    2024年02月10日
    浏览(42)
  • Unity资源加载方式

    Resources:逻辑资源目录,这个目录中的资源会 打入到包 中, 不允许热更 。在打包时会被压缩和加密。 加载方式:Resources.Load(常用) 、 AssetDatabase.LoadAssetAtPath等加载接口 StreamingAssets:Raw资源目录,这个目录中的资源也会 打入到包 中,且允许程序通过Application.streamingAsse

    2023年04月09日
    浏览(38)
  • Unity 如何基于addressable来做资源管理

    一、什么是Addressable系统 Addressable系统是Unity 2018.3版本中推出的一种资源管理方案,它可以帮助我们更好地管理游戏中的资源。在以往的游戏开发中,我们通常使用Resources来进行资源加载,但是这种方式存在很多问题,比如加载速度慢、内存占用高等。Addressable系统可以解决这

    2024年02月16日
    浏览(39)
  • Springboot 使用thymeleaf 服务器无法加载resources中的静态资源异常处理

    Springboot使用thymeleaf,并 连接远程数据库 启动时,无法加载resources中的静态资源 浏览器报错 后端启动时报错 前端打开页面时后端报错 打包编译项目,显示找不到js、css、html等静态资源,但本地路径并没有写错,于是我去找编译文件,查看是不是静态资源没有编译到,打开项

    2024年02月04日
    浏览(51)
  • Unity3D中Resources动态加载图片

    问题:unity的Resources动态加载就不必多说了,这里出现的问题是当我把图片放入Resources文件夹后,使用Resources.Load(datapath)却并没有出现图片。 分析:由于你放在文件夹下的是图片,是Texture2D类型,但是实际用在u3d中的是sprite,所以需要转换类型。 方式: 1.在代码中先行创

    2024年02月11日
    浏览(42)
  • Unity编辑器从PC平台切换到Android平台下 Addressable 加载模型出现粉红色,类似于材质丢失的问题

    Unity编辑器在PC平台下使用Addressable加载打包好的Cube,运行发现能正常显示。 而在切换到Android平台下,使用Addressable时加载AB包,生成Cube对象时,Cube模型呈现粉红色,出现类似材质丢失的问题。如下图所示。 这是因为GraphicAPI不同导致的。编辑器默认用的是PC平台的GraphicAPI。

    2024年02月08日
    浏览(47)
  • 【计组考点】:第五章 指令系统(下)寻址方式

    根据学校课件总结的计组考点,用过的都说好! 目录  6.操作数的寻址方式 6.1立即寻址 6.2直接寻址 6.3寄存器寻址 6.4间接寻址 6.5寄存器间接寻址 6.6相对寻址 6.7变址寻址 6.8基址寻址 7.寻址方式例题 7.1例一 7.2例二 8.复杂指令系统计算机与精简指令系统计算机  最后🍨   加油

    2024年01月21日
    浏览(61)
  • 实验一8086计CPU系统寻址方式和汇编语言程序设计

    实验一8086计CPU系统寻址方式和汇编语言程序设 一、实验目的 (1)掌握8086CPU系统的逻辑地址和寻址方式。 (2)掌握8086CPU系统中机器数的表示方式。 (3)掌握指令的机器码表示方法。 (4)掌握堆栈的概念和操作过程。 (5)掌握集成开发环境下的程序设计和调试方法。 (6)掌握汇编语言实

    2023年04月22日
    浏览(49)
  • Addressable 异步加载场景并获取加载进度

    一开始用PercentComplete函数获取加载进度,发现每次都是从0.85开始计算,不准,官方文档解释:“ PercentComplete 将反映总体操作的进展情况,而不会准确地表示仅下载百分比或加载到内存中的百分比。 ” ,“ 要获得准确的下载百分比,请使用GetDownloadStatus()。” GetDownloadStatu

    2024年02月12日
    浏览(40)
  • Unity 场景加载和资源加载

    一个游戏往往都是由很多场景组成的,例如会有主界面场景、战斗场景…等,不同的场景也是由若干的资源组合而成,在游戏的制作过程中,场景和资源的加载是不可或缺的。不管是场景还是资源都会涉及到加载的问题,在什么时候进行场景或资源的加载?场景的加载和资源

    2024年02月04日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包