unity4.x的依赖打包浅介:
已知有两个prefab名称分别为cube_elem和cube_collectin,cube_collection中引用到cube_elem。
 
(1)测试代码一:简单的依赖打包和加载的实现。
第二、三个ab里的资源都引用了第一个ab里的资源,第一个ab做共享资源,第二、三个ab做了依赖打包。
[MenuItem("GameTools/Package/Bundle/DependanceTest")]
    public static void MenuEventHandler_DependanceTest()
    {
        string exportPath = Application.dataPath + "/StreamingAssets/";
        BuildAssetBundleOptions buildOpt = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets
            | BuildAssetBundleOptions.DeterministicAssetBundle;
 
        BuildPipeline.PushAssetDependencies();
        Object comObj= AssetDatabase.LoadMainAssetAtPath("Assets/GRes/Model/Prefab/cube_elem.prefab");
        BuildPipeline.BuildAssetBundle(comObj, null, exportPath + comObj.name + ".assetbundle", buildOpt , UnityEditor.BuildTarget.StandaloneWindows);
 
        BuildPipeline.PushAssetDependencies();
        Object p1= AssetDatabase.LoadMainAssetAtPath("Assets/GRes/Model/Prefab/cube_collection.prefab");
        BuildPipeline.BuildAssetBundle(p1, null, exportPath + p1.name + "1.assetbundle", buildOpt , UnityEditor.BuildTarget.StandaloneWindows);
        BuildPipeline.PopAssetDependencies();
 
        BuildPipeline.PushAssetDependencies();
        Object p2 = AssetDatabase.LoadMainAssetAtPath("Assets/GRes/Model/Prefab/cube_collection.prefab");
        BuildPipeline.BuildAssetBundle(p2 , null, exportPath + p2 .name + "2.assetbundle", buildOpt , UnityEditor.BuildTarget.StandaloneWindows);
        BuildPipeline.PopAssetDependencies();
        BuildPipeline.PopAssetDependencies();
 
        AssetDatabase.Refresh();
    }
执行代码测试assetbundle大小:
 
若没加载共享资源就直接加载cube_collection1.assetbundle,则无法正常显示所引用的对象。
测试代码如下:
主摄像机挂带如下代码的脚本run起来。 
void OnGUI()//for test
{
        if (GUI.Button(new Rect(10, 10, 150, 100), "Test button"))
        {
                StartCoroutine(LoadRes("file:///" + Application.dataPath + "/StreamingAssets/" + "cube_collection1.assetbundle"));
        }
}
 
 private IEnumerator LoadRes(string resList)
    {
        WWW cur3W = new WWW(resList);
        object obj = cur3W.assetBundle.Load(resList);
        yield return Instantiate(cur3W.assetBundle.mainAsset);
        cur3W.assetBundle.Unload(false);
    }
 
 
(2)测试代码二:
第二、三个ab里的资源都引用了第一个ab里的资源,第一个ab做共享资源,第二个ab做了依赖打包,第三个ab没做依赖打包。
[MenuItem("GameTools/Package/Bundle/DependanceTest")]
    public static void MenuEventHandler_DependanceTest()
    {
        string exportPath = Application.dataPath + "/StreamingAssets/";
 
        BuildAssetBundleOptions buildOpt = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets
            | BuildAssetBundleOptions.DeterministicAssetBundle;
 
        BuildPipeline.PushAssetDependencies();
        Object comObj= AssetDatabase.LoadMainAssetAtPath("Assets/GRes/Model/Prefab/cube_elem.prefab");
        BuildPipeline.BuildAssetBundle(comObj, null, exportPath + comObj.name + ".assetbundle", buildOpt , UnityEditor.BuildTarget.StandaloneWindows);
 
        BuildPipeline.PushAssetDependencies();
        Object p1= AssetDatabase.LoadMainAssetAtPath("Assets/GRes/Model/Prefab/cube_collection.prefab");
        BuildPipeline.BuildAssetBundle(p1, null, exportPath + p1.name + "1.assetbundle", buildOpt , UnityEditor.BuildTarget.StandaloneWindows);
        BuildPipeline.PopAssetDependencies();
 
        BuildPipeline.PopAssetDependencies();
 
        BuildPipeline.PushAssetDependencies();
        Object p2 = AssetDatabase.LoadMainAssetAtPath("Assets/GRes/Model/Prefab/cube_collection.prefab");
        BuildPipeline.BuildAssetBundle(p2 , null, exportPath + p2 .name + "2.assetbundle", buildOpt , UnityEditor.BuildTarget.StandaloneWindows);
        BuildPipeline.PopAssetDependencies();
 
        AssetDatabase.Refresh();
    }
执行代码测试assetbundle大小:
根据上面的方法拓展情景
情景一:
push
build cube_elem
build cube_collection
pop
 
cube_collection可以依赖到cube_elem。
 
情景二:
push
push
build cube_elem
pop
build cube_collection
pop
 
cube_collection依赖不到cube_elem。
 
情景三:
push
build cube_elem
push
build cube_collection1
pop
build cube_collection2
pop

cube_collection1、cube_collection2可以依赖到cube_elem。
 
情景四:
push
push
build cube_collection
pop
build cube_elem
pop
 
cube_collection依赖不到cube_elem。
结论:
(1)被依赖的assetbundle要比依赖它的assetbundle早加载。
(2)依赖关系:
一个push-pop对作为一个层。不管是它所嵌套或被外包的层都与它本身不同属一层。
同属一层的晚打的assetbundle可依赖早打的assetbundle。
ACG算同一层
B单独一层
BF为一层
E单独一层
A无所依,
B可以依赖A
C可以依赖A
D可以依赖CA
E可以依赖DCA
F可以依赖DCA
G可以依赖CA