如果想减少手游打包的尺寸,第一步要做的是分析找出热点。
在console窗口可以右键打开editorlog,里面列举了本次打包编译的所有资源和大小。进行归类和细分,定位哪块内容最占空间。

一般情况下,有以下3方面消耗了大量空间。

  1. UI 素材
  2. 场景纹理
  3. 动画文件

图片最占用空间,动画文件比重虽然不低,但是压缩比高。图片打包时几乎是无法压缩的。
因此优化尺寸的重点就是在导入图片时设定正确的压缩格式。

switch platform to android

把build platform默认设置为android,因为unity为你自动转换压缩格式的时候,在android这块处理的并不好,有些方面需要自己去盯着。
ios因为硬件的一致性,统一使用PVRTC。
ETC1是android目前支持最广泛的压缩格式,和ios的压缩格式一样都是8:1。

1024x1024

纹理最大只用1024x1024。
更大尺寸的纹理?有些手机支持不了。
非方形纹理?无法使用最佳格式去压缩,只能采用失真高,压缩率低的格式。

总之,需要压缩的纹理必须是方形,分辨率限制在1024x1024以下。

拼接和切割UI素材

UI素材的小元素很多,将多个素材拼接成一个1024大图有以下好处:

  1. 减少drawcall,提高效率。 移动设备的极限差不多就100 drawcall吧,长时间太高会发烫。
  2. 减少图片数量,容易看到优化效果。
  3. 大图压缩后的失真程度非常小。

为什么要切割呢,主要是有一些长背景素材,如2000x500,可以切成1024x500,再合并成1024x1024的方图进行压缩。
如果压缩后太失真,那就不切割,使用原图而不进行压缩,尺寸上也比1024x1024不压缩的小。
这需要权衡。

压缩UI素材

有时候UI素材压缩,会失真,需要尝试看效果是否选择压缩。
按钮,边框类的素材一般是不压缩的,因为压缩后容易失真。
但如背景类素材,布景类素材压缩后却和原图非常接近。

因为UI素材携带alpha通道,unity在转成android压缩格式时会使用rgba16,这是非常糟糕的压缩格式——低压缩比,高失真。
可手工指定android的压缩格式为ETC1,但是ETC1并不包含alpha数据。为了能够显示半透的元素,需要修改shader,传一张alpha通道的纹理进行混合。
alpha纹理不需要另外制作,将原图复制一份,设置导入格式为alpha8即可,导入尺寸尽可能缩小到256x256以内。

压缩场景纹理

场景纹理总是选择压缩格式,全部都必须是方形的。
更重要的是,要避免alpha通道。如果包含了alpha通道,压缩格式手工改成ETC1,无需额外的alpha通道纹理。