好久没写文章了,最近太累了。。
使用UGUI开发界面,一般比较小的图片会设置一个tag,让它打进图集。其实还有很多大的图片,比如logo、头像、图标、关卡图、等 。 宽高各一方大于256 或者 512的图片。
这类大的图片不太适合放在图集中,因为他们会把图集撑的很大,可是如果从图集中拿出来,又没办法压缩。因为美术不可能刚好给我们出一个2的幂次方的图片。
UGUI中有两个方法可以让不是幂次方的图片变成2的幂次方
1.给每个大图片设置一个独一无二的tag,这样这张图片就会被当成一个图集来处理。 具体压缩的方法可以看我之前写的文章
http://www.xuanyusong.com/archives/4279
2.不使用Image组件,改用RawImage
如下图所示,TextureType这里设置成Default ,Advanced里设置NonPower of 2 里面有4个选项,none、toNearest、toLarge、toSmall (设置比例的)推荐设置成toNearest。
注意:RawImage也可以设置Sprite或者Texture两种。如果觉得图片不清楚的话推荐使用方法1来压缩。
然后这张图片就变成了2的幂次方,它不能放在Image组件中,但是可以放在RawImage中。开始压缩图片吧,Android压缩成ETC IOS压缩成 PVRTC
这类大图片有几个特点
1、不需要合并批次(原因就是不想把图集撑的很大)
2、不需要九宫格
3、对比了一下Sprite和Texture的方式,发现Texture的加载速度要比Sprite快很多。
4、如果用RawImage就不能使用unity自带的Android ETC1 自动通道分离,如果你的游戏必须要支持ETC1的话,那么就给它设置一个tag变成图集即可
5.如果ETC2压缩方式放在了ETC1的手机上,Unity会自己转成RGBA32不用担心显示错误的问题。
6.美术就喜欢设计颜色渐变的图片,怎么压缩都无法消除抖动问题,效果都不好,所以还是要保留一些图片的压缩格式是RGBA32. 选择性压缩 ETC 和PVRTC
最后欢迎大家一起讨论。
7.最近发现RawImage不会用Sprite的Atlas 。 换句话来说,就算设置了Sprite的tag.放在RawImage上 无效。。。坑啊
UI还是老老实实用Image吧。。。
- 本文固定链接: https://www.xuanyusong.com/archives/4312
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
最近遇到一个问题,即项目的大图,在ios上下无法压缩成pvrtc,非2的幂次方。ui大图肯定会有这样的问题。看到这篇帖子。这种方法仅限于一些背景图,
假设需要使用setNativeSize就不可以。因为设置 non power of 2为toNearest后,图的宽高就为拉伸为2的幂次方后的宽高。想到的解决方法,好像只能记录
图片的实际宽高,来重设宽高。这样的好处,只是满足了pvrtc的压缩。从而减少图片载入内存的大小,优化内存。最后提一句,图集图片设置为gui,则ios下自动
压缩为pvrtc4bit,但是品质会下降,会模糊。解决办法,为了和android统一,基本上是将图集shader重新,图片分离为rgb和a两张来做。
2的冥次方是为了ios开发吧。这样的话最快的方法就是不开发ios版本。
先把图片弄成Default, toNearest 然后转成sprite可以吗
public class spriteCreate : MonoBehaviour
{
public Texture2D tex;
private Sprite mySprite;
private SpriteRenderer sr;
void Awake()
{
sr = gameObject.AddComponent() as SpriteRenderer;
sr.color = new Color(0.9f, 0.9f, 0.9f, 1.0f);
transform.position = new Vector3(1.5f, 1.5f, 0.0f);
}
void Start()
{
mySprite = Sprite.Create(tex, new Rect(0.0f, 0.0f, tex.width, tex.height), new Vector2(0.5f, 0.5f), 100.0f);
}
void OnGUI()
{
if (GUI.Button(new Rect(10, 10, 100, 30), “Add sprite”))
{
sr.sprite = mySprite;
}
}
}