赞
踩
上一节我们讲解了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);
}
}
我们打包了两个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);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。