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

野区捕龙为宠 2024-06-14 14:03:01 阅读 52

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

文章目录

前言一、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

在这里插入图片描述

在这里插入图片描述

五、环境模拟

Use Asset Database (fastest)

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

Simulate Groups (advanced)

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

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 update void 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 frame void Update() { if (AAPacks.Length > 0) { //+1 TotalRat = (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

总结

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。