AssetBundle打包与加载

官方文档
参照视频

1.AssetBundle打包

1.1设置资源的命名和后缀

命名只支持小写
在这里插入图片描述

1.2创建Editor文件夹,在里面创建编辑器打包AssetBundle的脚本

using UnityEditor;
using System.IO;

public class CreateAssetBundles  {

    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string dir = "AssetBundles";
        if( Directory.Exists(dir)==false)
        {
            Directory.CreateDirectory(dir);
        }
        BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
    }
}

压缩方式:
BuildAssetBundleOptions.None:使用LZMA算法压缩,压缩包下,但加载时间长
BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部
注意:使用LZ4压缩,可以获得可以跟不压缩相媲美的加载速度,而且比不压缩文件要小

1.3选择菜单Assers-》点击Build AssetBundles 进行打包

在这里插入图片描述
得到打包后的文件
在这里插入图片描述

2.AssetBundle加载方式

原则上在使用资源之前需要先加载材质包,再创建prefab,防止材质丢失。share.unity3d为cubewallf的材质贴图包,share.unity3d和cubewall.unity3d加载先后顺序不影响

加载方式1:本地加载 AssetBundle.LoadFromFile

AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/share.unity3d");
 AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/cubewall.unity3d");
 GameObject wallPrefab = ab.LoadAsset<GameObject>("CubeWall");
 Instantiate(wallPrefab);

加载方式2: 内存中加载(异步) AssetBundle.LoadFromMemoryAsync

IEnumerator LoadFromMemoryAsync(string path)
    {
        AssetBundleCreateRequest createRequest = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
        yield return createRequest;
        AssetBundle bundle = createRequest.assetBundle;
        var prefab = bundle.LoadAsset<GameObject>("MyObject");
        Instantiate(prefab);
    }

内存中加载(同步) AssetBundle.LoadFromMemory

AssetBundle ab=AssetBundle.LoadFromMemory(File.ReadAllBytes(path));

加载方式3:网络加载 UnityWebRequestAssetBundle

IEnumerator InstantiateObject()
{
    string uri = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName; 
    UnityEngine.Networking.UnityWebRequestAssetBundle request 
        = UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(uri, 0);
    yield return request.SendWebRequest();
    AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
    GameObject cube = bundle.LoadAsset<GameObject>("Cube");
    GameObject sprite = bundle.LoadAsset<GameObject>("Sprite");
    Instantiate(cube);
    Instantiate(sprite);
}

(弃用)网络加载2 LoadFromCacheOrDownload(string url, int version);

IEnumerator Start()
    {
        while (!Caching.ready)
            yield return null;

        using (var www = WWW.LoadFromCacheOrDownload("https://myserver.com/myassetBundle.unity3d", 5))
        {
            yield return www;
            if (!string.IsNullOrEmpty(www.error))
            {
                Debug.Log(www.error);
                yield return null;
            }
            var myLoadedAssetBundle = www.assetBundle;

            var asset = myLoadedAssetBundle.mainAsset;
        }
    }

API2:LoadFromCacheOrDownload(string url, int version, uint crc); crc表示校验完整性,crc在.mainifest文件里
在这里插入图片描述

3.通过Manifest文件得到某个包的依赖

AssetBundles.manifest 里面包含所有包对应的依赖
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/44e22eec07d7485fb7acc569b00c1cf2.png
代码:

AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");//固定为AssetBundles
AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");//固定为“AssetBundleManifest”
string[] strs = manifest.GetAllDependencies("cubewall.unity3d");
foreach (string name in strs) {
    print(name);//share.unity3d
    AssetBundle.LoadFromFile("AssetBundles/"+ name); //加载cubewall.unity3d的依赖包
}

4.AssetBundle的卸载

  • 卸载可以减少内容的使用
  • 不当的卸载,有可能导致丢失(材质丢失bug红等)
  • AssetBundle.Unload(true) 卸载所有资源,即使有资源被使用着,推荐这个方法,卸载前确保依赖的包不被其他物体使用了。可以在切换场景是loading scene阶段去卸载
  • AssetBundle.Unload(false) 卸载所有没有被使用的资源,一般不用这个方法,会导致某些资源不被卸载,导致内存被滥用
  • 个别资源的卸载 1.通过Resources.UnloadUnusedAssets 2.场景切换的时候,自动调用Resources.UnloadUnusedAssets

5.Unity AssetBundle Browser Tool

使用文档
github下载地址
在这里插入图片描述
在这里插入图片描述

相关推荐

  1. 【Unity热更新1】学会AssetsBundle打包、

    2024-03-13 23:08:03       42 阅读
  2. webpack 打包后,图片错误

    2024-03-13 23:08:03       20 阅读
  3. Docker从容器打包镜像到本地保存

    2024-03-13 23:08:03       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-13 23:08:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-13 23:08:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-13 23:08:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-13 23:08:03       18 阅读

热门阅读

  1. 【C++】如何输入输出未知长度的二维数组?

    2024-03-13 23:08:03       91 阅读
  2. Rust教程:How to Rust-变量

    2024-03-13 23:08:03       24 阅读
  3. 【计算机网络】————集线器

    2024-03-13 23:08:03       22 阅读
  4. Rust常用特型之Drop特型

    2024-03-13 23:08:03       25 阅读
  5. MATLAB中mapminmax函数用法

    2024-03-13 23:08:03       22 阅读
  6. coingecko获取token price --php版

    2024-03-13 23:08:03       22 阅读
  7. GRU-深度学习循环神经网络情感分类模型搭建

    2024-03-13 23:08:03       25 阅读
  8. APK漏洞扫描工具

    2024-03-13 23:08:03       21 阅读
  9. 流量池增长(6)

    2024-03-13 23:08:03       19 阅读
  10. Everything:文件查找工具,一搜即得

    2024-03-13 23:08:03       17 阅读
  11. 三维数组指针定义和初始化例子

    2024-03-13 23:08:03       22 阅读
  12. C#写入和调用方法

    2024-03-13 23:08:03       22 阅读
  13. c语言之函数声明

    2024-03-13 23:08:03       24 阅读