大家都用过ngui吧我相信?我记得很以前老版本的ngui是没有直接提供uv动画功能类的,那时候我做uv动画是将美术给我的sprite列表打包成uiatlas,然后直接uiatlas = 序列帧atlas;uisprite.name = “sprite” + index.tostring();虽然实现了效果,但是基本上是基于ngui提供的功能,后面则直接让美术将序列帧ps成一张2的幂次方大图,保证sprite的等分摆放即可,如下:

      C for Graphic:uv动画特效

       这里特别提醒uv是左下角为(0,0),右上角为(1,1),我记得我说过的以前,那么接下来我们只需要for循环将整张图片根据uv偏移渲染即可,代码如下:

     

  1. Shader "Unlit/uvUnlitShader"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. _CellWidth("width",int) = 1
  7. _CellHeight("height",int) = 1
  8. _Speed("speed",Range(0.1,5.0)) = 1.0
  9. }
  10. SubShader
  11. {
  12. Tags { "RenderType"="Transparent" }
  13. LOD 100
  14. Pass
  15. {
  16. //支持透明混合渲染
  17. ZWrite Off
  18. Blend SrcAlpha OneMinusSrcAlpha
  19. CGPROGRAM
  20. #pragma vertex vert
  21. #pragma fragment frag
  22. #include "UnityCG.cginc"
  23. struct appdata
  24. {
  25. float4 vertex : POSITION;
  26. float2 uv : TEXCOORD0;
  27. };
  28. struct v2f
  29. {
  30. float2 uv : TEXCOORD0;
  31. float4 vertex : SV_POSITION;
  32. };
  33. sampler2D _MainTex;
  34. float4 _MainTex_ST;
  35. int _CellWidth; //一行有4格
  36. int _CellHeight; //一列也有4格
  37. float _Speed; //给一个速度控制值
  38. v2f vert (appdata v)
  39. {
  40. v2f o;
  41. o.vertex = UnityObjectToClipPos(v.vertex);
  42. o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  43. return o;
  44. }
  45. fixed4 frag (v2f i) : SV_Target
  46. {
  47. //时间递增,使用int储存保证数值的间隔跳动
  48. int time = _Time.y * _Speed;
  49. //x偏移使用取模保证0-3
  50. float x = time % _CellWidth;
  51. //y偏移先确定行数,再取模0-3
  52. float y = (time / _CellWidth)%_CellHeight;
  53. //最后组装一个新的局部偏移uv
  54. float2 uv = float2((i.uv.x + x)/(float)_CellWidth,(i.uv.y + y)/(float)_CellHeight);
  55. fixed4 col = tex2D(_MainTex, uv);
  56. return col;
  57. }
  58. ENDCG
  59. }
  60. }
  61. }

           达到的效果如下:

         C for Graphic:uv动画特效

      上面就是uv动画最常用的序列帧效果了。

      下面再来一个闪电的效果,代码如下:

   

  1. Shader "Unlit/uvFlashUnlitShader"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. _XSpeed("xspeed",Range(0.1,10.0)) = 1.0
  7. _YSpeed("yspeed",Range(0.1,10.0)) = 1.0
  8. _XOffset("xoffset",Range(0,1.0)) = 1.0
  9. _YOffset("yoffset",Range(0,1.0)) = 1.0
  10. }
  11. SubShader
  12. {
  13. Tags { "RenderType"="Transparent" }
  14. LOD 100
  15. Pass
  16. {
  17. ZWrite Off
  18. Blend SrcAlpha OneMinusSrcAlpha
  19. CGPROGRAM
  20. #pragma vertex vert
  21. #pragma fragment frag
  22. #include "UnityCG.cginc"
  23. struct appdata
  24. {
  25. float4 vertex : POSITION;
  26. float2 uv : TEXCOORD0;
  27. };
  28. struct v2f
  29. {
  30. float2 uv : TEXCOORD0;
  31. float4 vertex : SV_POSITION;
  32. };
  33. sampler2D _MainTex;
  34. float4 _MainTex_ST;
  35. float _XSpeed; //x偏移速度
  36. float _YSpeed; //y偏移速度
  37. float _XOffset; //x偏移幅度
  38. float _YOffset; //y偏移幅度
  39. v2f vert (appdata v)
  40. {
  41. v2f o;
  42. o.vertex = UnityObjectToClipPos(v.vertex);
  43. o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  44. return o;
  45. }
  46. fixed4 frag (v2f i) : SV_Target
  47. {
  48. //x进行sin周期运动,y直接前向运动
  49. float2 uv = float2(cos(_Time.y * _XSpeed) * _XOffset, _Time.y * _YSpeed * _YOffset);
  50. i.uv += uv;
  51. fixed4 col = tex2D(_MainTex, i.uv);
  52. return col;
  53. }
  54. ENDCG
  55. }
  56. }
  57. }

      效果图如下:

   C for Graphic:uv动画特效

       当然图片是随便p的,没有那么完美的显示效果。

       上面就是uv操作能达到的一些效果了,其他的uv效果看大家想象发挥。

       so,我们接下来继续。

 

相关文章:

  • 2022-01-10
  • 2022-12-23
  • 2022-12-23
  • 2022-01-24
  • 2021-08-12
  • 2022-01-31
  • 2021-05-15
猜你喜欢
  • 2022-12-23
  • 2021-07-03
  • 2021-05-22
  • 2021-06-28
  • 2021-08-27
  • 2022-01-04
相关资源
相似解决方案