[Unity学习教程] Unity3d C# 实现AA包(Addressables)资源热更新的多个包异步加载并显示加载

[复制链接]
查看1227 | 回复0 | 2023-8-23 12:12:07 | 显示全部楼层 |阅读模式 来自 中国北京
媒介

该功能的aa包是本地包,我这边项目标需求就是将沙盘的多场景在程序初始化的时间将全部场景实例化,不使用动态加载的方式,必然会造成程序运行的装备的负载加大,不外特定的需求就是在切换场景的过程更丝滑(如不消转圈等候)。
如果对使用统一可寻址资产系统(Addressables)还不认识的,可以查察我之前写的两篇博客:
Unity3d 使用统一可寻址资产系统(Addressables)入门学习保姆级教程(含工程)
Unity3d 使用统一可寻址资产系统(Addressables)实现服务器资源热更新和资源版本管理等功能(含源码)
我这边使用的版本是Unity3d 2020.3.12f1c1 和 Addressables 1.20.0。不同版本会可能会有一定的结果差异。
#结果
先来看看终极实现后的结果:

实现功能

实现过程相对比较简单的就是使用协程StartCoroutine的方式Addressables.LoadAssetAsync()加载资源包 ,资源包采用配置数组的方式举行提前配置,并实例化对象在指定节点下面。AsyncOperationHandle的PercentComplete属性来同步更新每个资源的加载进度,并将进度同步到UI的进度条图片和Text上。
UI搭建

UI的搭建较为简单,新建一个图片为进度条,将Image Type设置为Filled,FillMathod 设置为Horizontal,Fill Origin设置为 Left:

如许设置后我们只须要修改Fill Amount就是进度条的进度了。
然后再新建两个Text作为加载的提示和加载的进度即可:

AA场景包处置惩罚

关于场景包的处置惩罚,我这里是对场景的节点举行了拖拽成了预设prefab文件,然后将prefab文件添加到Addressables对应的组中,举行Addressables打包即可,这些操作已经在之前的两篇博客中有详细的先容,这里就不先容了。
要留意的是在Hierarchy窗口中关联的prefab节点要举行删除,为了防止误操作,最好举行版本管理(svn 或者 git)。
AA包类

这里我们新建了AA包的配置类如下:
  1. [System.Serializable]
  2. public class AAPack
  3. {
  4.     public string NodeName;
  5.     public Transform ParentTran;
  6.     public Vector3 scale = Vector3.one;
  7. }
复制代码
NodeName为aa包名,在Addressables Groups窗口对应填写的包名:

ParentTran为实例化到该节点的子节点,scale 为实例化后的缩放配置;可以自行添加其他配置项,如实例化的位置(position),实例化的旋转角度(eulerAngles),新增的别的配置项须要在实例化的时间新增对应参数的设置。
这里的aa包配置,我设置为数组,并将对应的须要加载的包配置如下:

加载AA包

先贴出加载和更新进度UI的代码:
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using UnityEngine.AddressableAssets;
  6. using UnityEngine.ResourceManagement.AsyncOperations;
  7. public class AAPackLoader : MonoBehaviour
  8. {
  9.     public AAPack[] AAPacks;
  10.     public Image ProcessImg;
  11.     public Text ProcessText;
  12.     int NowIdx = 0;
  13.     float TotalRat = 0;
  14.     // Start is called before the first frame update
  15.     void Start()
  16.     {
  17.         transform.localScale = Vector3.one;
  18.         ProcessImg.fillAmount = 0;
  19.         ProcessText.text = "0%";
  20.         StartCoroutine(LoadAllAAPack());
  21.     }
  22.     AsyncOperationHandle<GameObject> AO;
  23.     IEnumerator  LoadAllAAPack() {
  24.         for (int i = 0; i < AAPacks.Length; i++) {
  25.             NowIdx = i;
  26.             if (AAPacks[i] != null)
  27.             {
  28.                 AO = Addressables.LoadAssetAsync<GameObject>(AAPacks[i].NodeName);
  29.                 yield return AO;
  30.                 if (AO.Status == AsyncOperationStatus.Succeeded)
  31.                 {
  32.                     GameObject go = Instantiate(AO.Result, Vector3.zero, Quaternion.identity);
  33.                     go.name = AAPacks[i].NodeName;
  34.                     go.transform.SetParent(AAPacks[i].ParentTran == null ? this.transform : AAPacks[i].ParentTran);
  35.                     go.transform.localPosition = Vector3.zero;
  36.                     go.transform.localEulerAngles = Vector3.zero;
  37.                     go.transform.localScale = AAPacks[i].scale;
  38.                     go.SetActive(true);
  39.                 }
  40.             }
  41.         }
  42.         transform.localScale = Vector3.zero;
  43.         Destroy(gameObject);
  44.     }
  45.     // Update is called once per frame
  46.     void Update()
  47.     {
  48.         if (AAPacks.Length > 0) {
  49.                //+1
  50.             TotalRat = (float)(NowIdx) / (float)AAPacks.Length + AO.PercentComplete / AAPacks.Length;   //AO.GetDownloadStatus().Percent
  51.             //Debug.Log("NowIdx:" + NowIdx + " TotalRat:" + TotalRat + "  AAPacks:" + AAPacks.Length + " Percent:" + AO.PercentComplete);
  52.             ProcessImg.fillAmount = TotalRat;
  53.             ProcessText.text = (TotalRat * 100).ToString("F1") + "%";
  54.         }
  55.     }
  56. }
复制代码
这里启动时直接开始了协程IEnumerator LoadAllAAPack举行全部包的加载,并在Update函数中对进度举行了换算和更新。在加载完成后,直接烧毁了该对象,因为这个模块在程序启动时,加载了全部的场景,它的工作已经完成了,不会再执行了,以是举行了烧毁。
接下来直接将须要关联的节点拖拽进入对应的框内:

并运行即可。

来源:https://blog.csdn.net/qq_33789001/article/details/127490940
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则