目录
打包是干什么的?
在Unity3D开发的游戏中,无论模型,音频,还是图片等,我们都做成Prefab,然后打包成Assetbundle,方便我们后面的使用,来达到资源的更新。
====
In Our Program:
版本机上打版本的时候会build资源,同步build热更新包
在MLDJCommand.cs下加入了一个菜单项
BuildAssetBundle一共分为7个Step:
Step 1:
按照资源类型,顺序打包,这里其实是按照资源分类分别封装函数,具体要打成多少个assetbundle,是在每一个_Internal函数内部进行控制。
一个最基本的原则:想通的资源尽可能的打包到一起,他们共用一套资源。不相同的模型尽量分开打包。
总的来说是按照文件夹来build的。
举例:
BuildModelAssetBundle("/DJMain/BundleData/Model", "BundleData/Model",
"Assets/StreamingAssets" + BundleManager.PathModelPrefab, target, modelFileEnd);
参数是路径信息,最后modelFileEnd是后缀名
比如BuildModel的时候就是loadPath = "Assets/StreamingAssets/Model"
其实就是我们要build的资源所在的Unity的原路径
然后通过BuildDependencyAssetBundle打带有依赖的AssetBundle包
- 检查路径有效性
CheckTargetPath函数中回对这个目标路径做一些格式的转换,确保路径的存在工作
- 遍历所有prefab计算依赖项
通过调用BundleMaker.cs中的GetAssetInPath函数,遍历整个文件夹,获得两个字典
一个是singlePrefabs<路径,文件名>字典 (1110个)
一个是singleObjsDic<文件名,Object>字典
第二个字典是通过Unity API AssetDatabase.LoadMainAssetAtPath获取的assets文件夹下的所有特定类型的物体
然后把这些Object放入curLoadPrefab数组,用来计算依赖项
然后通过Unity Api EditorUtility.CollectDependencies 来计算curLoadPrefab里面的所有依赖资源 dependObjs
这一步的时间还是比较长的
- 计算 共享资源包
在这些dependObjs中,对于所有的UnityEngine.Shader类型的资源,如果是在"Assets/DJMain"下面,则加入shaderDependObjs里面,用来打一个共享包
然后把CommonEffectTexture和CommonTexture所用到的texture加到shaderDependObjs里面,通过名字能看出来,这两个文件夹下的,都是“common”的
接下来把一些特殊的单个资源也加入到shaderDependObjs里面
- 整合所有要打包的资源的List并且进行打包
遍历singlePrefabs
{
AssetBundleBuild currentBuildInfo = new AssetBundleBuild();
每一个prefab对应一个后缀名变为".assetbundle"的AssetBundleBuild信息
并且把这个AssetBundleBuild加入到singleBundleBuildList中
}
然后遍历shaderDependObjs,把里面的东西组成一个AssetBundleBuild commonBuildInfo
然后把上singleBundleBuildList和commonBuildInfo都加入到totalBundleBuildList中(1111个)
最后调用BuildPipeline.BuildAssetBundles(loadPath, totalBundleBuildList.ToArray(),
BuildAssetBundleOptions.ChunkBasedCompression, buildTarget);
通过model的例子所以可以看出来,所有的shader是一个包,每一个单独的模型的prefab是一个包
我们再看一个UI的例子
首先获取路径下Prefab,路径分别是UI/Prefab下面的三个子文件夹,Common | Login | Main
Common里面其实放的是Login和Main