当前位置: 首页 > 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:是否卸载所有已加载的资源对象

相关文章:

Unity | AssetBundle

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

【虚幻引擎】C++网络通信TCP和HTTP实战开发全流程,以接入科大讯飞星火大模型和文心一言千帆大模型为案例讲解

本套课程介绍了使用我们的虚幻C去写开发我们的插件开发&#xff0c;如何使用我们的虚幻C 封装我们的TCP和HTTP&#xff0c;如何使用的我们虚幻C子系统&#xff0c;如何根据第三方文档去写接口请求&#xff0c;如何通过我们的加密算法去签名我们的URL&#xff0c;如何声明我们的…...

.NET单元测试使用AutoFixture按需填充的方法总结

AutoFixture是一个.NET库&#xff0c;旨在简化单元测试中的数据设置过程。通过自动生成测试数据&#xff0c;它帮助开发者减少测试代码的编写量&#xff0c;使得单元测试更加简洁、易读和易维护。AutoFixture可以用于任何.NET测试框架&#xff0c;如xUnit、NUnit或MSTest。 默…...

求职学习day5

安排明天hr面 投一下平安可能。 hr面准备&#xff0c;复习java核心技术&#xff0c;复习java项目。 正视自己&#xff0c;调整心态。 也是很早接触了javaguide但是没有持续学习&#xff0c;项目介绍 | JavaGuide&#xff0c;面试前复习一下感觉还是很有收获的。 还有一些…...

微服务常用的中间件有哪些?都有什么用途?

前言 最近整理一下我们的项目使用了哪些中间件&#xff0c;借此机会也来分享一下&#xff0c;在微服务架构中我们常用的那些中间件&#xff0c;都有什么作用&#xff0c;为什么要使用中间件。 消息中间件-RocketMQ 比如RocketMQ&#xff0c;RocketMQ 是一个开源的分布式消息…...

华为云认证

华为云认证 首页 云原生 DevOps工作级开发者认证&#xff1a;HCCDP – Cloud Native DevOps 对云上敏捷开发感兴趣的人员&#xff0c;培训DevOps的理论知识及在云端交付软件全生命周期的实操能力。 DevOps...

【Linux学习】常用基本指令

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a;Linux学习 目录 &#x1f308;前言&#x1f525;XShell的一些使用查看Linux主机IP使用XShell登录主机XShell下的复制粘贴 &#x1f525;Linux下常用基本指令ls指令pwd指令cd指定touch指令…...

windows上安装Apache

安装前须知&#xff1a; 下载并安装&#xff0c;如未完成&#xff0c;请访问下载页面。安装Apache前需要安装Visual C Redistributable for Visual Studio 2015-2022 x64。 解压与配置&#xff1a; 将Apache24文件夹解压至C:\Apache24&#xff08;这是配置中的ServerRoot&am…...

wps office 2019 Pro Plus 集成序列号Vba安装版教程

前言 wps office 2019专业增强版含无云版是一款非常方便的办公软件&#xff0c;我们在日常的工作中总会碰到需要使用WPS的时候&#xff0c;它能为我们提供更好的文档编写帮助我们更好的去阅读PDF等多种格式的文档&#xff0c;使用起来非常的快捷方便。使用某银行专业增强版制作…...

院内影像一体化平台PACS源码,C#语言的PACS/RIS系统,二级医院应用案例

全院级PACS系统源码&#xff0c;一体化应用系统整合&#xff0c;满足放射、超声、内窥镜中心、病理、检验等多个科室的工作流程和需求&#xff0c;为不同科室提供专业的解决方案&#xff0c;实现了全院乃至区域内信息互联互通、数据统一存储与管理等功能&#xff0c;做到以病人…...

基于java的设计模式学习

PS &#xff1a;以作者的亲身来看&#xff0c;这东西对于初学者来说有用但不多&#xff0c;这些东西&#xff0c;更像一种经验的总结&#xff0c;在平时开发当中一般是用不到的&#xff0c;因此站在这个角度上用处不大。 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模块搭建自动灌溉系统实现远程控制

自动灌溉系统又叫土壤墒情监控系统&#xff0c;土壤墒情监控系统主要实现固定站无人值守情况下的土壤墒情数据的自动采集和无线传输&#xff0c;数据在监控中心自动接收入库&#xff1b;可以实现24小时连续在线监控并将监控数据通过有线、无线等传输方式实时传输到监控中心生成…...

Python正则表达式中的分组

表达式中的分组 它是可以通过" () “来进行分组&#xff0c;更专业的表达就是捕获组&#xff0c;每个完整的” () “可以分为一组&#xff0c;同时&#xff0c;” () “中还可以嵌套” () "&#xff0c;即组之间还可以存在更小的组 概念 1、当我们在一个正则表达式…...

openstack设置IP直接登录,不需要加dashboard后缀

openstack 实验环境&#xff0c;openstack-t版&#xff0c;centos2009 修改配置文件 [rootcontroller ~]# vim /WEBROOT /etc/openstack-dashboard/local_settings #将dashboard去掉 WEBROOT /dashboard/ #改为 WEBROOT /[rootcontroller ~]# vim /etc/httpd/conf.d/openst…...

PHP宠物店萌宠小程序系统源码

&#x1f43e;萌宠生活新方式&#x1f43e; &#x1f3e1;【一键直达萌宠世界】 你是否也梦想着拥有一家随时能“云撸猫”、“云吸狗”的神奇小店&#xff1f;现在&#xff0c;“宠物店萌宠小程序”就是你的秘密花园&#xff01;&#x1f31f;只需轻轻一点&#xff0c;就能瞬…...

nginx负载均衡实例

实现效果 浏览器输入地址http://nginx服务器ip(:80)/edu/a.html&#xff0c;实现负债均衡效果&#xff0c;平均分配到 服务器ip:8080和 服务器ip:8081进程中。 准备工作 准备两个tomcat&#xff0c;一个监听在8080端口&#xff0c;一个监听在8081端口。也可以准备多个tomcat。…...

正则表达式在Python中的高级应用:从HTML中提取数据

正则表达式在Python中的高级应用&#xff1a;从HTML中提取数据 作为一名资深的Python程序员&#xff0c;我深知正则表达式在文本处理中的重要性。尤其是在处理HTML文档时&#xff0c;正则表达式可以成为我们提取数据的强大工具。在本文中&#xff0c;我将通过一个实际的例子&a…...

docker compose 部署交互模式的容器-以Ubuntu为例

docker compose 部署交互模式的容器-以Ubuntu为例 问题介绍解决方式 同步发布在个人笔记docker compose 部署交互模式的容器-以Ubuntu为例 问题介绍 想通过 docker compose 方式部署一个交互模式的 Ubuntu 容器&#xff0c;但是以平常的方式执行部署后&#xff0c;发现容器被创…...

display: flex 和 justify-content: center 强大居中

你还在为居中而烦恼吗&#xff0c;水平居中多个元素、创建响应式布局、垂直和水平同时居中内容。它&#xff0c;display: flex 和 justify-content: center 都可以完成&#xff01; display: flex&#xff1a;将元素定义为flex容器 justify-content&#xff1a;定义项目在主轴…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...