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:是否卸载所有已加载的资源对象
相关文章:
Unity | AssetBundle
1 定义 Unity中的一种特殊资源包格式,用于存储和分发游戏资源。这些资源可以包括模型、纹理、音频文件、预制体、场景等。 AssetBundle允许开发者在游戏运行时动态加载和卸载资源,从而实现灵活的资源管理。 2 使用场景 1、资源管理 有效管理游戏中的资…...
【虚幻引擎】C++网络通信TCP和HTTP实战开发全流程,以接入科大讯飞星火大模型和文心一言千帆大模型为案例讲解
本套课程介绍了使用我们的虚幻C去写开发我们的插件开发,如何使用我们的虚幻C 封装我们的TCP和HTTP,如何使用的我们虚幻C子系统,如何根据第三方文档去写接口请求,如何通过我们的加密算法去签名我们的URL,如何声明我们的…...
.NET单元测试使用AutoFixture按需填充的方法总结
AutoFixture是一个.NET库,旨在简化单元测试中的数据设置过程。通过自动生成测试数据,它帮助开发者减少测试代码的编写量,使得单元测试更加简洁、易读和易维护。AutoFixture可以用于任何.NET测试框架,如xUnit、NUnit或MSTest。 默…...
求职学习day5
安排明天hr面 投一下平安可能。 hr面准备,复习java核心技术,复习java项目。 正视自己,调整心态。 也是很早接触了javaguide但是没有持续学习,项目介绍 | JavaGuide,面试前复习一下感觉还是很有收获的。 还有一些…...
微服务常用的中间件有哪些?都有什么用途?
前言 最近整理一下我们的项目使用了哪些中间件,借此机会也来分享一下,在微服务架构中我们常用的那些中间件,都有什么作用,为什么要使用中间件。 消息中间件-RocketMQ 比如RocketMQ,RocketMQ 是一个开源的分布式消息…...
华为云认证
华为云认证 首页 云原生 DevOps工作级开发者认证:HCCDP – Cloud Native DevOps 对云上敏捷开发感兴趣的人员,培训DevOps的理论知识及在云端交付软件全生命周期的实操能力。 DevOps...
【Linux学习】常用基本指令
🔥个人主页: Forcible Bug Maker 🔥专栏:Linux学习 目录 🌈前言🔥XShell的一些使用查看Linux主机IP使用XShell登录主机XShell下的复制粘贴 🔥Linux下常用基本指令ls指令pwd指令cd指定touch指令…...
windows上安装Apache
安装前须知: 下载并安装,如未完成,请访问下载页面。安装Apache前需要安装Visual C Redistributable for Visual Studio 2015-2022 x64。 解压与配置: 将Apache24文件夹解压至C:\Apache24(这是配置中的ServerRoot&am…...
wps office 2019 Pro Plus 集成序列号Vba安装版教程
前言 wps office 2019专业增强版含无云版是一款非常方便的办公软件,我们在日常的工作中总会碰到需要使用WPS的时候,它能为我们提供更好的文档编写帮助我们更好的去阅读PDF等多种格式的文档,使用起来非常的快捷方便。使用某银行专业增强版制作…...
院内影像一体化平台PACS源码,C#语言的PACS/RIS系统,二级医院应用案例
全院级PACS系统源码,一体化应用系统整合,满足放射、超声、内窥镜中心、病理、检验等多个科室的工作流程和需求,为不同科室提供专业的解决方案,实现了全院乃至区域内信息互联互通、数据统一存储与管理等功能,做到以病人…...
基于java的设计模式学习
PS :以作者的亲身来看,这东西对于初学者来说有用但不多,这些东西,更像一种经验的总结,在平时开发当中一般是用不到的,因此站在这个角度上用处不大。 1.工厂模式 1.1 简单工厂模式 我们把new 对象逻辑封装…...
组合数学+费用背包+刷表,G2 - Playlist for Polycarp (hard version)
目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 G2 - Playlist for Polycarp (hard version) 二、解题报告 1、思路分析 一…...
阿尔泰科技利用485模块搭建自动灌溉系统实现远程控制
自动灌溉系统又叫土壤墒情监控系统,土壤墒情监控系统主要实现固定站无人值守情况下的土壤墒情数据的自动采集和无线传输,数据在监控中心自动接收入库;可以实现24小时连续在线监控并将监控数据通过有线、无线等传输方式实时传输到监控中心生成…...
Python正则表达式中的分组
表达式中的分组 它是可以通过" () “来进行分组,更专业的表达就是捕获组,每个完整的” () “可以分为一组,同时,” () “中还可以嵌套” () ",即组之间还可以存在更小的组 概念 1、当我们在一个正则表达式…...
openstack设置IP直接登录,不需要加dashboard后缀
openstack 实验环境,openstack-t版,centos2009 修改配置文件 [rootcontroller ~]# vim /WEBROOT /etc/openstack-dashboard/local_settings #将dashboard去掉 WEBROOT /dashboard/ #改为 WEBROOT /[rootcontroller ~]# vim /etc/httpd/conf.d/openst…...
PHP宠物店萌宠小程序系统源码
🐾萌宠生活新方式🐾 🏡【一键直达萌宠世界】 你是否也梦想着拥有一家随时能“云撸猫”、“云吸狗”的神奇小店?现在,“宠物店萌宠小程序”就是你的秘密花园!🌟只需轻轻一点,就能瞬…...
nginx负载均衡实例
实现效果 浏览器输入地址http://nginx服务器ip(:80)/edu/a.html,实现负债均衡效果,平均分配到 服务器ip:8080和 服务器ip:8081进程中。 准备工作 准备两个tomcat,一个监听在8080端口,一个监听在8081端口。也可以准备多个tomcat。…...
正则表达式在Python中的高级应用:从HTML中提取数据
正则表达式在Python中的高级应用:从HTML中提取数据 作为一名资深的Python程序员,我深知正则表达式在文本处理中的重要性。尤其是在处理HTML文档时,正则表达式可以成为我们提取数据的强大工具。在本文中,我将通过一个实际的例子&a…...
docker compose 部署交互模式的容器-以Ubuntu为例
docker compose 部署交互模式的容器-以Ubuntu为例 问题介绍解决方式 同步发布在个人笔记docker compose 部署交互模式的容器-以Ubuntu为例 问题介绍 想通过 docker compose 方式部署一个交互模式的 Ubuntu 容器,但是以平常的方式执行部署后,发现容器被创…...
display: flex 和 justify-content: center 强大居中
你还在为居中而烦恼吗,水平居中多个元素、创建响应式布局、垂直和水平同时居中内容。它,display: flex 和 justify-content: center 都可以完成! display: flex:将元素定义为flex容器 justify-content:定义项目在主轴…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
