AssetBundle(AB包)
1 AB 包是什么
特定于平台的资产压缩包,类似于压缩文件
资产包括:模型、贴图、预制体、音效、材质球等
2 AB 包的作用
2.1 相对于 Resources 下的资源,AB 包更好管理资源
- Resource:打包时定死,只读,无法修改
- AB包:存储位置可以自定义,压缩方式可以自定义,后期可以动态更新,通过 AB 包可以做热更新
2.2 减小包体大小:
- 压缩资源
- 减少初始包大小
2.3 热更新
- 资源热更新 – AssetBundle
- 脚本热更新 – Lua
热更新基本规则
3 生成 AB 包资源文件
3.1 下载 Asset Bundle Browser
打开 Asset Bundle Browser:Window - AssetBundle Browser
3.2 将资源关联进 AB 包
选择资源文件,在 Inspector 面板右下角,新建或选择打包名称
可以在 AssetBundle Browser - Configure 中发现刚刚打包的资源
注意:Unity 中无法将 C# 代码打进 AB 包,预设体内的组件虽然也是 C# 代码,但是它只是关联了 C# 脚本,只将关联的数据打进了 AB 包中(组件的本质是通过反射实现的)
3.3 进行 AB 包打包
点开 AssetBundle Browser - Build 界面
- Build Target:目标输出平台
- OutputPath:输出路径
- ClearFolders:是否清空文件夹,重新打包 – 建议勾选
- Copy to StreamingAssets:将打包文件复制到 StreamingAssets 中
- Advanced Settings:
- Compression:压缩方式
- No Compression:解压快,但是包较大
- LZMA:压缩的很小,但是解压慢,一旦需要使用,就会全部解压
- LZ4:压缩包大一点,用什么解压什么,内存占用低 – 建议使用
- Exclude Type Information:在资源包中不包含资源类型信息
- Force Rebuild:重新打包时需要重新构建包,和 Clear Folders 不同的是,它不会删除不再存在的包,建议还是选择 Clear Folders
- Ignore Type Tree Changes:增量构建检查时,忽略类型树的更改
- Append Hash:将文件的哈希值附加到资源包名上 – 用处不大
- Strict Mode:严格模式,如果打包时报错了,打包直接失败无法成功
- Dry Run Build:运行时构建
- Compression:压缩方式
配置好设置之后,点击 Build 进行打包
打开工程文件夹,可以发现 AssetBundles 文件下多了以下文件:
- PC(和目录名一样的包): 为主包,它记录了下面的其他 AB 包的依赖关系
- model:没有后缀名的文件为资源文件
- .manifest:AB 包文件信息,当加载时,提供了关键信息、资源信息、依赖关系、版本信息等
3.4 检查 AB 包
点击 AssetBundle Browser - Inspect,添加文件或者路径,可以检查项目中 AB 包中的信息
4 使用 AB 包资源文件
4.1 加载与卸载 AB 包
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
注意:AB包不能被重复加载,一般建议使用 StreamingAssets 的路径加载
ab.Unload(false); // 卸载单个AB包
true:卸载AB包的同时卸载所有加载的资源
false:只卸载AB包
AssetBundle.UnloadAllAssetBundles(false); // 同时卸载所有的AB包
4.2 加载 AB 包中的资源
三种加载方法,推荐使用泛型加载
GameObject circle = ab.LoadAsset<GameObject>("Circle");
GameObject obj1 = ab.LoadAsset("Skeletal") as GameObject;
GameObject obj2 = ab.LoadAsset("Skeletal", typeof(GameObject)) as GameObject;
加载之后,不要忘记生成资源实例
Instantiate(circle);
4.3 异步加载 AB 包及其资源
使用协程异步加载:
IEnumerator LoadABRes(string ABName, string resName) {
AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + ABName);
yield return abcr; // 等待加载结束再使用
AssetBundleRequest abr = abcr.assetBundle.LoadAssetAsync<AnimationClip>(resName);
yield return abr;
Debug.Log((AnimationClip)(abr.asset));
}
完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ABTest : MonoBehaviour
{
private void Start() {
// 同步加载
// 1.加载AB包 -- 通过StreamingAssets加载
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
// 2.加载AB包中的资源 -- 只使用名字加载会出现同名不同类型资源分不清,建议使用泛型加载
GameObject circle = ab.LoadAsset<GameObject>("Circle");
// GameObject obj1 = ab.LoadAsset("Skeletal") as GameObject;
// GameObject obj2 = ab.LoadAsset("Skeletal", typeof(GameObject)) as GameObject;
Instantiate(circle);
// AB包不能重复加载,否则会报错
GameObject square = ab.LoadAsset<GameObject>("Square");
Instantiate(square);
StartCoroutine(LoadABRes("animation", "Idle"));
// 卸载AB包
ab.Unload(false); // true:同时卸载所有加载的资源 false:只卸载AB包
AssetBundle.UnloadAllAssetBundles(false); // 同时卸载所有AB包
}
// 异步加载 -- 协程
IEnumerator LoadABRes(string ABName, string resName) {
AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + ABName);
yield return abcr; // 等待加载结束再使用
AssetBundleRequest abr = abcr.assetBundle.LoadAssetAsync<AnimationClip>(resName);
yield return abr;
Debug.Log((AnimationClip)(abr.asset));
}
}
5 AB 包依赖
在包中的一个资源如果使用了另外一个资源,将会被默认打到同一个包中
一个资源身上用到了别的 AB 包中的资源,如果只加载自己的 AB 包,通过它创建对象,会出现资源丢失的情况,需要把依赖包一起加载了,才能正常使用文章来源:https://www.toymoban.com/news/detail-649921.html
依赖包的关键:利用主包获取依赖信息文章来源地址https://www.toymoban.com/news/detail-649921.html
// 利用主包获取依赖信息
// 1.加载主包
AssetBundle abMain = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "StandaloneWindows");
// 2.加载主包中固定文件
AssetBundleManifest abManifest = abMain.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
// 3.从固定文件中,获取依赖信息,直接传入包名即可
string[] strs = abManifest.GetAllDependencies("model");
// 得到了依赖包的名字
foreach(string name in strs) {
Debug.Log(name);
}
到了这里,关于Unity知识点 -- AssetBundle(AB包)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!