Unity的UGUI中使用ETC1+Alpha的格式

Unity5.3之后,Android平台的默认压缩纹理改为ETC2。ETC2支持半透明,使用也很方便,不过问题是尚未普及,尤其是低端机是不支持ETC2的。Unity对不支持ETC2的机子,在加载图片的时候会解压为RGBA,不过这样就会造成极大的内存浪费,也会严重影响加载速度。

对于没有透明色且为2的整次幂的正方形图片,Unity会转为ETC1,所以模型的纹理是可以用默认的压缩格式。

需要注意的是非2的整次幂的图片,以及含有半透明的图片。这里主要是UI图片资源。

Unity提供了ETC1+Alpha的支持。

 

 

具体步骤就是设置Texture的Packing Tag名称,并且Sprite Mode设置成Single。

突然想,我们安卓纹理一般使用ETC1 Alpha来做压缩处理的。Sprite Packer是否支持?

默认是ETC2 8bit

可是无论我怎么设置,安卓平台下图集显示格式一直都是ETC2 8bit, 怎么就不能是ETC1呢?

几经折腾,发现按照如下步骤就能解决了:

步骤一:Build Settings

在BuildSettings中设置ETC1(default)

Unity 5.3.5

这一步十分关键,可以说太潜规则了!也不知道是不是Unity 5.3.5的一个BUG!

步骤二:小图设置ETC1透明分离

所有的小图的安卓设置成ETC1(Split Alpha Channel)
也可以通过代码进行自动化设置
 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 
}

步骤三:完成了

这时候打开Sprite Packer,执行Repack; 或者直接播放一下游戏,再打开Sprite Packer查看图集,已经变成了ETC1了。

成功变成ETC1

Unity 5的ETC1处理真赞!

 

这里要注意几点:
1、图片必须设置好Sprite Tag,即进行图集打包,才能支持ETC1 Alpha。

2、BuildSetting里面 Texture Compression要选成 ETC(default)。如果选成其他的,则会使用ETC2,这样在低端机可以显示,但是效率很低。

3、Project Setting–Graphic–Always Included Shaders里面添加 UI/DefaultETC1。如果没有添加则真机上显示异常。

4、Unity5.3.0以及之前的版本,UGUI的Image是不支持ETC1的,只有SpriteRender渲染正常。  最新版本是没问题的。

5、如果自己写了某些自定义Shader,如图片灰化,那么这个也要做相应的支持。否则渲染不正常。具体支持方式参考UI/DefaultETC1

发表评论