Unity UGUI shader 帧动画
在某些情况下,手里有一个特效序列的整张图,我们可以试用这个shader,可以减少切图制作帧动画prefab的工序,可以可以解决制作成为粒子特效后,粒子与UGUI屏幕自适应不能兼容,粒子与UGUI ScreollView剪裁比兼容等问题。
1.首先,直接下载Unity的内置shader,拿出UI的默认shader进行修改。
2.在shader 属性字段增加代码
/*******************************************/
_RowCount("Row Count", Float) = 1
_ColumnCount("Column Count", Float) = 1
_FrameRate("Frame Rate", Float) = 30
/*******************************************/
三个变量可以在材质球界面进行修改,分别代表序列帧图片的行数、列数、和动画帧率。
3.在CGPROGRAM中引入变量的声明:
/*******************************************/
float _RowCount;
float _ColumnCount;
fixed _FrameRate;
/*******************************************/
4.通过计算,获得当前帧的正确UV。(建议写在定点shader里面,网上很多参考写在了片元shader)。
/*******************************************/
float width = 1 / _ColumnCount;
float height = 1 / _RowCount;
float sinceFrames = floor(_Time.y * _FrameRate) % (_RowCount * _ColumnCount);
float row = floor(sinceFrames / _ColumnCount);
float column = floor(sinceFrames % _ColumnCount);
half2 uv = half2((column / _ColumnCount + v.texcoord.x * width), ((_RowCount - row - 1) / _RowCount) + v.texcoord.y * height);
OUT.texcoord = uv;
/*******************************************/
计算写的很繁琐,只是为了把逻辑厘清,实际上可以通过公式进行进一步的简化,如若需要使用,这步可以自行进行。
最后看下效果:
然后修改下混合模式,我们也可以直接使用特效的高管贴图进行亮度叠加。
/*******************************************/
Blend SrcAlpha One
/*******************************************/
效果:
效果不错吧!而且可以完美配合UGUI的使用。最后需要说明下,shader虽然会根据时间切换帧,但是如果没有其他的UI触发UGUI的重绘事件的情况下,Game View 是不会重绘的,看起来像是停在某一帧,一般情况下应该会触发的,实在没触发,可以 自己写一个脚本去强制这个Image进行重绘。
完整代码:
https://download.csdn.net/download/u014621871/14883668
(有积分的大佬,助我混点吧。。。)