今天来个炫酷的点击屏幕实现水波纹的特效,先上两张效果图。

放大下看下细节,

当然还有好多效果,自己发挥了。。。

直接上代码,注释已经写了哦

    Shader "Custom/ClickStyle" {Properties {[PerRendererData]_MainTex("Sprite Texture",2D)="white"{}[HideInInspector]_StartTime("Start Time",Float)=0  //起始时间,这个在Ripple中设置就行_AnimationTime("AnimationTime",Range(0.1,10.0))=1.5 //动画时间_Width("Width",Range(0.1,3.0))=0.3   //内圆和外圆形成环的宽度_StartWidth("Start Width",Range(0,1.0))=0.3  //内圆的默认直径,注意这里是按照uv尺寸走的,最大也就是1[Toggle]_isAlpha("isAlpha",Float)=1[Toggle]_isColorShift("isColorShift",Float)=1[MaterialToggle]PixelSnap("Pixe Snap",Float)=1}SubShader {//启用透明混合,要不然没有透明效果哦Tags{"Queue"="Transparent" "RenderType"="Transparent"}Blend SrcAlpha OneMinusSrcAlphaPass{CGPROGRAM#pragma target 3.0#pragma vertex vert #pragma fragment frag #include "UnityCG.cginc"struct v2f{float4 vertex:SV_POSITION;float2 texcoord:TEXCOORD0;};sampler2D _MainTex;float _StartTime;float _AnimationTime;float _StartWidth;float _Width;float _isAlpha;float _isColorShift;v2f vert(appdata_base IN){v2f OUT;OUT.vertex=UnityObjectToClipPos(IN.vertex);OUT.texcoord=IN.texcoord;return OUT;}//这个函数是用来变换颜色的,当然你可以想怎么干就怎么干,随你洛。//注意这个函数写在frag函数前面,要不然不识别哦fixed3 shift_col(fixed3 RGB,half3 shift){fixed3 RESULT = fixed3(RGB);float VSU = shift.z*shift.y*cos(shift.x*3.14159265 / 180);float VSW = shift.z*shift.y*sin(shift.x*3.14159265 / 180);RESULT.x = (.299*shift.z + .701*VSU + .168*VSW)*RGB.x+ (.587*shift.z - .587*VSU + .330*VSW)*RGB.y+ (.114*shift.z - .114*VSU - .497*VSW)*RGB.z;RESULT.y = (.299*shift.z - .299*VSU - .328*VSW)*RGB.x+ (.587*shift.z + .413*VSU + .035*VSW)*RGB.y+ (.114*shift.z - .114*VSU + .292*VSW)*RGB.z;RESULT.z = (.299*shift.z - .3*VSU + 1.25*VSW)*RGB.x+ (.587*shift.z - .588*VSU - 1.05*VSW)*RGB.y+ (.114*shift.z + .886*VSU - .203*VSW)*RGB.z;return RESULT;}fixed4 frag(v2f IN):SV_Target{fixed4 color=tex2D(_MainTex,IN.texcoord);float2 pos=(IN.texcoord-float2(0.5,0.5))*2; //计算像素点到中心的距离,乘以2就当做圆的直径吧。//如果从中心开始向外扩散//  float dis=(_Time.y-_StartTime)/_AnimationTime-length(pos);//如果指定内径开始向外扩散 ,在Ripple类中 已经减去了开始长度的时间。所以这里就不用再减了float dis=(_Time.y-_StartTime)/_AnimationTime+_StartWidth-length(pos);//大于最大宽度以及小于0都去掉这部分像素if(dis<0||dis>_Width){return fixed4(0,0,0,0);}//测试用//if(dis < 0 )//{//  return fixed4(1,0,0,1);//}//if(dis>_Width)//{//  return fixed4(0,1,0,1);//}//如果开启了透明度渐变就让透明度进行插值float alpha=1;if(_isAlpha==1){alpha = clamp((_Width-dis)*3,0.1,1.5);}fixed3 shiftColor=color;if(_isColorShift==1){half3 shift=half3(_Time.w*10,1,1);shiftColor=shift_col(color,shift);}return fixed4(shiftColor,color.a*alpha);}ENDCG}}}

注意Shader的测试技巧哦。

C#代码如下:

        using System.Collections;using System.Collections.Generic;using UnityEngine;[RequireComponent(typeof(SpriteRenderer))][RequireComponent(typeof(Collider2D))]public class Ripple : MonoBehaviour {SpriteRenderer mSpriteRenderer;Collider2D mCircleCollider;void Awake(){mSpriteRenderer = transform.GetComponent<SpriteRenderer>();mCircleCollider = transform.GetComponent<Collider2D>();}// Use this for initializationvoid Start () {Invoke("unenbaleTrigger", 0.05f);mSpriteRenderer.material.SetFloat("_StartTime", Time.time);float animationTime = mSpriteRenderer.material.GetFloat("_AnimationTime");float destroyTime = animationTime;//需要减去起始位置所需要消耗的时间destroyTime -= mSpriteRenderer.material.GetFloat("_StartWidth") * animationTime;Destroy(transform.gameObject, destroyTime);}public void unenbaleTrigger(){mCircleCollider.enabled = false;}public void OnTriggerEnter2D(Collider2D collision){}}

子健创建一个空物体,然后按照下图对应添加组件就完事

把这个对象作成预设。

再弄个点击屏幕,然后生成预设体脚本。代码如下:

    using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.EventSystems;using UnityEngine.UI;[RequireComponent(typeof(Image))]public class Control : MonoBehaviour,IPointerDownHandler,IPointerUpHandler,IDragHandler {public GameObject prefabRippleEffect;public float distance;// Use this for initializationvoid Start () {distance = transform.localPosition.z - Camera.main.transform.localPosition.z;}// Update is called once per framevoid Update () {CheckTap();}void CheckTap(){if (Input.GetMouseButtonDown(0)){var dian = Input.mousePosition;Debug.Log(dian);CreateNewRipple(dian);}}void CreateNewRipple(Vector2 pos){Vector2 worldPos = Camera.main.ScreenToWorldPoint(new Vector3(pos.x,pos.y,distance));Debug.Log(worldPos);GameObject tem = Instantiate(prefabRippleEffect);tem.transform.localPosition = new Vector3(worldPos.x,worldPos.y,0);tem.transform.SetParent(transform,true);}public void OnPointerDown(PointerEventData eventData){// CreateNewRipple(eventData.position);}public void OnPointerUp(PointerEventData eventData){}public void OnDrag(PointerEventData eventData){}}

创建一个空物体,把这个脚本挂上去即可。

不明白的地方欢迎留言交流哦。。。


附上工程链接:水波纹Shader

Unity 水波纹Shader相关推荐

  1. 游戏图形学——屏幕后期特效:水波纹

    在之前的文章简单的波动中有介绍波动方程,本文以此为基础学习屏幕后期特效:水波纹 Shader代码如下: Shader "Hidden/ScreenWave" {Properties ...

  2. 用shader做水波纹效果

    用shader做水波纹效果 1.效果展示: 2.代码: shader代码: Shader "Unlit/Water" {Properties{_MainTex("Text ...

  3. unity捕鱼达人----炮台的旋转的实现以及水波纹动画的制作

    炮台的旋转 炮台的转向由鼠标控制,当我们控制鼠标向右旋转使可以发现,炮台的position为负的 所以我们可以以炮台的正方向与鼠标位置的夹角来实现炮台的旋转 如图中所示用加粗笔所画的表示MousePo ...

  4. 自定义水波纹效果,可设置波纹条数和波纹颜色,使用简单

    1.先上一波效果图,是会动的哈,我这里上传了一张静态图片,可设置波纹个数.波峰高度.透明度.颜色等等属性,看大家个人需求.图中是3条水波纹,使用方法特别简单,直接xml中调用就可以.接下来上代码 2. ...

  5. Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...

  6. 超酷的计步器APP(一)——炫酷功能实现,自定义水波纹特效、自定义炫酷开始按钮、属性动画的综合体验

    超酷的计步器APP(一)--炫酷功能实现,自定义水波纹特效.自定义炫酷开始按钮.属性动画的综合体验 好久没写博客了,没给大家分享技术了,真是有些惭愧.这段时间我在找工作,今年Android的行情也不怎 ...

  7. Android 自定义球型水波纹,带圆弧进度

    需求 如下,实现一个圆形水波纹,带进度,两层水波纹需要渐变显示,且外围有一个圆弧进度. 思路 外围圆弧进度:可以通过canvas.drawArc()实现.由于圆弧需要实现渐变,可以通过给画笔设置sha ...

  8. android水波效果,android动态壁纸中的水波纹效果

    [实例简介] android动态壁纸中的水波纹效果,采用opengl中的shader实现 [实例截图] [核心代码] @Override public String getVertexShader() ...

  9. 类似咻一咻,水波纹实现

    一.效果 点击开始: 点击停止: 二.在MainActivity中 import android.graphics.Paint; import android.os.Bundle; import an ...

最新文章

  1. 测试和恢复性的争论:面向对象vs.函数式编程
  2. Delphi 写服务程序
  3. 由树先序遍历和中序遍历输出其后续遍历
  4. 因 Redis 分布式锁造成的 P0 级重大事故,整个项目组被扣了绩效。。。
  5. 1.9 通过反射获取注解信息
  6. vb6 combo根据index显示_VB6.0软件安装教程及学习资源
  7. 【Fanvas技术解密】HTML5 canvas实现脏区重绘
  8. 请求报文的方法及get与post的区别
  9. 机器学习之amp;amp;Andrew Ng课程复习--- 聚类——Clustering
  10. atitit.解决SyntaxError: missing ] after element list不个object 挡成个str eval ....
  11. c语言 word转pdf,批量Word转PDF之捷径
  12. 软件以人为本5 - 敏捷3 - 拯救每日立会2
  13. 我使用的安卓软件名单_我是亲民_新浪博客
  14. rrpp协议如何修改_RRPP配置注意事项
  15. Windows 10 的系统要求
  16. Sony Xperia SP M35H刷MIUI
  17. android 手柄助手,新游手柄助手app
  18. hardmard积 用什么符号表示_复数域符号相乘的差分网络编码
  19. 大学计算机基础第二版期末试题,大学计算机基础考试试题
  20. 《大话数据结构》学习心得

热门文章

  1. 从各大APP年度报告看用户画像——标签,比你更懂你自己
  2. 为什么新品发布上架之后会没有流量,新品应该怎么发布?
  3. java计算机毕业设计吉他库存管理源码+mysql数据库+系统+lw文档+部署
  4. 解决 have unmet dependencies: youdao-dict :
  5. OpenVZ平台魔改BBR之Rinetd
  6. keil5安装包下载
  7. 中国不是不能开发出自己的浏览器,而是没必要
  8. MySQL第六讲 MySQL分库分表方案
  9. 阿里面试官鬼得很,问我为什么他们阿里要禁用Executors创建线程池?
  10. 前TT(前T/T)与后TT(后T/T),以及信用证(LC,L/C)付款方式比较