Unity知识点 -- AssetBundle(AB包)

这篇具有很好参考价值的文章主要介绍了Unity知识点 -- AssetBundle(AB包)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AssetBundle(AB包)

1 AB 包是什么

特定于平台的资产压缩包,类似于压缩文件

资产包括:模型、贴图、预制体、音效、材质球等

2 AB 包的作用

2.1 相对于 Resources 下的资源,AB 包更好管理资源

  • Resource:打包时定死,只读,无法修改
  • AB包:存储位置可以自定义,压缩方式可以自定义,后期可以动态更新,通过 AB 包可以做热更新

2.2 减小包体大小:

  • 压缩资源
  • 减少初始包大小

2.3 热更新

  • 资源热更新 – AssetBundle
  • 脚本热更新 – Lua

热更新基本规则

unity ab包,Unity,unity,游戏引擎

3 生成 AB 包资源文件

3.1 下载 Asset Bundle Browser

打开 Asset Bundle Browser:Window - AssetBundle Browser

3.2 将资源关联进 AB 包

选择资源文件,在 Inspector 面板右下角,新建或选择打包名称

unity ab包,Unity,unity,游戏引擎

可以在 AssetBundle Browser - Configure 中发现刚刚打包的资源

unity ab包,Unity,unity,游戏引擎

注意: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 文件下多了以下文件:

unity ab包,Unity,unity,游戏引擎

  • 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

// 利用主包获取依赖信息
// 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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity热更新——AssetBundle(AB包)+管理器

    游戏或者软件更新时,无需重新下周客户端进行安装,而是在应用程序启动的情况下,在内部进行的资源或者代码更新 特定于平台的资产压缩包,有点类似压缩文件,资产包括:模型、贴图、预设体、音效、材质球等等 相对Resources下的资源,AB包更好管理资源,区别是: A

    2024年02月04日
    浏览(35)
  • 【Unity】AssetBundle资源异步加载以及AB包卸载

    以下代码是基于上一篇文章《AssetBundle资源同步加载》的代码新增了异步加载和AB包卸载功能,有兴趣的同学可以去看看我的上一篇文章。 由于异步加载需要配合协程进行功能开发,所以我对之前封装的AB包资源加载管理器进行修改,改为继承MonoBehaviour的单例模式。 主要修改

    2023年04月08日
    浏览(35)
  • 2023-06-08 Unity AssetBundle1——AB包介绍与使用

    一、AB 包介绍 ​ AB 包是特定于平台的资源压缩包,类似于压缩文件。其中资源可包括:模型、贴图、预设体、音效、材质球等等。 ​ 相较于 Resources 文件夹下的资源文件,AB 包能够更好管理资源: Resources 文件夹:打包时资源固定,只读,无法修改。 AB 包:存储位置可自定

    2024年02月16日
    浏览(39)
  • Unity 从服务器加载AssetBundle资源写入本地内存,并将下载保存的AB资源从本地内存加载至场景

    AB资源打包后有一个【目录文件】AssetBundle,他保存了所有AB资源的路径与名称, 通过aLLAssetBundleURL链接路径 组拼 从【目录文件】获得的AB资源的名字,然后再协程方法内编写相关代码,从而实现从服务器加载资源的功能。详细见代码。

    2024年02月13日
    浏览(40)
  • [游戏开发][Unity] Xlua生成wrap文件报错、打AB包Wrap报错

     Xlua生成wrap文件,自带添加了ref字段报错 例如Material生成MaterialWrap时,EnableKeyword(in LocalKeyword keyword);带着in,所以在Wrap文件中会自动在参数前生成ref导致编译不过 解决办法: 换Xlua版本就好了,也不知道我xlua当时从哪个版本copy过来的,换了xlua-master里的Xlua源码

    2024年02月04日
    浏览(52)
  • 【unity知识点】Unity 协程Coroutine

    Unity 协程是一种特殊的函数,可以在游戏中实现延迟执行、按顺序执行和异步操作等功能。它使用了迭代器(Iterator)的概念,通过 yield 来控制执行流程。下面是 Unity 协程的使用和使用场景的详细介绍。 在脚本中定义一个协程方法,返回值类型为 IEnumerator 。 在协程方

    2024年02月01日
    浏览(37)
  • unity开发知识点小结02

    虚拟轴就是一个数值在-1 1内的轴,这个数轴上重要的数值就是-1,0和1。当使用按键模拟一个完整的虚拟轴时需要用到两个按键,即将按键1设置为负轴按键,按键2设置为正轴按键。在没有按下任何按键的时候,虚拟轴的数值为0;在按下按键1的时候,虚拟轴的数值会从0 -1进行

    2024年02月07日
    浏览(46)
  • 【Unity】AB包下载

    a.AB包分类 一般地,将预制体作为AB包资源,不仅需要对预制体本身进行归类,还要对其涉及的动画(AnimationClip)、动画状态机(AnimatorController)、以及所用到的骨骼(Avatar)、模型(Mesh)、模型所用的材质(Matreial)、材质所用的图片(Images)、Shader等进行归类。 还有一种

    2024年01月23日
    浏览(38)
  • 【Unity知识点详解】自定义程序集

            今天来介绍一下Unity中的自定义程序集。在项目开发中我们经常接触到第三方插件的程序集,如DOTween、Newtonsoft.Json等。         使用自定义程序集有这么几个好处: 方便代码的的复用。当某一功能模块需要在多个项目中重复使用时,可以将代码编译成程序集,将程

    2024年02月19日
    浏览(43)
  • Unity3D知识点精华浓缩

    一、细节 1、类与组件的关系 2、Time.deltaTime的含义 3、怎么表示一帧的移动距离 4、Update和LateUpdate的区别和适用场景 5、找游戏对象的方式(别的对象 / 当前对象的子对象) 6、组件1调用组件2中方法的方式 7、在面板中获取外部数据的方法 8、序列化属性、序列化自定义对象的

    2024年04月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包