Unity的UGUI中使用ETC1+Alpha的格式
许多开发人员可能会对在Unity的UGUI中使用ETC1+Alpha格式感到疑惑。自Unity 5.3起,安卓平台的默认压缩纹理格式改为ETC2。ETC2支持半透明效果,使用起来较为便捷,但目前尚未广泛普及,尤其是低端机型不支持ETC2。当Unity在不支持ETC2的设备上加载图片时,会将图片解压为RGBA格式,这不仅会造成大量的内存浪费,还会严重影响图片的加载速度。
对于没有透明色且尺寸为2的整次幂的正方形图片,Unity会自动将其转换为ETC1格式。因此,模型的纹理可以使用默认的压缩格式。
需要特别关注的是,非2的整次幂的图片以及含有半透明效果的图片,这类图片主要是UI图片资源。
为了处理这类图片,Unity提供了ETC1+Alpha格式的支持。可以通过以下两种方式进行设置:
手动设置
在图片分页中按照相应的设置步骤进行操作(此处文中未详细说明设置的图示内容,可补充相应截图及详细步骤)。
代码自动化设置
可以使用以下代码实现自动化设置:
private static void SetTextureSprite(AssetImporter ai, string tag = null)
{
TextureImporter importer = ai as TextureImporter;
if (importer == null) return;
importer.textureType = TextureImporterType.Sprite;
importer.mipmapEnabled = false;
importer.isReadable = false;
if (tag != null)
{
tag = tag.Replace(GameConfig.AB_EXT, "");
tag = tag.ToLower();
importer.spritePackingTag = tag;
}
#if UNITY_ANDROID
int maxSize = 1024;
TextureImporterFormat format = TextureImporterFormat.AutomaticCompressed;
int quality = 50;
importer.GetPlatformTextureSettings("Android", out maxSize, out format, out quality);
// 压缩的格式,android下修改为分离alpha通道的etc1
if (format == TextureImporterFormat.AutomaticCompressed)
{
importer.SetPlatformTextureSettings("Android", maxSize, TextureImporterFormat.ETC_RGB4, quality, true);
importer.SetAllowsAlphaSplitting(true);
}
#else
// iPhone
#endif
}
在使用ETC1+Alpha格式时,还需要注意以下几点:
- Sprite Tag设置:图片必须设置好Sprite Tag,以便进行图集打包,这样才能支持ETC1+Alpha格式。
- Texture Compression选择:在BuildSetting中,Texture Compression要选择ETC(default)。如果选择其他选项,Unity会使用ETC2格式,虽然在低端机上可以显示图片,但效率会很低。
- Shader添加:在Project Setting -- Graphic -- Always Included Shaders中添加UI/DefaultETC1。如果未添加该Shader,真机上的图片显示会出现异常。
- 版本兼容性:Unity 5.3.0及之前的版本,UGUI的Image组件不支持ETC1格式,只有SpriteRender能正常渲染。而最新版本则没有这个问题。
- 自定义Shader支持:如果自己编写了自定义Shader(如实现图片灰化效果的Shader),需要对其进行相应的支持。否则,图片的渲染会不正常。具体的支持方式可以参考UI/DefaultETC1。