[原]unity5 AssetBundle打包

本文unity版本5.1.3

一、现有的打包教程:

1、http://liweizhaolili.blog.163.com/blog/static/16230744201541410275298/ 阿赵

2、http://docs.unity3d.com/Manual/BuildingAssetBundles5x.html 官方

3、http://www.it165.net/pro/html/201506/43896.html

二、打包遇到的问题

1、资源的依赖关系(依赖关系处理不好,导致资源重复打包)

2、.cs文件不支持单独打成AssetBundle

    AssetBundleBuild[] assetBundle =  new AssetBundleBuild[1];
    assetBundle[0].assetBundleName = "TestWalk.ab";
    assetBundle [0].assetNames = new string[]{"Assets/TestWalk.cs""};
    BuildPipeline.BuildAssetBundles (Application.dataPath+ "/AssetBundles",assetBundle);
以上是错误代码

3、同一批AssetBundleBuild中不能存在相同的资源("Assets/TestWalk.cs"已经被标记

AssetBundleBuild[] assetBundle =  new AssetBundleBuild[2];
assetBundle[0].assetBundleName = "TestWalk.ab";
assetBundle [0].assetNames = new string[]{"Assets/TestWalk.cs","Assets/TestWalk.prefab"};
assetBundle[
1].assetBundleName = "TestWalk1.ab"; assetBundle [1].assetNames = new string[]{"Assets/TestWalk.cs","Assets/TestWalk1.prefab"}; BuildPipeline.BuildAssetBundles (Application.dataPath+ "/AssetBundles",assetBundle);

以上是错误代码

三、如何解决以上问题

1、依赖关系问题:

(1)、通过AssetImporter.assetBundleName方式,导入资源的时候设置assetbundle名称,直接用官方的BuildPipeline.BuildAssetBundles完成打包。

  缺陷:老工程来说不好闹,另外资源打的过散

(2)、手动添加,

  缺陷:操作起来太累

  优点:方便灵活

以上都不用单独处理依赖关系,共用资源也会被合理的共用

(3)、程序处理依赖关系,自动完成打包

  实现思路:遍历所需要打包资源,通过AssetDatabase.GetDependencies筛选出所有公共资源(过滤掉.cs文件,c#脚本只能被重复打包了,因为没法单独打成AssetBundle),从每个资源的依赖项里面去除掉公共资源(assetBundle [0].assetNames不要包含公共资源),打包每个资源;对公共资源,需要按类型分批整合,比如a.mat,a.prefab,a.png(不要把他们打成三个assetbundle)可以整合成一个新的assetbundle,可以把所有的shader文件整合成一个assetbundle等等,在对整合好的资源打包。

2、.cs不支持单独打AssetBundle

  只能把脚本重复打包了,没办法unity不支持

3、同一批AssetBundleBuild中不能存在相同的资源

  也没有好的解决办法,只能多次调用BuildPipeline.BuildAssetBundles实现

  AssetBundleBuild[] assetBundle =  new AssetBundleBuild[1];
   assetBundle[0].assetBundleName = "TestWalk.ab";
   assetBundle [0].assetNames = new string[]{"Assets/TestWalk.cs","Assets/TestWalk.prefab"};
   BuildPipeline.BuildAssetBundles (Application.dataPath+ "/AssetBundles",assetBundle);

   AssetBundleBuild[] assetBundle1 =  new AssetBundleBuild[1];
   assetBundle1[0].assetBundleName = "TestWalk1.ab";
   assetBundle1 [0].assetNames = new string[]{"Assets/TestWalk.cs","Assets/TestWalk1.prefab"};
   BuildPipeline.BuildAssetBundles (Application.dataPath+ "/AssetBundles",assetBundle1);

 

总结:资源打包学问很深,合理完美解决资源打包很难。完全打散资源,能很好解决重复加载导致的包大,但是过多的资源加载带来WWW和IO的瓶颈,合理实现资源拆分,只能因项目而异,本文仅仅提供思路,不足之处还望多多指点。

 

我艹 突然发现了一个严重bug,多次调用BuildPipeline.BuildAssetBundles会把以前生成的AssetBundles覆盖掉,只保留最后一次的AssetBundles,目前想到的办法是通过子的.manifest文件 重新组合出AssetBundles文件,不知道靠谱不

 

你可能感兴趣的:([原]unity5 AssetBundle打包)