千家信息网

Unity AssetBundle入门知识点有哪些

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,今天小编给大家分享一下Unity AssetBundle入门知识点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有
千家信息网最后更新 2026年11月03日Unity AssetBundle入门知识点有哪些

今天小编给大家分享一下Unity AssetBundle入门知识点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1. AssetBundle的定义和作用

AssetBundle(简称AB包)是一个资源压缩包,包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行的时候被加载;

AssetBundle自身保存着互相的依赖关系;

压缩包可以使用LZMA和LZ4压缩算法,减少包大小,更快的进行网络传输;

把一些可以下载内容放在AssetBundle里面,可以减少安装包的大小;

2. 什么是AssetBundle?

它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file 和 resource files。(序列化文件和源文件)

serialized file:资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个)

resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载,可以Editor上读取,方便查看

它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。

3. AssetBundle使用步骤

指定资源的AssetBundle属性

(xxxa/xxx)这里xxxa会生成目录,名字为xxx。'/'可以用于目录划分,Remove UnUsed name 可以移除没有使用的属性名

构建AssetBundle包

上传AB包

加载AB包和包里面的资源

4. 代码打包AssetBundle

使用编辑器扩展方法,将打包按钮Build AssetBundles放于Asset菜单下

using UnityEditor;

using System.IO;

public class CreateAssetBundles{    [MenuItem("Assets/Build AssetBundles")]    static void BuildAllAssetBundles()    {        string dir = "AssetBundles";        if (Directory.Exists(dir) == false)        {            Directory.CreateDirectory(dir);        }        //BuildTarget 选择build出来的AB包要使用的平台        BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);    }}

压缩方式

Build的路径(随意只要是在硬盘上都可以的)

BuildAssetBundleOptions

BuildAssetBundleOptions.None:使用LZMA算法压缩,压缩的包更小,但是加载时间更长。使用之前需要整体解压。一旦被解压,这个包会使用LZ4重新压缩。使用资源的时候不需要整体解压。在下载的时候可以使用LZMA算法,一旦它被下载了之后,它会使用LZ4算法保存到本地上。

BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快

BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部。

注意:使用LZ4压缩,可以获得可以跟不压缩想媲美的加载速度,而且比不压缩文件要小。

依赖打包

将需要同时加载的资源放在同一个包里,各个包之间会保存相互依赖的信息

5. AssetBundle的加载和卸载

AB的加载

在开发阶段将AB包放在本地,开发结束后再上传到服务器

public class LoadFromLocal : MonoBehaviour{    private void Start()    {        AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/scene/wall.jy");        GameObject obj = ab.LoadAsset("wall");        Instantiate(obj);    }}
private void Start(){    AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes("AssetBundles/scene/cube.jy"));    GameObject obj = ab.LoadAsset("Cube(Clone)");    Instantiate(obj);}
IEnumerator Start(){    AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes("AssetBundles/scene/cube.jy"));    yield return request;    AssetBundle ab = request.assetBundle;    GameObject obj = ab.LoadAsset("Cube(Clone)");    Instantiate(obj);}
 IEnumerator Start(){    while (Caching.ready == false)    {        yield return null;    }

WWW www = WWW.LoadFromCacheOrDownload(@"file://E:\U3D-Projects\Test2017.2.0\AssetBundles\scene\cube.jy", 1); yield return www; if (!string.IsNullOrEmpty(www.error)) { Debug.Log(www.error); yield break; } AssetBundle ab = www.assetBundle; GameObject obj = ab.LoadAsset("Cube(Clone)"); Instantiate(obj);}
 IEnumerator Start(){    string url = @"file:///E:\U3D-Projects\Test2017.2.0\AssetBundles\scene\cube.jy";    UnityWebRequest request = UnityWebRequest.GetAssetBundle(url);    yield return request.SendWebRequest();    //方式一    //AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);    //方式二    AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;    GameObject obj = ab.LoadAsset("Cube(Clone)");    Instantiate(obj);}

AB加载方式:

AssetBundle.LoadFromFile 从本地加载

AssetBundle.LoadFromMemory 从内存加载

WWW.LoadFromCacheOrDownload 下载后放在缓存中备用(该方法逐渐被弃用)

UnityWebRequest 从服务器下载

从AB中加载资源:

AssetBundle.LoadAsset(assetName)

AssetBundle.LoadAllAssets() 加载AB包中所有的对象,不包含依赖的包

AssetBundle.LoadAssetAsync() 异步加载,加载较大资源的时候

AssetBundle.LoadAllAssetsAsync() 异步加载全部资源

AssetBundle.LoadAssetWithSubAssets 加载资源及其子资源

AB的卸载

减少内存的使用

有可能导致丢失

在切换场景,或者确定不使用的时候卸载

AssetBundle.Unload(true) 卸载所有资源,包含其中正被使用的资源

AssetBundle.Unload(false) 卸载所有没被使用的资源

Resources.UnloadUnusedAssets 卸载个别未使用的资源

6. AssetBundle分组策略总结

逻辑实体分组

一个UI界面或者所有UI界面一个包(这个界面里面的贴图和布局信息一个包)

一个角色或者所有角色一个包(这个角色里面的模型和动画一个包)

所有的场景所共享的部分一个包(包括贴图和模型)

按照类型分组

所有声音资源打成一个包,所有shader打成一个包,所有模型打成一个包,所有材质打成一个包

按照使用分组

把在某一时间内使用的所有资源打成一个包。可以按照关卡分,一个关卡所需要的所有资源包括角色、贴图、声音等打成一个包。也可以按照场景分,一个场景所需要的资源一个包

注意

经常更新的资源放在一个单独的包里面,跟不经常更新的包分离

把需要同时加载的资源放在一个包里面

可以把其他包共享的资源放在一个单独的包里面

把一些需要同时加载的小资源打包成一个包

如果对于一个同一个资源有两个版本,可以考虑通过后缀来区分,例如v1、v2、v3

7. Manifest文件

什么是Manifest文件

crc为校验码,通过其检查是否完整

Assets 表示包里包含多少资源

Dependencies 表示包有哪些依赖

注意:在加载这些包之前,也需要加载依赖的包,不然会丢失这部分内容,显示效果不正确

通过Manifest文件得到某个包的依赖

可以注意到scene/cube.jy依赖于material.jy,而material.jy依赖于texture.jy

AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");AssetBundleManifest manifest = manifestAB.LoadAsset("AssetBundleManifest");//GetAllDependencies获取到所有的依赖对象string[] strs = manifest.GetAllDependencies("scene/cube.jy");//将所有依赖对象依次加载出来foreach (var item in strs){    Debug.Log(item);      AssetBundle.LoadFromFile("AssetBundles/" + item);}

如此,对象的材质也加载显示出来:

8. 文件校验

CRC、MD5、SHA1都是通过对数据进行计算,来生成一个校验值,该校验值用来校验数据的完整性。

CRC一般用于通信数据的校验,MD5和SHA1用于安全领域,例如文件校验,密码加密等

9. AssetBundles浏览工具

GitHub下载地址

工具面板如下:

Build Target 用于设置AB包的目标平台

OutPut Path 设置AB的输出路径

Build 一键打包

以上就是"Unity AssetBundle入门知识点有哪些"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

资源 文件 对象 知识 内容 场景 时候 声音 方式 模型 算法 篇文章 角色 贴图 分组 知识点 同时 数据 界面 更新 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州为想互联网科技有限公司 哈尔滨大商圈互联网科技有限公司 中关村互联网科技集团 互联网科技有限公司经营范围 美国互联网科技巨头监管 互联网科技小贷 以房互联网科技 互联网与新科技 互联网科技公司官网 极限挑战互联网科技 互联网公司会议桌创意科技软装饰 承德科技产业互联网发展 金融科技与互联网金融相同和不同 港股科技和互联网 浙江互联网科技研学营 高科技互联网发展前景如何 明优互联网科技有限公司 互联网科技包装股份有限公司上市 世界互联网科技成果奖 科技互联网专业务虚会材料 深圳市人人互联网科技有限公司 互联网佳科技有限公司 广州善班互联网科技 猫创互联网科技 富国互联网科技创新基金 剑昆互联网络科技有限公司临桂 中化能源互联网科技招聘 全球顶尖互联网科技公司 福建互联网展示科技馆设计 玉溪新华互联网科技怎么选
0