Unity AssetBundles资源加载管理器

server/2025/3/17 15:19:35/

Unity AssetBundles资源加载管理器

实现了AB包管理器
目的: 让外部更方便地进行资源加载(同步加载/异步加载)

技术包含:

  1. AB包相关API
  2. 单例模式
  3. 委托(Lambda)表达式
  4. 协程
  5. 字典

AssetBundles工具下载地址

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Events;/// <summary>
/// AB 包管理器
/// 目的: 让外部更方便地进行资源加载
/// 包含
/// 1. AB包相关API
/// 2. 单例模式
/// 3. 委托(Lambda)表达式
/// 4. 协程
/// 5. 字典
/// </summary>
public class ABMgr : SingletonAutoMono<ABMgr>
{//主包private AssetBundle mainAB = null;//依赖包获取的配置文件private AssetBundleManifest manifest= null;//字典  用字典来存储 加载过的AB包private Dictionary<string, AssetBundle> abDic = new Dictionary<string, AssetBundle>();//AB包存放路径private string PathUrl{get{return Application.streamingAssetsPath+"/";}}//主包名private string MainABName{get{#if UNITY_IOSreturn "IOS";#elif UNITY_ANDROIDreturn "Android";#elsereturn "PC";#endif}}/// <summary>/// 加载ab包/// </summary>/// <param name="abname"></param>private void LoadAB(string abname){//加载AB包if (mainAB == null){mainAB = AssetBundle.LoadFromFile(PathUrl + MainABName);manifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");}//获取abname包的依赖信息,根据依赖信息添加依赖包AssetBundle ab = null;string[] strs = manifest.GetAllDependencies(abname);for (int i = 0; i < strs.Length; i++){//判断包是否加载过了if (!abDic.ContainsKey(strs[i])){ab = AssetBundle.LoadFromFile(PathUrl + strs[i]);abDic.Add(strs[i], ab);}}//加载资源来源包,如果没有加载过再加载if (!abDic.ContainsKey(abname)){ab = AssetBundle.LoadFromFile(PathUrl + abname);abDic.Add(abname, ab);}}//同步加载 根据名字public Object LoadRes(string abname,string resname){//加载ab包LoadAB(abname);//加载资源//为了方便外面加载 判断资源是否为GameObect//如果是 直接实例化 再返回给外部Object obj = abDic[abname].LoadAsset(resname);if (obj is GameObject){return Instantiate(obj);}else return obj;}//同步加载 根据typepublic Object LoadRes(string abname, string resname,System.Type type){//加载ab包LoadAB(abname);//加载资源//为了方便外面加载 判断资源是否为GameObect//如果是 直接实例化 再返回给外部Object obj = abDic[abname].LoadAsset(resname,type);if (obj is GameObject){return Instantiate(obj);}else return obj;}//同步加载 泛型public T LoadRes<T>(string abname, string resname) where T: Object{//加载ab包LoadAB(abname);//加载资源//为了方便外面加载 判断资源是否为GameObect//如果是 直接实例化 再返回给外部T obj = abDic[abname].LoadAsset<T>(resname);if (obj is GameObject){return Instantiate(obj);}else return obj;}/// <summary>/// 异步加载(Async) 根据名字/// 加载AB包没有使用异步/// 而是加载AB包中的asset资源的时候使用异步/// </summary>/// <param name="abname"></param>public void LoadResAsync(string abname, string resname,UnityAction<Object> callBack){StartCoroutine(ReallyLoadAsync(abname,resname,callBack));}private IEnumerator ReallyLoadAsync(string abname,string resname,UnityAction<Object> callBack){//加载AB包LoadAB(abname);//创建请求 从AB包加载资源AssetBundleRequest abr = abDic[abname].LoadAssetAsync(resname);//等待abr加载结束yield return abr;//abr.asset 为加载的资源if(abr.asset is GameObject){//abr如果是GameObject 实例化callBack(Instantiate(abr.asset));}else{callBack(abr.asset);}}/// <summary>/// 异步加载(Async) 根据type/// </summary>/// <param name="abname"></param>public void LoadResAsync(string abname, string resname,System.Type type, UnityAction<Object> callBack){StartCoroutine(ReallyLoadAsync(abname, resname,type, callBack));}private IEnumerator ReallyLoadAsync(string abname, string resname, System.Type type,UnityAction<Object> callBack){//加载AB包LoadAB(abname);//创建请求 从AB包加载资源AssetBundleRequest abr = abDic[abname].LoadAssetAsync(resname,type);//等待abr加载结束yield return abr;//abr.asset 为加载的资源if (abr.asset is GameObject){//abr如果是GameObject 实例化callBack(Instantiate(abr.asset));}else{callBack(abr.asset);}}/// <summary>/// 异步加载(Async) 泛型/// </summary>/// <param name="abname"></param>public void LoadResAsync<T>(string abname, string resname, UnityAction<T> callBack) where T : Object {// public delegate void UnityAction<T0>(T0 arg0);//其中UnityAciton是有着一个参数(T0)的委托StartCoroutine(ReallyLoadAsync<T>(abname, resname, callBack));}private IEnumerator ReallyLoadAsync<T>(string abname, string resname, UnityAction<T> callBack) where T: Object {//加载AB包LoadAB(abname);//创建请求 从AB包加载资源AssetBundleRequest abr = abDic[abname].LoadAssetAsync<T>(resname);//等待abr加载结束yield return abr;//abr.asset 为加载的资源if (abr.asset is GameObject){//abr如果是GameObject 实例化//最后回调函数(函数指针,函数作为参数)调用委托callBack(Instantiate(abr.asset) as T);}else{callBack(abr.asset as T);}}//单个包卸载public void Unload(string abname){if (abDic.ContainsKey(abname)){abDic[abname].Unload(false);abDic.Remove(abname);}}//所有包卸载public void ClearAB(){//卸载所有AssetBundles(UnloadAll)AssetBundle.UnloadAllAssetBundles(false);//清空字典abDic.Clear();//主包和配置文件置空mainAB = null;manifest = null;}}
文章来源:https://blog.csdn.net/qq_45950599/article/details/146285413
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/server/175405.html

相关文章

如何用C#编写一个可以验证登录信息的简单登录页面?

要用C#编写一个简单的登录页面&#xff0c;可以按照以下步骤进行&#xff1a; 创建一个新的C#控制台应用程序项目。 创建一个名为Login.cs的类&#xff0c;该类包含用户名和密码作为属性。 class Login {public string Username { get; set; }public string Password { get;…

【Java基础】java中的lambda表达式

Java Lambda表达式深度解析&#xff1a;语法、简化规则与实战 前言 Java 8的Lambda表达式通过简化匿名内部类和引入函数式编程&#xff0c;极大提升了代码的简洁性和可读性。 一、Lambda表达式的核心语法 Lambda表达式由参数列表、->符号和表达式主体组成&#xff0c;其基…

基于YOLOv8深度学习的PCB缺陷检测识别系统【python源码+GUI界面+数据集+训练代码】

目录 一、界面功能展示 二、前言摘要 三、GUI界面演示 &#xff08;一&#xff09;用户加载自定义模型 &#xff08;二&#xff09;单张图像检测 &#xff08;三&#xff09;检测图像文件夹 &#xff08;四&#xff09;检测视频 &#xff08;五&#xff09;保存 四、模…

C# Exe + Web 自动化 (BitComet 绿灯 自动化配置、设置)

BitComet GreenLight,内网黄灯转绿灯 (HighID), 增加p2p连接率提速下载-CSDN博客 前两天写个这个&#xff0c;每次开机关机后要重来一遍很麻烦的索性写个自动化。 先还是按照上面的教程自己制作一遍&#xff0c;留下Luck 以及 路由器相关的 端口记录信息。 &#xff08;因为自…

全球领先的光学方案设计公司:倚光科技

在光学技术革新的浪潮中&#xff0c;倚光&#xff08;深圳&#xff09;科技有限公司以创新者的姿态迅速崛起&#xff0c;成为全球光学领域的标杆企业。自 2021 年成立以来&#xff0c;公司始终聚焦纳米光学技术研发与超精密加工&#xff0c;凭借顶尖的技术实力和前瞻性的市场布…

组件通信框架ARouter原理剖析

组件通信框架ARouter原理剖析 一、前言 随着Android应用规模的不断扩大&#xff0c;模块化和组件化开发变得越来越重要。ARouter作为一个用于帮助Android应用进行组件化改造的框架&#xff0c;提供了一套完整的路由解决方案。本文将深入分析ARouter的核心原理和实现机制。 二…

2025 linux系统资源使用率统计docker容器使用率统计docker监控软件Weave Scope安装weavescope

1.Weave Scope介绍 Weave Scope 是一款用于监控和可视化 Docker 容器、Kubernetes 集群以及分布式应用的强大工具。它的设计目标是帮助开发者和运维人员更好地理解和管理复杂的微服务架构。以下是 Weave Scope 的主要优点&#xff1a; 1. 实时可视化 Weave Scope 提供了一个直…

AI时代研究卷积神经网络(CNN)工具与方法

在AI时代&#xff0c;作为研究卷积神经网络&#xff08;CNN&#xff09;和视觉网络的程序员&#xff0c;合理选择工具、技术和学习资源是提升效率与专业能力的关键。以下结合2025年最新技术动态与实践经验&#xff0c;从工具链、技术方向、学习资料及效率方法四个维度进行系统推…