Unity知识点 -- AssetBundle(AB包)

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:运行时构建

配置好设置之后,点击 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 包,通过它创建对象,会出现资源丢失的情况,需要把依赖包一起加载了,才能正常使用

依赖包的关键:利用主包获取依赖信息

// 利用主包获取依赖信息
// 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);
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值