当前位置:   article > 正文

unity的AssetBundle打包目录结构以及bundle之间的依赖_assetbundle和bundle、

assetbundle和bundle、

上一节我们讲解了AssetBundle的打开以及资源load以及资源释放的问题。那么本节主要想讲解的是打包之后的文件夹关系,还有就是如何减小包的大小,也就是依赖打包,然后依赖打包的问题解决了,最终还要能够正确的加载出资源进行实例化。所以本节的目标有三个:
1、打包之后的文件夹结构
2、依赖打包缩小包大小
3、正确加载依赖完成资源实例化

1、打包之后的文件夹结构:
1.1 首先我们看下要打包的资源结构:
这里写图片描述
这里有四个资源bg图片、一个shader文件、还有两个prefab。

1.2 打包代码:

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;

public class AssetBundleCreator  
{
    [MenuItem("AssetBundle/Buld")]
    static void BuildAsset()
    {
        string outDir = "Bundles";
        if(!Directory.Exists(outDir))
        {
            Directory.CreateDirectory(outDir);
        }
        AssetBundleBuild[] bundles = new AssetBundleBuild[2];
        bundles[0].assetBundleName = "a133333333333333333333333333333333333";
        string[] bundle1Asset = new string[3];
        bundle1Asset[0] = @"Assets\Prefabs\Cube.prefab";
        bundle1Asset[1] = @"Assets\Prefabs\Sphere.prefab";
        bundle1Asset[2] = @"Assets\Prefabs\bg.png";

        bundles[0].assetNames = bundle1Asset;

        bundles[1].assetBundleName = "shader";
        string[] bundle2Asset = new string[1];
        bundle2Asset[0] = @"Assets\Prefabs\ColorShader.shader";
        bundles[1].assetNames = bundle2Asset;

        BuildPipeline.BuildAssetBundles(outDir, bundles, BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

我们打包了两个bundle,第一个bundle包含了三个资源:两个prefab和一张图片。
第二个bundle只包含了一个shader文件。
打包之后的文件夹如下:

这里我们故意随意命名了第一个bundle的名,然后第二个bundle的名字为shader。ok,我们不妨打开第一个bundle的清单文件,可以看到:
这里写图片描述
这个文件清楚的列出了bundle中包含的资源,并且可以看到本bundle依赖了另外一个bundle,那就是shader所在的bundle。

这里要解释下,为何他依赖了shader呢,因为我们可以找到其中一个prefab,比如这里的Cube.prefab,可以看到其材质球上使用的shader正是ColorShader文件。故unity自动帮我们计算了依赖关系。

我们接下来看看shader bundle的清单文件:
这里写图片描述
这个shader包只有一个资源,就是ColorShader.shader文件,然后它无依赖于其他包。

接下来我们就要注意到还有一个自动生成的文件了,那就是和代码中输出路径同名的文件:Bundles
这里写图片描述
打开其Bundles.manifest清单文件可以看到,它的意思这个输出路径下到底有多少个包。那么包与包之间的依赖关系,我们可以通过加载Bundle文件,然后使用unity提供的函数就可以直接获取了,后文会讲到。
这里写图片描述
ok,到这里我们已经展示打包之后的目录关系了,目标1完成。

2、依赖打包缩小包大小
这个略去,我们只要每次都将shader文件传入,unity自动帮我们将依赖的包都略去。

3、如何正确的加载

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Data
{
    public Object Asset;
}


public class StaticInstance : MonoBehaviour
{
    public GameObject loadBundle;
    public GameObject unloadBundle;

    private void Start()
    {
        UIEventListener.Get(loadBundle).onClick = Init;
        UIEventListener.Get(unloadBundle).onClick = UnLoad;
    }

    private void Init(GameObject go)
    {
        StartCoroutine(LoadBundle());
        Debug.LogError("LoadBundle over");
    }

    private void UnLoad(GameObject go)
    {
        Resources.UnloadUnusedAssets();
        Debug.LogError("UnLoad over");
    }


    private IEnumerator LoadBundle()
    {
        //1. 加载总包获取各个包之间的依赖关系
        string assetBundlePath = Application.dataPath + @"\..\Bundles\Bundles";
        WWW www = new WWW(assetBundlePath);
        while (!www.isDone)
        {
            yield return null;
        }

        //2. 测试第一个包所有的依赖关系
        AssetBundle bundle = www.assetBundle;
        AssetBundleManifest manifest = bundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
        string[] dependencies = manifest.GetAllDependencies("a133333333333333333333333333333333333");
        for (int i = 0; i < dependencies.Length; ++i)
        {
            Debug.LogError(dependencies[i]);
        }


        //3. 加载shader包,事先把依赖的包加载好
        assetBundlePath = Application.dataPath + @"\..\Bundles\shader";
        www = new WWW(assetBundlePath);
        while (!www.isDone)
        {
            yield return null;
        }

        AssetBundle bundle2 = www.assetBundle; //强制引用一下,否则材质球依然不会显示,注意点注意点!!!


        //4. 加载第一个包并且实例化
        assetBundlePath = Application.dataPath + @"\..\Bundles\a133333333333333333333333333333333333";
        www = new WWW(assetBundlePath);
        while (!www.isDone)
        {
            yield return null;
        }

        bundle = www.assetBundle;

        Data data = new Data();
        data.Asset = bundle.LoadAsset("Cube");
        Instantiate(data.Asset as GameObject);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/82051
推荐阅读
相关标签
  

闽ICP备14008679号