unity AssetBundle 详解

什么是 AssetBundle

AssetBundle(简称AB包)是一个资源压缩包,可以包含模型、贴图、音频、预制体等。如在网络游戏中需要在运行时加载资源,而AssetBundle可以将资源构建成 AssetBundle 文件。

压缩模式

AssetBundle 提供了三种压缩格式

  • LZMA压缩(BuildAssetBundleOptions.None):unity中默认的压缩方式,优点是会将文件压缩的非常小,缺点是每次使用都需要将压缩的文件全部解压,非常耗费时间,可能会造成游戏的卡顿,不推荐在项目中使用。
  • 不压缩(BuildAssetBundleOptions.UncompressedAssetBundle):优点是需要加载资源时速度非常快,缺点是构建的 AssetBundle 资源文件会比较大。
  • LZ4压缩(BuildAssetBundleOptions.ChunkBasedCompression):是LZMA和不压缩之间的折中方案,构建的 AssetBundle 资源文件会略大于 LZMA 压缩,但是在加载资源时不需要将所有的资源都加载下来,所以速度会比 LZMA 快。建议项目中使用它。

AssetBundle使用

如图中所示选择需要构建 AssetBundle 的资源,在下方输入资源名称和后缀。
在这里插入图片描述

代码构建 AssetBundle

[MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string dir = "Assets/StreamingAssets";
        if (Directory.Exists(dir) == false)
        {
            Directory.CreateDirectory(dir);
        }
        //BuildTarget.StandaloneWindows64 选择构建平台
        //BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); //LZMA
        BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64); //LZ4
        //BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.UncompressedAssetBundle, BuildTarget.StandaloneWindows64); //不压缩        

AssetBundle 加载

我们可以使用四种不同的方法来加载 AssetBundle。

  • AssetBundle.LoadFromMemoryAsync
  • AssetBundle.LoadFromFile
  • WWW.LoadfromCacheOrDownload
  • UnityWebRequestAssetBundle 和 DownloadHandlerAssetBundle

AssetBundle.LoadFromMemoryAsync

从内存区域异步创建 AssetBundle。

 /// <summary>
    /// 从本地异步加载AssetBundle资源
    /// </summary>
    /// <param name="path">路径</param>
    /// <returns></returns>
    IEnumerator LoadFromMemoryAsync(string path)
    {
        AssetBundleCreateRequest createRequest = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
        yield return createRequest;
        AssetBundle bundle = createRequest.assetBundle;
        var prefab = bundle.LoadAsset<GameObject>("bullet");
        Instantiate(prefab);
    }

AssetBundle.LoadFromMemory由AssetBundle.LoadFromMemoryAsync变化而来,与 LoadFromMemoryAsync 相比,该版本是同步的,将等待 AssetBundle 对象创建完毕才返回。

		AssetBundle bundle = AssetBundle.LoadFromMemory(File.ReadAllBytes(ABPath));
        var prefab = bundle.LoadAsset<GameObject>("bullet");
        Instantiate(prefab);

AssetBundle.LoadFromFile

从磁盘上的文件同步加载 AssetBundle。
该函数支持任意压缩类型的捆绑包。 如果是 lzma 压缩,则将数据解压缩到内存。可以从磁盘直接读取未压缩和使用块压缩的捆绑包。

与 LoadFromFileAsync 相比,该版本是同步的,将等待 AssetBundle 对象创建完毕才返回。

这是加载 AssetBundle 的最快方法。

		AssetBundle ab = AssetBundle.LoadFromFile(ABPath);
        var go = ab.LoadAsset<GameObject>("bullet");
        Instantiate(go);

LoadFromFileAsync AssetBundle 的异步创建请求。加载后使用 assetBundle 属性获取 AssetBundle。
从磁盘上的文件异步加载 AssetBundle。

该函数支持任意压缩类型的捆绑包。 如果是 lzma 压缩,则将数据解压缩到内存。可以从磁盘直接读取未压缩和使用块压缩的捆绑包。

这是加载 AssetBundle 的最快方法。

IEnumerator LoadFromFileASync(string path)
    {
        AssetBundleCreateRequest createRequest = AssetBundle.LoadFromFileAsync(path);
        yield return createRequest;
        AssetBundle bundle = createRequest.assetBundle;
        if (bundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            yield break;
        }
        var parefab = bundle.LoadAsset<GameObject>("bullet");
        Instantiate(parefab);
    }

WWW.LoadfromCacheOrDownload(已弃用)

本API已弃用,建议使用 UnityWebRequest。
从缓存中加载具有指定版本号的 AssetBundle。如果当前未缓存该 AssetBundle,则自动下载该 AssetBundle 并将其存储在缓存中,以便将来从本地存储检索。

 IEnumerator LoadFromCacheOrDownload()
    {
        //Caching.ready 如果缓存系统已准备就绪,返回 true。
        while (!Caching.ready)
            yield return null;
        //C:\Users\mfbf\AppData\LocalLow\Unity WWW缓存地址
        using (var www = WWW.LoadFromCacheOrDownload("http://127.0.0.1:8080/PC/attack/bullet.lian", 2))
        {
            yield return www;
            if (!string.IsNullOrEmpty(www.error))
            {
                Debug.Log(www.error);
                yield return null;
            }
            var bundle = www.assetBundle;

            var parefab = bundle.LoadAsset<GameObject>("bullet");
            Instantiate(parefab);
        }
    }

UnityWebRequestAssetBundle 和 DownloadHandlerAssetBundle

UnityWebRequestAssetBundle 此方法将 DownloadHandlerAssetBundle 附加到 UnityWebRequest。

DownloadHandlerAssetBundle.GetContent(UnityWebRequest) 作为参数。GetContent 方法将返回你的 AssetBundle 对象。

  IEnumerator WEB(string url)
    {        
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url,3,0);
        //此方法将返回 WebRequestAsyncOperation 对象。在协程内部生成 WebRequestAsyncOperation 将导致协程暂停,
        //直到 UnityWebRequest 遇到系统错误或结束通信为止。
        yield return  request.SendWebRequest();
        //如果加载失败
        if (request.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(request.error);
            yield break;
        }
        //返回下载的 AssetBundle 或 null。
        
        AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
        var parefab = bundle.LoadAsset<GameObject>("bullet");
        Instantiate(parefab);
    }
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity AssetBundle Browser是Unity引擎的一款插件,它可以帮助游戏开发者在编辑器内浏览和管理AssetBundle资源。AssetBundle资源是游戏制作过程中必需的一种资源,它可以将一些预制件、贴图、声音和代码等打包成二进制文件,并在运行时通过代码加载到游戏中,从而实现动态加载资源和减少加载时间的效果。 Unity AssetBundle Browser插件提供了一个可视化的资源管理界面,用户可以通过它对资源进行打包、解包、浏览、删除等操作。在使用AssetBundle资源时,由于资源文件的二进制格式与编辑器内资源格式不同,开发者需要将资源文件打包成AssetBundle进行加载。Unity AssetBundle Browser将这个过程简化了,用户只需选择需要打包的资源,设置相关参数,并点击打包按钮,就可以轻松地创建AssetBundle文件,并将其加载到游戏中。 此外,Unity AssetBundle Browser还支持实时预览AssetBundle资源,开发者可以通过它快速地浏览预制件、纹理、材质球等资源,从而提高开发效率。总的来说,Unity AssetBundle Browser是一款十分实用的插件,它为开发者提供了一种便捷的方式去管理和使用AssetBundle资源,使游戏制作变得更加高效和便捷。 ### 回答2: Unity AssetBundle Browser是一个Unity扩展工具,用于在IDE中浏览和管理AssetBundle。AssetBundle是一种Unity资源包,可以使开发者轻松创建和管理资源,如纹理、声音和模型等。 Unity AssetBundle Browser可以让开发者直观地查看AssetBundle文件的内容,包括资源列表、依赖关系和预览功能。此外,它还提供了打包、解包、压缩和解压缩AssetBundle文件的功能,使开发者可以更灵活地使用AssetBundle,以满足项目需求。 使用Unity AssetBundle Browser,开发者可以快速地浏览和编辑AssetBundle,节省了大量的时间和精力。它还可以帮助开发者更好地理解AssetBundle的工作原理,为开发者深入学习Unity提供了一个重要的工具。 总之,Unity AssetBundle Browser是一个非常有用的工具,可以帮助Unity开发者更高效地管理和使用AssetBundle,提高项目开发效率和质量。 ### 回答3: Unity AssetBundle Browser是Unity游戏引擎中的一个工具,可以用于浏览和导出AssetBundle资源包。AssetBundle是一种Unity的资源打包方式,可以将游戏中的资源打包成一个文件,方便后续的版本管理和部署。 使用AssetBundle Browser可以很方便地管理和处理AssetBundle资源包,包括在游戏中动态加载和卸载资源,减小游戏的内存占用和优化游戏性能。通过AssetBundle Browser,我们可以查看和编辑资源包中的资源,例如模型、贴图、音频等,并提供了一套完整的编辑工具,支持资源导入、复制、删改等操作。 在游戏开发中,AssetBundle Browser可以用于优化游戏的资源处理方式,提高游戏性能,同时也可以帮助开发者更加高效地管理和打包游戏资源。值得注意的是,AssetBundle Browser只适用于Unity游戏引擎,需要Unity开发环境的支持。因此,开发者在使用AssetBundle Browser时,需要提前了解Unity的相关知识和技术,否则会影响到开发效率和质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值