标签:
先上效果
上Shader
Shader "Unlit/Transparent Colored Flow Texture" { Properties { _MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {} _FlashTex("Flash (RGB), Alpha (A)", 2D) = "white" {} _FlashColor("Flash Color", Color) = (1,1,1,0) _Width("Width", Float) = 0.2 _Speed("Speed", Float) = 1.0 _Angle("Angle", Float) = 0.1 _TotalTime("Begin Time", Float) = 0.0 } SubShader { LOD 200 Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } Pass { Cull Off Lighting Off ZWrite Off Fog { Mode Off } Offset -1, -1 Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTex; float4 _MainTex_ST; sampler2D _FlashTex; float4 _FlashColor; float _Width; float _Speed; float _Angle; float _TotalTime; struct appdata_t { float4 vertex : POSITION; float2 texcoord : TEXCOORD0; fixed4 color : COLOR; }; struct v2f { float4 vertex : SV_POSITION; half2 texcoord : TEXCOORD0; fixed4 color : COLOR; }; v2f o; v2f vert (appdata_t v) { o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.texcoord = v.texcoord; o.color = v.color; return o; } fixed4 frag (v2f IN) : COLOR { float4 col = tex2D(_MainTex, IN.texcoord) * IN.color; float pivot = fmod(_Time.y,_TotalTime)*_Speed+IN.texcoord.y*tan(_Angle); //pivot = pivot-floor(pivot); float diff = IN.texcoord.x-pivot; if(abs(diff)<_Width*0.5) { float2 uv = float2((0.5+diff)/_Width,IN.texcoord.y); float4 flashCol = tex2D(_FlashTex,uv)*_FlashColor; col.rgb = lerp(col.rgb,flashCol.rgb,flashCol.w); } return col; } ENDCG } } SubShader { LOD 100 Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } Pass { Cull Off Lighting Off ZWrite Off Fog { Mode Off } Offset -1, -1 ColorMask RGB Blend SrcAlpha OneMinusSrcAlpha ColorMaterial AmbientAndDiffuse SetTexture [_MainTex] { Combine Texture * Primary } } } }
脚本
using UnityEngine; using System.Collections; /*------------------------------------------------------------------- Copyright 2015 Minty Game LTD. All Rights Reserved. Maintained by blue ------------------------------------------------------------------- blue 2016-01-26 14:45:52 带流光的UITexture */ [ExecuteInEditMode] [RequireComponent(typeof(UITexture))] public class UIFlowTexture : MonoBehaviour { //流光纹理的宽度 [SerializeField] private float FlowWidth = 0.2f; //流光颜色 [SerializeField] private Texture FlowTexture = null; //流光速度 [SerializeField] private float FlowTime = 0.5f; //流光播放完之后的延迟时间 [SerializeField] private float DelayTime = 1.0f; //流光纹理的斜度 [SerializeField] private float Angle = -0.1f; //流光颜色 [SerializeField] private Color FlowColor = Color.white; //是否开启流光 [SerializeField] private bool Flow = true; //被流光的UITexture private UITexture mUITexture; void Awake() { mUITexture = gameObject.GetComponent<UITexture>(); } // Use this for initialization void Start () {
//注意这是我们的资源加载方式,你可以改成自己的 ResourceManager.PrepareResource<Material>(Resource.Dir.Material + "UITexture_Flow.mat", material => { mUITexture.material = new Material(material); RefreshMaterialProperty(); }); } void SetFlow(bool flag) { if(Flow!=flag) { Flow = flag; RefreshMaterialProperty(); } } [ContextMenu("Refresh Material Property")] public void RefreshMaterialProperty() { var mat = mUITexture.material; if(null==mat) { return; } if(null!=FlowTexture) { mat.SetTexture("_FlashTex", FlowTexture); } mat.SetFloat("_Width", FlowWidth); mat.SetFloat("_Speed", 1.0f/FlowTime); mat.SetFloat("_Angle", Angle); if (Flow) { mat.SetColor("_FlashColor", FlowColor); } else { mat.SetColor("_FlashColor", new Color(0, 0, 0, 0)); } if (null != mat) { mat.SetFloat("_TotalTime", FlowTime+DelayTime); } mUITexture.SetDirty(); } }
搞法:
1、创建个材质命名成UITexture_Flow.mat,把上面的shader拖拽进去。
2、创建GameObject,挂上UITexture(不用修改的材质,原因是我代码里会去修改他的材质。为什么总是new 新的材质,原因是每个UITexture都要自己流动自己的)
3、然后再挂上UITextureFlow,设置流光的参数
标签:
原文地址:http://www.cnblogs.com/mrblue/p/5163030.html