unity addressables 加载资源和场景 显示进度条(主要用于WebGL)

本文主要是介绍unity addressables 加载资源和场景 显示进度条(主要用于WebGL),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、addressables是什么?
  • 二、导入Addressables
  • 三、创建Addressables Settings 资产包管理
  • 四、资源打包
  • 五、环境模拟
  • 六、查看重复资源
  • 七、选择Bundle模式
  • 七、加载资源 并进度条显示
  • 总结


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、addressables是什么?

Unity Addressable Asset system 提供了一个可以随着您的项目而增长的系统,无需编程即可以取代AssetBundle管理资源。
具备自分配地址功能,使用到时自动寻址加载、自动对本地移动资源进行跟踪并处理依赖关系。
这个插件很强大,很多东西都处理好了。如果我们用AssetBundle,就需要自己取写处理逻辑。
它是基于AssetBundle的。界面详细的介绍,请移步其他文章。网上也挺有很多大神分享了。
我也会记录一些我遇到的问题以及小技巧。

二、导入Addressables

1.点击 Windows > PackageManager
2.搜索 Addressables ,并导入插件
3.Unity要求使用2019以后版本
4.Addressables 的版本使用:1.12.0 以后的。(这个版本以后相对完善很多功能)
在这里插入图片描述

三、创建Addressables Settings 资产包管理

1.点击 Windows > Asset Management > Addressables > Groups
2.默认创建了一个组 Default Local Group (Default)
在这里插入图片描述
3.Addressable 加入资源
选中你的资源,勾选Addressable 即可
在这里插入图片描述

四、资源打包

在这里插入图片描述
1.资源打包分:本地资源打包和远程资源打包。区别就是路径不一样。
点击Tools->Profiles
在这里插入图片描述

在这里插入图片描述

五、环境模拟

  1. Use Asset Database (fastest)
    可以直接从AssetDatabase加载资源,避免打包过程,因此加载速度很快。但是这种方式获取的Profiler信息较少,因为Addressables系统不需要打包资源,所以不会产生AssetBundle的缓存信息。因此,在项目开发阶段,建议使用这种非打包方式,以快速加载资源。

  2. Simulate Groups (advanced)
    这种模式下,是通过模拟AssetBundle的操作,以获取与打包方式类似的Profiler信息。但不同于直接从AssetDatabase加载资源,其会模拟出AssetBundle的缓存信息,然后通过分析这些信息来获取Profiler数据。因为不需要打包Addressable资源包,所以也无需执行Build操作。因此,这种模式既快又能够获取丰富的Profiler信息,是一个很好的开发调试方式。

  3. Use Exising Build(requires built groups)
    在这种模式下,仍然需要执行Build操作,将资源打包为Addressable资源包。在运行时,Addressables系统会根据Load Path去加载实际的AssetBundle文件并读取资源。与前面两种模式不同的是,这个模式需要打包资源,所以需要先执行Build操作。如果不先Build,运行时会无法加载资源,导致程序报错。因此,这种模式适用于项目发布或上线前的阶段,以确保资源能够被正确加载。

六、查看重复资源

由于我主要是发布WebGL平台,需要各方面缩小资源大小。
好处:公用的资源不会重复打包了。
1.在AddressablesGroup中选择 Tools > Window > Analyze
在这里插入图片描述
在这里插入图片描述

七、选择Bundle模式

选择Pack Separately,因为我不想分组,用的默认Default Local Group,在WebGL端你不分组,加载时过大会报错。选择这个模式相当于每个资源单独组了。除非你一个预制件资源会很大,不然就不会出现错误,就算过大,也有资源重复处理方案:本文第六
在这里插入图片描述

七、加载资源 并进度条显示

原著链接: Unity3d C# 实现AA包(Addressables)资源热更新的多个包异步加载并显示加载实时进度功能(含源码)
创建UI挂载下面代码即可:

/**********************************************************************文件信息文件名(File Name):                AAPackLoader.cs作者(Author):                      TianWenQuan创建时间(CreateTime):             #CREATETIME#**********************************************************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
namespace Twq
{[System.Serializable]public class AAPack{public string NodeName;public Transform ParentTran;public Vector3 scale = Vector3.one;}public class AAPackLoader : MonoBehaviour{public AAPack[] AAPacks;public Image ProcessImg;public Text ProcessText;int NowIdx = 0;float TotalRat = 0;// Start is called before the first frame updatevoid Start(){transform.localScale = Vector3.one;ProcessImg.fillAmount = 0;ProcessText.text = "0%";StartCoroutine(LoadAllAAPack());}AsyncOperationHandle<GameObject> AO;IEnumerator LoadAllAAPack(){for (int i = 0; i < AAPacks.Length; i++){NowIdx = i;if (AAPacks[i] != null){AO = Addressables.LoadAssetAsync<GameObject>(AAPacks[i].NodeName);yield return AO;if (AO.Status == AsyncOperationStatus.Succeeded){GameObject go = Instantiate(AO.Result, Vector3.zero, Quaternion.identity);go.name = AAPacks[i].NodeName;go.transform.SetParent(AAPacks[i].ParentTran == null ? this.transform : AAPacks[i].ParentTran);go.transform.localPosition = Vector3.zero;go.transform.localEulerAngles = Vector3.zero;go.transform.localScale = AAPacks[i].scale;go.SetActive(true);}}}transform.localScale = Vector3.zero;//Destroy(gameObject);}// Update is called once per framevoid Update(){if (AAPacks.Length > 0){//+1TotalRat = (float)(NowIdx) / (float)AAPacks.Length + AO.PercentComplete / AAPacks.Length;   //AO.GetDownloadStatus().Percent//Debug.Log("NowIdx:" + NowIdx + " TotalRat:" + TotalRat + "  AAPacks:" + AAPacks.Length + " Percent:" + AO.PercentComplete);ProcessImg.fillAmount = TotalRat;ProcessText.text = (TotalRat * 100).ToString("F1") + "%";}}}}

Dome(文章写的很清楚了,请勿轻易下载):链接: link

总结

站在巨人身上学习,真的很轻松!

这篇关于unity addressables 加载资源和场景 显示进度条(主要用于WebGL)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

关于@RequestParam的主要用法详解

《关于@RequestParam的主要用法详解》:本文主要介绍关于@RequestParam的主要用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 基本用法2. 默认值3. 可选参数4. 绑定到对象5. 绑定到集合或数组6. 绑定到 Map7. 处理复杂类

Java中Runnable和Callable的区别和联系及使用场景

《Java中Runnable和Callable的区别和联系及使用场景》Java多线程有两个重要的接口,Runnable和Callable,分别提供一个run方法和call方法,二者是有较大差异的,本文... 目录一、Runnable使用场景二、Callable的使用场景三、关于Future和FutureTa

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

Rust中的Drop特性之解读自动化资源清理的魔法

《Rust中的Drop特性之解读自动化资源清理的魔法》Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如B... 目录自动清理机制:Rust 的析构函数提前释放资源:std::mem::drop android的妙