一般我们在Unity项目中,都是美术给到图片,然后程序直接导入Unity,Android端给图片设置为 RBGA Compressed ETC2 8bit,iOS端给图片设置为 RBGA Compressed PVRTC 4bits,就可以解决大部分的图片问题。但是,在相同的项目下,在iOS端的真机上就会发现UI出现明显的锯齿、模糊和颗粒感等问题,但Android的真机上一点都看不出来,即使是在Android真机和iOS真机的逻辑像素尺寸(关于像素密度、逻辑像素和我们常说的屏幕分辨率之间的关系,请看手机APP UI设计尺寸基础知识)相同的情况下。
首先,iOS端的上述情况主要是两个问题:
1. UI 的边缘锯齿和模糊(其实UI如果边缘出现锯齿,UI的内部也会有锯齿,只是在边缘的会比较明显)
2. UI的颗粒感(如果UI中有较大面积的渐变,就会在iOS端的真机上看到UI中的颗粒)
然而解决上面的问题也主要是两个方式:
1. 在Unity中,更改对图片的导入设置(Import Setting)
2. 在UI的制作过程中,按照一定的规范,保证图片的细节足够清晰
UI 的边缘锯齿和模糊
上图是一张测试UI锯齿和模糊时的截图。如果说大家没有发现锯齿和模糊的问题,那么请看下面的图。
模糊问题的截图可能体现的不是很明显,不过这不是重点。
这个时候程序的第一反应就是,是不是我Unity中iOS端图片的导入设置有问题。所以去改了Edit->Project settings->Quality,改 Anti Aliasing,改Texture Quality,当然不能说一点效果都没有。只能说,没找到核心问题。
而出现模糊、UI锯齿感问题,第一应该找的是设计人员。出现这个情况是因为,设计人员给的图片,本身细节的精细度不够,所以出现模糊、UI锯齿感的问题。要解决这个问题,就需要设计人员的规范化作图了。下面我们来说具体的一般做法。有几个关键点:
- UI必须在规定的尺寸下进行作图。就拿iPhone6的UI来说,我们设计在制作UI的时候,就必须先在Photoshop里面建一个1334*750 72dpi的画布,然后所有的UI都要在这个画布下完成制作和导出。
- 在规定尺寸下作图,如果不是这个画布下制作的素材,使用的时候一定要非常小心的使用缩放,尽量做到不缩放。比如说,一个Button素材,拖放到规定尺寸的画布下,在画布中的显示是比需要的尺寸小一些的,然后你把这个素材放大以达到需要的尺寸。那么这个Button导出给项目使用的时候,iOS真机上就会出现模糊和锯齿。
- 设计人员必须清晰理解逻辑像素、显示尺寸、分辨率、像素密度、次像素这几个概念。理解了这些概念,就会明白为什么要在规定尺寸下制作图片才能在手机上达到正确的效果,而不会出现UI过细和过糙的结果。这里我给出两个参考文章:
(1)怎样去掉图标模糊的虚边,也就是次像素
(2)逻辑像素、显示尺寸、分辨率、像素密度
当然这里的文章不全,其他请自行百度然后进行理解。
下图是修复后的效果:
UI的颗粒感
在游戏UI中,总是会出现很多的带阴影的UI。阴影区域不大的时候,一般是看不出颗粒感的问题。但是一旦出现大面积的阴影或者渐变,就会发现明显的颗粒感。如下图:
上图的第一个黑条是可以看出明显的颗粒的,如果看不清楚,我给大家放大一下:
即使设计人员按照上文的规范,给出了正确的UI图片,颗粒感这个问题也还是会出现,因为这个是Unity对于图片打包压缩的问题。简单的说,就是设置的问题。
下面给大家简单说一下Unity 中常见的图片导入设置:
PVRTC: 不失真压缩率最高的压缩格式。特别的TBDR架构,不渲染被遮挡的部分,有效节省计算资源和带宽。纹理压缩在许多设备上面都支持,支持每个像素2位或者4位的纹理,包含或者不包含alpha通道都可以
ETC2:补全了ETC1(大部分移动GPU都会支持的纹理标准。不支持Alpha通道。)不支持的Alpha通道,支持更高质量的RGBA(RGB+Alpha)压缩。
ASTC: 由于ETC、PVRTC等格式均为有损压缩,因此,当纹理色差范围跨度较大时,均不可避免地造成不同程度的“阶梯”状的色阶问题或其他问题。而ASTC可以解决一些问题。ASTC 在 iOS 的高端机上是被支持的,因此理论上在 Editor 下不会强制把 ASTC 转为 RGBA32,建议尝试设置为 ASTC 后打包,从 Editor.log 中或者直接从包体大小上可以看出是否确实使用了 ASTC。ASTC又被详细的区分为 4x4 block、5x5 block.....12x12 block。但使用 ASTC 的话,虽然打包时比较小,但是在普通机型上会被处理成 RGBA32,导致过大的内存开销。
解决iOS端颗粒感问题的关键,就是改成ASTC格式
下面上图:
可以说,改成ASTC后,可以很完美的解决颗粒感的问题。
最后,iOS端一般的UI问题,都可以很好的解决了。