详解u3d之AssetBundle

devtools/2025/2/2 17:32:21/

一.AssetBundle的概念

“AssetBundle”可以指两种不同但相关的东西。

1.1 AssetBundle指的是u3d在磁盘上生成的存放资源的目录

目录包含两种类型文件(下文简称AB包):

  • 一个序列化文件,其中包含分解为各个对象并写入此单个文件的资源。
  • 资源文件,这是为某些资源(纹理和音频)单独存储的二进制数据块,允许 Unity 高效地在另一个线程上从磁盘加载它们。

1.2 AssetBundle可以指在代码层面,AssetBundle这个类的对象

该对象包含添加到此存档文件的资源的所有文件路径的映射。

二.AssetBundle的作用

  • 更新非代码资源
  • 减少安装包大小
  • 加载最终用户平台优化的资源

三.AssetBundle 工作流程

3.1 为 AssetBundle 分配资源

1.选中资源

2.Inspector中底部点开下拉选单

3.点击New

4.输入目录/文件名

5.输入后缀

3.2 构建 AssetBundle

在 Assets 文件夹中创建一个名为 Editor 的文件夹,并将包含以下内容的脚本放在该文件夹中:

using UnityEditor;
using System.IO;
public class BuildAssetBundle
{[MenuItem("Assets/Build AssetBundles")]static void BuildAllAssetBundles(){string assetBundleDirectory = "Assets/AssetBundles";if (!Directory.Exists(assetBundleDirectory)){Directory.CreateDirectory(assetBundleDirectory);}BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);}
}

此脚本将在 Assets 菜单底部创建一个名为 Build AssetBundles 的菜单项,该菜单项将执行与该标签关联的函数中的代码。单击 Build AssetBundles 时,将随构建对话框一起显示一个进度条。此过程将会获取带有 AssetBundle 名称标签的所有资源,并将它们放在 assetBundleDirectory 定义的路径中的文件夹中。

3.3 加载依赖项

依赖关系:一个AB包的资源包含了对另一个AB包资源的引用,如上图中的cube1包中的cube引用了blue包中的材质,称cube1包依赖blue包

打包时unity会自动识别出包的依赖关系,并记录到AB包的manifest文件中,如下图所示

小结:如果a包依赖b包,在使用a包资源之前,务必加载b包,Unity不会自动加载依赖项。

3.4 AssetBundle的加载和使用

1.调用AssetBundle.LoadFromFile加载AB包并获取对象

2.调用LoadAsset从获取该包内的资源

using UnityEngine;public class LoadAssetBundle : MonoBehaviour
{void Start(){//依赖的材质也需要加载AssetBundle.LoadFromFile(Application.dataPath + "/AssetBundles/material/blue.u3d");AssetBundle myLoadedAssetBundle = AssetBundle.LoadFromFile(Application.dataPath + "/AssetBundles/prefabs/cube1.u3d");GameObject prefab = myLoadedAssetBundle.LoadAsset<GameObject>("Cube");Instantiate(prefab);}
}

四.通过AssetBundles.manifest文件获取依赖关系

位于AssetBundles根目录下的AssetBundles.manifest是个文本文件,包含了所有AssetBundle包的信息和依赖关系,如下图所示

AssetBundles.manifest的信息可以通过代码访问

using UnityEngine;public class LoadAssetBundle : MonoBehaviour
{void Start(){AssetBundle myLoadedAssetBundle = AssetBundle.LoadFromFile(Application.dataPath + "/AssetBundles/prefabs/cube1.u3d");loadDependency();GameObject prefab = myLoadedAssetBundle.LoadAsset<GameObject>("Cube");Instantiate(prefab);}private void loadDependency(){AssetBundle assetBundle = AssetBundle.LoadFromFile(Application.dataPath + "/AssetBundles/AssetBundles");AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");//传AssetBundleManifest这个文件固定名称string[] dependencies = manifest.GetAllDependencies("prefabs/cube1.u3d");foreach (string dependency in dependencies){Debug.Log(dependency);AssetBundle.LoadFromFile(Application.dataPath + "/AssetBundles/" + dependency);}}
}


http://www.ppmy.cn/devtools/155496.html

相关文章

HTML 标题

HTML 标题 引言 HTML&#xff08;超文本标记语言&#xff09;是构建网页的基础&#xff0c;而标题则是网页中不可或缺的元素。标题不仅能够帮助用户快速了解网页内容&#xff0c;还能够对搜索引擎优化&#xff08;SEO&#xff09;产生重要影响。本文将详细介绍HTML标题的用法…

图书管理系统 Axios 源码__新增图书

目录 功能介绍 核心代码解析 源码&#xff1a;新增图书功能 总结 本项目基于 HTML、Bootstrap、JavaScript 和 Axios 开发&#xff0c;实现了图书的增删改查功能。以下是新增图书的功能实现&#xff0c;适合前端开发学习和项目实践。 功能介绍 用户可以通过 模态框&#xf…

项目测试之MockMvc

文章目录 基础基础概念Mockxxx一般实现文件位置 实战MockMvc与Test注解不兼容RequestParams参数RequestBody参数 基础 基础概念 定义&#xff1a;是Spring框架提供的一种用于测试Spring MVC控制器的工具&#xff0c;它允许开发者在不启动完整的web服务器的情况下&#xff0c;…

为AI聊天工具添加一个知识系统 之82 详细设计之23 符号逻辑 正则表达式规则 之1

本文要点 在继续“逻辑符号”的设计中&#xff0c;我们先回顾一个本项目--作为备忘也作为 设计中的时刻牢记&#xff1a; 回顾 项目介绍 项目名&#xff1a;为使用AI聊天工具的聊天者开挂一个知识系统项目口号&#xff1a;通过不断完善一个概念整体运营的大局观思想来持续维…

C++编程语言:抽象机制:模板(Bjarne Stroustrup)

目录 23.1 引言和概观(Introduction and Overview) 23.2 一个简单的字符串模板(A Simple String Template) 23.2.1 模板的定义(Defining a Template) 23.2.2 模板实例化(Template Instantiation) 23.3 类型检查(Type Checking) 23.3.1 类型等价(Type Equivalence) …

“新月智能武器系统”CIWS,开启智能武器的新纪元

新月人物传记&#xff1a;人物传记之新月篇-CSDN博客 相关文章链接&#xff1a;星际战争模拟系统&#xff1a;新月的编程之道-CSDN博客 新月智能护甲系统CMIA--未来战场的守护者-CSDN博客 “新月之智”智能战术头盔系统&#xff08;CITHS&#xff09;-CSDN博客 目录 智能武…

最新 Android 热门开源项目公布

这个库借鉴了 iOS 的 JTAppleCalendar&#xff0c;提供了比较齐全的日历视图所需特性&#xff0c;支持定制样式。 GitHub 仓库&#xff1a;kizitonwose/CalendarView Kyrie VectorDrawable 和 AnimatedVectorDrawable 的超集。 VectorDrawable 提供了像素密度无关性——在任…

交易股指期货有什么技巧吗?

交易股指期货有啥窍门呢&#xff1f;其实啊&#xff0c;追涨杀跌这招&#xff0c;虽然能挣点小钱&#xff0c;但风险也不小&#xff0c;一不小心就可能亏大了。我说的追涨杀跌&#xff0c;不是那种天天追着价格跑的小打小闹&#xff0c;而是要看大趋势&#xff0c;做宏观操作。…