了解了Unity的打包方式以后,还需要面对一个问题,怎么组织我们的资源。
是一个资源打一个包,还是多个文件打成一个包,资源之间的依赖关系怎么处理。
可以针对资源类型一个个梳理打包方案,分析依赖关系,按类型打包。
通过AssetDatabase.GetDependencies(pathname)可以得到所有依赖文件。
Shader、Font资源
Shader基本被大部分需要绘制的资源有关,所有可以把所有的Shader单独打成一个Bundle
Font被所有UI资源文件引用,单独打成一个公用Bundle
Texture资源
可以通过贴图的长宽,压缩格式计算出最后的贴图大小,按一个Bundle 1MB的标准,count = 1MB / (width * height)。
Material资源
在分离贴图后,材质的数据非常小,可以不把材质分离处理。如果分离材质会有一个问题是在增量打包的时候需要把所有的Texture,PushDepend后才能打。这样基本上是等于不增量,所以还是建议不去分离Material资源。
Mesh、Animation资源
同理可以按照大小、资源类型合并资源到一个Bundle里面去。比如区分Player,Npc这些资源。Mesh可以按场景或者角色分类,资源的面数做个大概了解即可。动作可以区分是短动作,还是长动作来打包。
Prefab资源
当把Texture,Mesh,Animation等资源抽离打成共享包以后,可以发现剩下的一些文本数据非常小,基本可以把上百个Prefab打成一个Bundle。
NGUI资源
UI的资源依赖关系比正常的资源复杂,通用的处理方式并不是很合适。比如一个Common Atlas,Atlas包括一个材质和图素的UV坐标,里面存放了UI资源的基本元素。基本上所有的UI Prefab都会引用到这个图集。如果修改这个图集会导致所有的UI Prefab重新打包,这样是不合理。所以可以单独把Atlas抽离出来,这样更新只用打一个Atlas包即可。由于Atlas抽离了Texture后很小,所有可以把所有的Atlas打成一个公用的Bundle。
资源解耦
除了依赖Unity提供的打共享包的方式外,还有一个方式是自身对资源做解耦。比如一个引用一个Prefab,可以把这个引用替换成Prefab路径,然后再运行的时候通过路径去加载资源。对一个场景文件,通常是需要按这种方式对资源做解耦,即减少了依赖文件,也可以动态加载场景模型。
通过PrefabUtility.GetPropertyModifications可以得到本地Prefab与场景Prefab的差异。修改其中不支持的,保存修改的支持属性,比如坐标、缩放。
结语
根据不同的资源类型与实际使用情况,来定制打包规则,基本上能得到较规整的AB资源。