Unity给物体添加流光材质

1.新建流光材质

  1. 在project点击空白处,新建新材质
    在这里插入图片描述
  2. 在project再新建shader文件
    在这里插入图片描述
  3. shader文件代码
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/sharkshader"
{
	Properties
	{
			_MainTex("Base (RGB)", 2D) = "white" {}
			_FlashColor("Flash Color", Color) = (1,1,0.5,1)
			_Angle("Flash Angle", Range(0, 180)) = 60
			_Width("Flash Width", Range(0, 1)) = 0.2
			_LoopTime("Loop Time", Float) = 1
			_Interval("Time Interval", Float) = 1
				// _BeginTime ("Begin Time", Float) = 2
	}
		SubShader
			{
				 Tags
				 {
					 "Queue" = "Transparent"
					 "IgnoreProjector" = "True"
					 "RenderType" = "Transparent"
					 "PreviewType" = "Plane"
					 "CanUseSpriteAtlas" = "True"
				 }
				// 源rgba*源a + 背景rgba*(1-源A值)   
				Blend SrcAlpha OneMinusSrcAlpha
				Pass
				{
					CGPROGRAM
					#pragma vertex vert     
					#pragma fragment frag     
					#include "UnityCG.cginc"     

					struct appdata_t
					{
						float4 vertex   : POSITION;
						float4 color    : COLOR;
						float2 texcoord : TEXCOORD0;
					};

					struct v2f
					{
						float4 vertex   : SV_POSITION;
						fixed4 color : COLOR;
						half2 texcoord  : TEXCOORD0;
					};

				sampler2D _MainTex;


				  float4 _FlashColor;
				  float _Angle;
				  float _Width;
				  float _LoopTime;
				  float _Interval;
				  //float _BeginTime;    
				float inFlash(half2 uv)
				{
					float brightness = 0;

					float angleInRad = 0.0174444 * _Angle;
					float tanInverseInRad = 1.0 / tan(angleInRad);

					//float currentTime = _Time.y - _BeginTime;
					float currentTime = _Time.y;
					float totalTime = _Interval + _LoopTime;
					float currentTurnStartTime = (int)((currentTime / totalTime)) * totalTime;
					float currentTurnTimePassed = currentTime - currentTurnStartTime - _Interval;

					bool onLeft = (tanInverseInRad > 0);
					float xBottomFarLeft = onLeft ? 0.0 : tanInverseInRad;
					float xBottomFarRight = onLeft ? (1.0 + tanInverseInRad) : 1.0;
					float percent = currentTurnTimePassed / _LoopTime;
					float xBottomRightBound = xBottomFarLeft + percent * (xBottomFarRight - xBottomFarLeft);
					float xBottomLeftBound = xBottomRightBound - _Width;

					float xProj = uv.x + uv.y * tanInverseInRad;

					if (xProj > xBottomLeftBound && xProj < xBottomRightBound)
					{
							brightness = 1.0 - abs(2.0 * xProj - (xBottomLeftBound + xBottomRightBound)) / _Width;
					}

						return brightness;
					}
				v2f vert(appdata_t IN)
				{
					v2f OUT;
					OUT.vertex = UnityObjectToClipPos(IN.vertex);
					OUT.texcoord = IN.texcoord;
					#ifdef UNITY_HALF_TEXEL_OFFSET     
							OUT.vertex.xy -= (_ScreenParams.zw - 1.0);
					#endif     
							OUT.color = IN.color * _FlashColor;
							return OUT;
				}

				fixed4 frag(v2f IN) : SV_Target
				{
					half4 color = tex2D(_MainTex, IN.texcoord) * IN.color;
					//float grey = dot(color.rgb, fixed3(0.22, 0.707, 0.071));   
					//return half4(grey,grey,grey,color.a);    

					///
					half4 texCol = tex2D(_MainTex, IN.texcoord);
					float brightness = inFlash(IN.texcoord);

					color.rgb = texCol.rgb + _FlashColor.rgb * brightness;
					color.a = texCol.a;
					return color;
				}
				ENDCG
				}
			}
				FallBack "Unlit/Transparent"
}

  1. 将shader文件拖拽到材质球上,调整属性
    在这里插入图片描述

2.代码中给物体添加流光材质

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine.UI;
using System;
using UnityEngine.EventSystems;
public class LHandle : MonoBehaviour  
{
public RawImage  ImgObj;  //需要添加流光材质的物体
public Material liuMaterial;   //流光材质
 void Start()
 {
  AddMeterial();
 }
 public void AddMeterial()
 {
  // 将当前点击的图片对象设置为流光材质
 ImgObj.GetComponent<RawImage>().material = liuMaterial;
 }
   void Update()
 { 
 
 }   

}

3.在unity中添加代码,绑定控件

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值