Unity AssetBundle打包与解包实战:从脚本编写到资源加载

【Unity】AssetBundle的使用——打包/解包 最近参考了各位大神的资源,初步学习了Unity的资源管理模式,包括在编辑器管理(使用AssetDatabase)和在运行时管理(使用Resources和AssetBundle)。在此简单总结运行时用AssetBundle动态打包/解包资源的方法,方便自己回顾。 关于AssetBundle有很多的细节问题,在此先作个笔记,等更多的问题搞清楚了/有了新的理解,再接着补充/修改。 创建编辑器菜单项,... 阅读详情

1. 为什么你需要掌握AssetBundle?

如果你正在用Unity做游戏,尤其是那种资源比较多的项目,比如有大量角色、场景、特效,或者想做热更新,那你迟早得和AssetBundle打交道。我刚开始接触的时候也觉得这玩意儿有点复杂,一堆概念,什么打包、依赖、加载策略,头都大了。但后来项目逼着我去用,踩过几次坑之后才发现,它其实就像我们平时整理文件一样,把不同的东西分门别类打包好,需要的时候再拿出来用,逻辑上并不难理解。

简单来说,AssetBundle(后面我们简称AB包)就是Unity提供的一种资源打包格式。你可以把游戏里的模型、贴图、预制体、场景甚至脚本(以资源形式)都塞进一个AB包里。它的核心价值有两个:一是资源管理,你可以按功能模块(比如“主城场景包”、“英雄皮肤包”)来组织资源,让项目结构更清晰;二是动态加载与热更新,游戏运行时可以从本地或者网络服务器下载新的AB包并加载里面的资源,这样你就不用为了更新一个角色皮肤而让玩家重新下载整个游戏安装包。

很多新手可能会问,Unity不是有Resources文件夹吗?直接把资源放里面,用Resources.Load加载不就行了?确实可以,但Resources有硬伤:它打包后是只读的,无法在发布后修改或追加。这意味着所有资源在构建时就被“焊死”在游戏里了。而AB包是独立的外部文件,可以随时替换、追加,灵活性高得多。所以,对于任何有资源动态加载需求的商业项目,AB包几乎是必选项。

2. 动手之前:理清AssetBundle的核心概念

在开始写代码之前,我们先花几分钟把几个关键概念搞清楚,这能帮你避开很多后期的“坑”。我自己就曾经因为没理解“依赖关系”,导致打包出来的AB包巨大无比,或者运行时资源丢失。

2.1 什么是AssetBundle? 你可以把它想象成一个压缩包(.zip或.rar),但这个压缩包是Unity特制的。里面可以包含多种类型的资产(Assets)。每个AB包都有一个唯一的标识名,也就是我们常说的Bundle Name。在Unity编辑器中,你可以为任意一个资源(比如一个Prefab预制体)设置它属于哪个AB包。

2.2 资源的依赖关系 这是AB包系统里最重要也最容易出错的一点。假设你的游戏里有一个“英雄_张三”的预制体,这个预制体用到了一个“盔甲_金色”的材质球,而这个材质球又引用了一张“贴图_金属.jpg”。当你把“英雄_张三”这个预制体标记为要打入hero_zhangsan这个AB包时,Unity默认不会自动把材质和贴图也打进去。 如果你只加载了hero_zhangsan包并实例化预制体,游戏里可能会出现一个紫色的模型(材质丢失)。因为材质和贴图没有被一起加载。为了解决这个问题,你有两个选择:一是把材质和贴图也标记到同一个AB包里;二是把它们分别打到不同的包(比如material_gold和texture_metal),然后在加载hero_zhangsan包之前,先加载它所依赖的材质包和贴图包。Unity提供了工具来帮你分析和管理这些依赖,我们后面会详细说。

2.3 打包选项(BuildAssetBundleOptions) 在调用打包API时,你会看到一个BuildAssetBundleOptions参数。它控制着打包的一些行为,比如:

  • None:最基础的选项。
  • UncompressedAssetBundle:不打压压缩。这样打包出来的文件很大,但加载时不需要解压,速度最快。适合本地调试或对加载速度极度敏感的场景。
  • ChunkBasedCompression (LZ4):这是Unity推荐也是目前最常用的选项。它使用LZ4压缩算法,在压缩率和加载速度之间取得了很好的平衡。加载时是流式解压,可以快速读取资源。
  • DisableWriteTypeTree:禁用类型树。这会让AB包稍微小一点,但意味着不同Unity版本生成的AB包可能无法互相加载,除非版本完全相同。一般不建议关闭,除非你对包体大小有极致要求且能严格管控版本。
  • DeterministicAssetBundle:确保打包结果具有确定性。即同样的资源输入,每次打包生成的AB包二进制内容完全一致。这对于需要做增量更新或版本对比的团队非常重要。

2.4 构建目标(BuildTarget) 这个参数指定AB包是给哪个平台用的。比如BuildTarget.StandaloneWindows64是给64位Windows电脑用的,BuildTarget.Android是给安卓用的,BuildTarget.iOS是给苹果手机用的。非常重要的一点是:不同平台的AB包不能混用! 你不能把打给Windows的包放到Android设备上去加载,会报错。所以通常我们会在打包脚本里根据当前项目的目标平台来设置这个参数。

3. 实战第一步:编写你的AssetBundle打包脚本

好了,理论铺垫得差不多了,我们直接上手写代码。我会带你写一个比原始文章里更健壮、功能更完整的打包脚本。

3.1 创建基础的打包脚本 就像原始文章里说的,我们首先在Unity项目的Assets/Editor文件夹下创建一个C#脚本。如果Editor文件夹不存在,就新建一个。这个文件夹下的脚本只在Unity编辑器环境下运行,不会被打进游戏包里。

我们来创建一个叫AssetBundleBuilder.cs的脚本。

using System.IO;
using UnityEditor;
using UnityEngine;

public class AssetBundleBuilder
{
    // 在Unity编辑器菜单栏添加一个选项
    [MenuItem("Tools/AssetBundle/构建所有AB包")]
    static void BuildAllAssetBundles()
    {
        // 1. 定义输出目录
        string outputPath = "Assets/StreamingAssets/AssetBundles";
        
        // 2. 确保输出目录存在
        if (!Directory.Exists(outputPath))
        {
            Directory.CreateDirectory(outputPath);
        }
        
        // 3. 执行打包
        BuildPipeline.BuildAssetBundles(
            outputPath,
            BuildAssetBundleOptions.ChunkBasedCompression, // 使用推荐的LZ4压缩
            EditorUserBuildSettings.activeBuildTarget // 自动使用当前项目的构建目标
        );
        
        // 4. 打包完成后提示
        Debug.Log($"Asset
unity AssetGraph AB包 打包/解包 使用 Asset Graph打包AB包 安装unity assetGraph (备注:AssetGraph 1.5 仅支持 Unity 2018.4.2f1以上,安装版本:AssetGraph 1.4 unity:2018.3.12f1) 只需要将文件拖入指定的文件夹就可以了(备注:我放在Asset/Plugs) 新建GraphEditor window->AssetGraph->o... 阅读详情

相关推荐

unity完整的打包,解包AssetBundle

在Editor文件下创建一个打包脚本,如下: using System.IO; using UnityEditor; public class BuildBundlesTest { [MenuItem("Window/BuildBundles")] static void BuildBundles() { string assetBundlesLibrary = "Assets/AssetsBundles"; if(!Directory.Exi

ThreePointsHeat的博客 4986

Unity AssetBundle打包解包实战:从脚本编写到资源加载全流程

本文详细解析Unity AssetBundle从资源规划到动态加载的全流程开发实践,涵盖打包策略、版本控制、加载优化等核心内容。通过实战代码示例展示高级打包配置、依赖管理技巧及热更新系统集成,帮助开发者高效实现资源动态加载与内存管理,提升Unity项目性能。

weixin_27070451的博客 378

Unity中使用AssetBundle打包与加载的注意事项

Unity中使用AssetBundle打包与加载的注意事项

虚粒世界 3770

Unity 关于AssetBundle(资源束)打包和加载(一)

在使用Unity制作大型场景的时候,往往需要加载大量的数据文件,尤其是对于模型、材质、贴图、特效等资源都是项目中不可缺少的一部分。数据量越大,数组加载就越慢,让用户长时间等待是一种非常差的体验。因此在项目制作前必须先要解决场景数据管路的问题。Unity3D提供了一种被叫做 AssetBundles(资源束)的外部整合数据,可以供我们资源管理使用。在游戏的运作当中,更新资源必不可少。我们可以将他们制作

isShaco的博客分享 1万+

AssetStudio深度解析:Unity资源逆向与AssetBundle解包实战指南

Unity资源序列化是引擎底层核心机制,其二进制格式(SerializedFile)决定了资源加载、依赖管理和运行时行为。理解该机制需掌握TypeTree结构、ObjectID索引与三类序列化体系(Assets/AssetBundle/ScriptableObject)的差异。AssetStudio作为字节级解析工具,不依赖Unity Editor,可直接还原Texture2D字段值、Material依赖链及MonoScript元数据,为热更新验证、崩溃分析和跨版本迁移提供可信依据。它支撑的真实场景包括AB

weixin_30335353的博客 977

Unity2021 AssetBundle资源打包

Unity2021 AssetBundle资源打包 AssetBundle是一种动态地资源加载方式。如果一次性地把资源导到游戏里,会使得游戏过大。可以把一些资源(例如:预制体、image、材质、music)与游戏主体分离,然后把这些分离的资源放到服务器上。当游戏需要该资源的时候就从服务器加载该资源,从而实现了资源的动态更新。 1. 打包的主要步骤 设置打包的对象 生成AssetBundle 上传到服务器 下载AssetBundle 加载对象 使用对象 2.设置打包对象 首先

weixin_39805744的博客 1702

【Unity实战100例】AssetBundle资源打包(一)

什么是Assetbundle? 它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file 和 resource files(序列化文件和源文件)。serialized file:资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个);resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载

纯技术流日常开发商业开发记录总结等 1万+

AssetStudiov0.15.32.zip

unity3d解包工具最新版 支持AssetBundle资源读取

UnityAB包资源提取

Unity AB包资源提取 框架查看

从零开始使用matlab实现EKF-SLAM算法(含完整代码)

扩展卡尔曼滤波器同步定位与建图 (EKF-SLAM) 算法建立在 EKF 的基础上,集成了 EKF 的功能,可解决机器人技术中最具挑战性的问题之一:同时定位与建图 (SLAM)。 EKF-SLAM采用EKF方法来同时估计机器人的状态和周围环境的布局,而无需事先了解位置。 这种双重功能对于在未知环境中运行的自主系统至关重要,使它们能够在绘制区域地图时有效导航。 EKF-SLAM 算法一直是自动驾驶车辆和机器人系统开发的基石,为处理现实世界环境中固有的不确定性提供了一个强大的框架。

mjmmm的博客 6636

SpringBoot项目启动后ShardingSphere5.0首次SQL查询慢?这个预热技巧帮你搞定

本文针对SpringBoot项目集成ShardingSphere 5.0后首次SQL查询慢的问题,深入剖析了其根源在于SQL解析引擎的懒加载与缓存初始化。文章提供了三种有效的预热技巧,包括精准的SQL解析引擎预热、简单查询触发全链路预热以及可配置的生产级方案,帮助开发者将初始化成本提前至应用启动阶段,从而消除性能毛刺,提升用户体验与系统稳定性。

chair的专栏 1063

电磁流量计模拟前端电路设计与优化

模拟前端电路(AFE)是传感器信号处理的核心环节,通过放大、滤波和模数转换实现信号调理。其设计需重点考虑放大器共模抑制比(CMRR)和ADC分辨率等关键参数,在电磁流量计等工业测量应用中,AD8220仪表放大器与AD7172-2 Σ-Δ型ADC的组合能有效简化传统多级架构。现代过采样技术结合数字滤波可替代模拟滤波器,显著提升系统集成度与测量精度,这种设计方法同样适用于压力传感、生物电信号采集等需要高精度信号调理的场景。

weixin_42602241的博客 618

嵌入式开发实战:LWIP中PPP协议配置全流程(含CHAP认证避坑指南)

本文是一份嵌入式开发实战指南,详细解析了如何在STM32平台上配置LWIP协议栈中的PPP协议,实现从串口到IP网络的完整连接。内容涵盖工程搭建、源码整合、关键配置、串口驱动绑定、状态管理以及CHAP认证等核心流程,并重点提供了CHAP认证失败的排查与避坑指南,帮助开发者高效打通嵌入式设备的网络连接。

plant的博客 464

使用Avalonia跨Linux平台

Avalonia类似使用WPF的技术方法来开发,所以,需要会使用WPF,其中的一些语法和写法与WPF有所区别,但是他们相差不大,会WPF的话,基本上可以看看文档后,完全掌握Avalonia的使用,从而达到跨平台开发的任务。其实写法有些不一样,可以参考官网的说明,进行修改。2. 安装完成后,重启VS2022,我们可以看到1和2,其中1是使用MVVM模式开发,2是普通模式开发,我们选择2,建立项目。9.直接双击粉红色的文件,进行安装,输入密码,但是美中不足的是,好像没有图标,图标似乎需要单独去设置。

故里2130 1万+

30天Python入门(第一天:Python入门)

30天带你入门Python,这是第一天

Science prince的博客 584

LVGL v8学习笔记 | 09 - 进度条控件的使用方法(bar)

lv_bar_set_range必须放在lv_bar_set_mode前面,否则不生效。bar对象的API在lv_bar.h中声明,以lv_bar_xxx命名。此事件可以用来在进度条更新值之后更新别的控件(比如进度条旁边的文字)。可以看到,默认创建的进度条值是0到100。(3)设置进度条的范围值(最大值和最小值)(2)获取进度条的起始值。(3)获取进度条的最小值。(4)获取进度条的最大值。(1)设置进度条的当前值。(2)设置进度条的起始值。(1)获取进度条当前值。(5)获取进度条的模式。

Mculover666的博客(嵌入式) 1730

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 从零构建ResNet18模型:Kaggle树叶分类竞赛实战指南
下一篇: Linux 环境下 Milvus 数据库的 Docker 部署与性能优化指南
lambda
博客等级 码龄23年 49粉丝 1303原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值