当前位置: 首页 > article >正文

详解u3d之AssetBundle

一.AssetBundle的概念

“AssetBundle”可以指两种不同但相关的东西。

1.1 AssetBundle指的是u3d在磁盘上生成的存放资源的目录

目录包含两种类型文件(下文简称AB包):

  • 一个序列化文件,其中包含分解为各个对象并写入此单个文件的资源。
  • 资源文件,这是为某些资源(纹理和音频)单独存储的二进制数据块,允许 Unity 高效地在另一个线程上从磁盘加载它们。

1.2 AssetBundle可以指在代码层面,AssetBundle这个类的对象

该对象包含添加到此存档文件的资源的所有文件路径的映射。

二.AssetBundle的作用

  • 更新非代码资源
  • 减少安装包大小
  • 加载最终用户平台优化的资源

三.AssetBundle 工作流程

3.1 为 AssetBundle 分配资源

1.选中资源

2.Inspector中底部点开下拉选单

3.点击New

4.输入目录/文件名

5.输入后缀

3.2 构建 AssetBundle

在 Assets 文件夹中创建一个名为 Editor 的文件夹,并将包含以下内容的脚本放在该文件夹中:

using UnityEditor;
using System.IO;
public class BuildAssetBundle
{
    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string assetBundleDirectory = "Assets/AssetBundles";
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }
        BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    }
}

此脚本将在 Assets 菜单底部创建一个名为 Build AssetBundles 的菜单项,该菜单项将执行与该标签关联的函数中的代码。单击 Build AssetBundles 时,将随构建对话框一起显示一个进度条。此过程将会获取带有 AssetBundle 名称标签的所有资源,并将它们放在 assetBundleDirectory 定义的路径中的文件夹中。

3.3 加载依赖项

依赖关系:一个AB包的资源包含了对另一个AB包资源的引用,如上图中的cube1包中的cube引用了blue包中的材质,称cube1包依赖blue包

打包时unity会自动识别出包的依赖关系,并记录到AB包的manifest文件中,如下图所示

小结:如果a包依赖b包,在使用a包资源之前,务必加载b包,Unity不会自动加载依赖项。

3.4 AssetBundle的加载和使用

1.调用AssetBundle.LoadFromFile加载AB包并获取对象

2.调用LoadAsset从获取该包内的资源

using UnityEngine;

public class LoadAssetBundle : MonoBehaviour
{
    void Start()
    {
        //依赖的材质也需要加载
        AssetBundle.LoadFromFile(Application.dataPath + "/AssetBundles/material/blue.u3d");
        AssetBundle myLoadedAssetBundle = AssetBundle.LoadFromFile(Application.dataPath + "/AssetBundles/prefabs/cube1.u3d");
        GameObject prefab = myLoadedAssetBundle.LoadAsset<GameObject>("Cube");
        Instantiate(prefab);
    }
}

四.通过AssetBundles.manifest文件获取依赖关系

位于AssetBundles根目录下的AssetBundles.manifest是个文本文件,包含了所有AssetBundle包的信息和依赖关系,如下图所示

AssetBundles.manifest的信息可以通过代码访问

using UnityEngine;

public class LoadAssetBundle : MonoBehaviour
{
    void Start()
    {
        AssetBundle myLoadedAssetBundle = AssetBundle.LoadFromFile(Application.dataPath + "/AssetBundles/prefabs/cube1.u3d");
        loadDependency();
        GameObject prefab = myLoadedAssetBundle.LoadAsset<GameObject>("Cube");
        Instantiate(prefab);
    }

    private void loadDependency()
    {
        AssetBundle assetBundle = AssetBundle.LoadFromFile(Application.dataPath + "/AssetBundles/AssetBundles");
        AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");//传AssetBundleManifest这个文件固定名称
        string[] dependencies = manifest.GetAllDependencies("prefabs/cube1.u3d");
        foreach (string dependency in dependencies)
        {
            Debug.Log(dependency);
            AssetBundle.LoadFromFile(Application.dataPath + "/AssetBundles/" + dependency);
        }
    }
}


http://www.kler.cn/a/533034.html

相关文章:

  • python算法和数据结构刷题[3]:哈希表、滑动窗口、双指针、回溯算法、贪心算法
  • SQL范式与反范式_优化数据库性能
  • CompletableFuture
  • 分享|LLM通过D-E-P-S完成长时间与多步骤的任务
  • linux 进程补充
  • Nacos 的介绍和使用
  • CCF-GESP 等级考试 2023年12月认证C++八级真题解析
  • 2.7学习记录
  • 基于python的体育新闻数据可视化及分析
  • 6. k8s二进制集群之各节点部署
  • 神经网络常见激活函数 1-sigmoid函数
  • 11.8 LangChain记忆系统设计解析:BaseMemory与BaseChatMessageMemory的继承体系与实战应用
  • 大模型高级工程师实践 - 将课程内容转为视频
  • 司库建设:财务资金管理制度及风险管控要点
  • 数据库课程设计使用Java+JDBC+MySQL+Swing实现的会议预约管理系统源代码+数据库
  • 第二十三章 MySQL锁之表锁
  • wsl+phpstorm+xdebug|windows子系统配置phpstorm开发调试|断点调试
  • 基于“蘑菇书”的强化学习知识点(五):条件期望
  • 斗地主小游戏练习
  • 解决Mac安装软件的“已损坏,无法打开。 您应该将它移到废纸篓”问题
  • 基于微信小程序的绘画学习平台的设计与开发
  • LeetCode 1800. Maximum Ascending Subarray Sum
  • Ubuntu下Tkinter绑定数字小键盘上的回车键(PySide6类似)
  • 在C#中,什么是多态如何实现
  • 有限单元法的相关概念
  • 全栈开发:使用.NET Core WebAPI构建前后端分离的核心技巧(二)