上文实现了UITexture的流光效果,但是有时候我们希望使用图集的UISprite也能有流光效果,那怎么办呢。一种做法是将图片独立出来,使用UITexture,结合上文的方法,这里我们来看看直接操作UISprite该怎么做。
需要注意的是,本文有些使用到的原理在上文已经解释过了,就不再赘述。建议大家还是先看前一篇。
先写Shader
流光Shader的原理都是差不多的,这里的关键问题在于:UV坐标,因为纹理是图集这张大图,uv坐标怎么对应到流光纹理上呢,这个其实是个简单的数学问题,看下图就明白了:
这是一个Atlas,A点代表Sprite的左下角,B点是右上角,整个坐标系表示的是uv坐标,问题就转化为:已知C点相对于大图的uv坐标,求C点相对于Sprite小图的uv坐标。
A点坐标 = ( spriteOffsetX/atlasWidth, spriteOffsetY/atlasHeight )
B点坐标 = ( (spriteOffsetX+spriteWidth)/atlasWidth, (spriteOffsetY+spriteHeight)/atlasHeight )
C点相对于大图的uv坐标 = ( cUvX, cUvY )
那么C点相对于小图的uv坐标 = ( x, y )
x = (cUvX - A.x)/(B.x - A.x)
x = (cUvx - spriteOffsetX/atlasWidth) / (spriteWidth/atlasWidth)
y同理
那么我们的Shader代码就出来了,同样在默