当前位置: 首页 > news >正文

Unity | AssetBundle

1 定义

Unity中的一种特殊资源包格式,用于存储和分发游戏资源。这些资源可以包括模型、纹理、音频文件、预制体、场景等。
AssetBundle允许开发者在游戏运行时动态加载和卸载资源,从而实现灵活的资源管理。

2 使用场景

1、资源管理
有效管理游戏中的资源,按需下载需要的资源,减少内存消耗,提高游戏加载速度和响应时间。

2、游戏热更新
实现游戏热更新的重要手段。开发者可以在游戏发布后,通过服务器更新AssetBundle,从而更新或替换游戏中的资源,而无需重新发布整个游戏。可以快速修复bug,添加新内容或更新现有内容。

3、DLC(下载内容)
大型游戏通过DLC增加游戏内容。这些DLC通常包含新的关卡、角色、武器等。

3 使用

1、标记资源

在Unity编辑器中,选择需要打包的资源设置AssetBundle标签

2、创建和构建AssetBundle

编写并运行一个Editor脚本来构建AssetBundle

3、加载AssetBundle

在游戏运行时通过脚本加载AssetBundle

4、使用资源

加载AssetBundle后通过脚本获取并使用资源

5、卸载AssetBundle

使用完AssetBundle后,即使卸载释放内存

4 代码实现

编辑器脚本——构建AssetBundle
BuildPipeline

UnityEditor命名空间下的一个静态类,提供了构建玩家(Player)、资源包(如AssetBundles)和管理构建过程的功能。

常用方法(构建资源包):
BuildPipeline.BuildAssetBundles:
参数:
outputPath: 输出路径。
assetBundleOptions: 构建选项。
target: 目标平台。
builds: 要构建的 AssetBundle 列表(可选)。

public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget target);
public static AssetBundleManifest BuildAssetBundles(string outputPath, AssetBundleBuild[] builds, BuildAssetBundleOptions assetBundleOptions, BuildTarget target);
AssetBundleBuild

UnityEditor命名空间下的一个结构体,用于描述如何打包AssetBundle的一个数据结构。定义了哪些资源文件应该被打包成AssetBundle及该AssetBundle的名称、

包含以下字段:
·  assetBundleName::string 类型。AssetBundle 的名称。
·  assetBundleVariant:string 类型。AssetBundle 的变体名称(可选)。
·  assetNames:string[] 类型。包含在 AssetBundle 中的资源路径数组。
·  addressableNames:string[] 类型。资源在 AssetBundle 中的可寻址名称(可选)。

using UnityEditor;public class BuildAssetBundles
{[MenuItem("Assets/Build AssetBundles")]static void BuildAllAssetBundles(){// 定义一个 AssetBundleBuild 对象AssetBundleBuild assetBundleBuild = new AssetBundleBuild();// 设置 AssetBundle 的名称assetBundleBuild.assetBundleName = "examplebundle";// 设置包含在 AssetBundle 中的资源路径数组assetBundleBuild.assetNames = new string[]{"Assets/ExampleFolder/ExampleAsset1.prefab","Assets/ExampleFolder/ExampleAsset2.prefab"};// 创建打包列表AssetBundleBuild[] buildMap = new AssetBundleBuild[] { assetBundleBuild };// 指定输出路径string outputPath = "Assets/AssetBundles";// 构建 AssetBundlesBuildPipeline.BuildAssetBundles(outputPath, buildMap, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);}
}
AssetDatabase
Code
static void Build(BuildTarget target){//创建AssetBundleBuild打包列表List<AssetBundleBuild> assetBundleBuilds = new List<AssetBundleBuild>();List<string> bundleInfos = new List<string>();                                                      //文件信息列表//填充列表string[] files = Directory.GetFiles(PathUtil.BuildResourcesPath, "*", SearchOption.AllDirectories);    //获取BuildResourcesPath目录下所有文件for (int i = 0; i < files.Length; i++)    //根据文件构建AssetBundleBuild对象{//跳过meta文件if (files[i].EndsWith(".meta"))continue;//处理要打包的文件,根据BundleResources中文件创建AssetBundleBuild对象AssetBundleBuild assetBundle = new AssetBundleBuild();    //创建一个新的AssetBundleBuild对象string fileName = PathUtil.GetStandardPath(files[i]);     //获取标准化后的文件路径Debug.Log("files:" + fileName);    //Logstring assetName = PathUtil.GetUnityPath(fileName);    //获取相对于Assets文件夹的路径assetBundle.assetNames = new string[] { assetName };   //设置assetBundle的资源名称string bundleName = fileName.Replace(PathUtil.BuildResourcesPath, "").ToLower();assetBundle.assetBundleName = bundleName + ".ab";      //设置assetBundle的名称//将AssetBundleBuild对象加入打包列表assetBundleBuilds.Add(assetBundle);//添加文件和依赖信息List<string> dependenceInfo = GetDependence(assetName);string bundleInfo = assetName + "|" + bundleName + ".ab";if (dependenceInfo.Count > 0)bundleInfo = bundleInfo + "|" + string.Join("|", dependenceInfo);bundleInfos.Add(bundleInfo);}//检查并初始化输出文件夹if (Directory.Exists(PathUtil.BundleOutPath))Directory.Delete(PathUtil.BundleOutPath, true);Directory.CreateDirectory(PathUtil.BundleOutPath);//构建AssetBundlesBuildPipeline.BuildAssetBundles(PathUtil.BundleOutPath, assetBundleBuilds.ToArray(), BuildAssetBundleOptions.None, target);File.WriteAllLines(PathUtil.BundleOutPath + "/" + AppConst.FileListName, bundleInfos);AssetDatabase.Refresh();}
static List<string> GetDependence(string curFile){List<string> dependence = new List<string>();string[] files = AssetDatabase.GetDependencies(curFile);dependence = files.Where(file => !file.EndsWith(".cs") && !file.Equals(curFile)).ToList();return dependence;}
运行时脚本——加载和使用AB包
AssetBundle

用于在运行时加载和管理预先打包的资源

常用方法:

AssetBundle.LoadFromFile:从本地文件系统中同步加载

public static AssetBundle LoadFromFile(string path);
public static AssetBundle LoadFromFile(string path, uint crc);
public static AssetBundle LoadFromFile(string path, uint crc, ulong offset);

参数:
· path: AssetBundle 文件的路径。
· crc(可选): 用于校验的 CRC 值。
· offset(可选): 文件偏移量。
返回值:
· 加载的 AssetBundle 实例。

AssetBundle.LoadFromFileaAsync:从本地文件系统异步加载

public static AssetBundleCreateRequest LoadFromFileAsync(string path);
public static AssetBundleCreateRequest LoadFromFileAsync(string path, uint crc);
public static AssetBundleCreateRequest LoadFromFileAsync(string path, uint crc, ulong offset);

参数:
· path: AssetBundle 文件的路径。
· crc(可选): 用于校验的 CRC 值。
· offset(可选): 文件偏移量。
返回值:
· AssetBundleCreateRequest,表示异步加载操作的请求。

AssetBundle.LoadAssetAsync:从已加载的AssetBundle中异步加载指定类型的资源

public AssetBundleRequest LoadAssetAsync<T>(string name) where T : UnityEngine.Object;
public AssetBundleRequest LoadAssetAsync(string name, Type type);

参数:
· name: 资源名称。
· type: 资源类型。
返回值:
· AssetBundleRequest,表示异步加载操作的请求。

AssetBundle.Unload:卸载已经加载的AssetBundle

public void Unload(bool unloadAllLoadedObjects);

参数:
unloadAllLoadedObject:是否卸载所有已加载的资源对象

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 卢小姐的生日礼物(200分) - 三语言AC题解(Python/Java/Cpp)
  • 哪些企业适合做ISO27001信息安全管理体系?
  • 定制QCustomPlot 带有ListView的QCustomPlot 全网唯一份
  • SpringAI简单使用(本地模型+自定义知识库)
  • Linux处理文件sed
  • Java 新手学习线路,Java 学习路线是怎样的?
  • uniapp自定义tabBar
  • unity2022 il2cpp 源码编译
  • 信息检索(39):Condenser: a Pre-training Architecture for Dense Retrieval
  • SpringBoot源码深度解析
  • # Redis 入门到精通(九)-- 主从复制(1)
  • buu做题(6)
  • 时间卷积网络(TCN):序列建模的强大工具(附Pytorch网络模型代码)
  • 入门 git
  • MySQL:SELECT 语句
  • 【RocksDB】TransactionDB源码分析
  • 【技术性】Search知识
  • ➹使用webpack配置多页面应用(MPA)
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Android开源项目规范总结
  • axios 和 cookie 的那些事
  • CentOS7简单部署NFS
  • Git初体验
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Java|序列化异常StreamCorruptedException的解决方法
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • k个最大的数及变种小结
  • laravel 用artisan创建自己的模板
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Lsb图片隐写
  • PHP的类修饰符与访问修饰符
  • python_bomb----数据类型总结
  • Vue2.x学习三:事件处理生命周期钩子
  • vue-cli在webpack的配置文件探究
  • vue的全局变量和全局拦截请求器
  • 分布式熔断降级平台aegis
  • 简析gRPC client 连接管理
  • 利用DataURL技术在网页上显示图片
  • 七牛云假注销小指南
  • 入门到放弃node系列之Hello Word篇
  • 实现简单的正则表达式引擎
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 详解移动APP与web APP的区别
  • zabbix3.2监控linux磁盘IO
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #define用法
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (Oracle)SQL优化技巧(一):分页查询
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • ***原理与防范
  • ..回顾17,展望18
  • .“空心村”成因分析及解决对策122344