NGUI具有流光效果的UISprite
之前做过一个流光效果(http://www.cnblogs.com/jietian331/p/4748644.html)。
现将其改进一下,与NGUI结合起来,提供一个具有流光效果的组件:UIWalkLightSprite。
效果如图:

首先是此组件的源码,如下:
using System;
using UnityEngine; /// <summary>
/// 具有流光效果的 UISprite。
/// 注意:
/// 1. 流光图片需命名为"Special_WalkLight"(待改善)
/// 2. 流光的 UISprite 暂不支持 UIPanel 剪裁(待改善)
/// 3. 设置 UISprite 的 color 将无效
/// </summary>
public class UIWalkLightSprite : UISprite
{
const string WalkLightShaderName = "Bleach/Walk Light Colored"; float m_duration = 2f;
float m_widthLight2Sprite;
float m_timer;
float m_t1;
bool m_initedMat = true;
Vector2 m_lightURange; void Awake()
{
// replace shader
if (base.atlas.spriteMaterial.shader.name != WalkLightShaderName)
{
string tempAtlasName = string.Format("[WalkLightTempAtlas_{0}]", atlas.name);
Transform t = transform.Find(tempAtlasName);
if (t == null)
t = ((GameObject)GameObject.Instantiate(atlas.gameObject)).transform; t.gameObject.SetActive(false);
t.name = tempAtlasName;
t.parent = transform; var tempAtlas = t.GetComponent<UIAtlas>();
if (tempAtlas.spriteMaterial.name != WalkLightShaderName)
{
Material mat = (Material)GameObject.Instantiate(atlas.spriteMaterial);
mat.shader = Shader.Find(WalkLightShaderName);
tempAtlas.spriteMaterial = mat;
} base.atlas = tempAtlas;
}
} public override void OnFill(BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols)
{
base.OnFill(verts, uvs, cols); // set uv2 to vertex
var lightSprite = atlas.GetSprite("Special_WalkLight");
Rect lightOuter = new Rect(lightSprite.x, lightSprite.y, lightSprite.width, lightSprite.height);
lightOuter = NGUIMath.ConvertToTexCoords(lightOuter, mainTexture.width, mainTexture.height); // 用 color 把流光图片的 uv 地址传到 shader 中,故会导致设置 color 无效
cols.Clear();
cols.Add(new Color(lightOuter.xMin, lightOuter.yMin, ));
cols.Add(new Color(lightOuter.xMin, lightOuter.yMax, ));
cols.Add(new Color(lightOuter.xMax, lightOuter.yMax, ));
cols.Add(new Color(lightOuter.xMax, lightOuter.yMin, )); // data set to shader
m_initedMat = false;
m_lightURange = new Vector2(lightOuter.xMin, lightOuter.xMax); Rect spriteOuter = new Rect(mSprite.x, mSprite.y, mSprite.width, mSprite.height);
spriteOuter = NGUIMath.ConvertToTexCoords(spriteOuter, mainTexture.width, mainTexture.height);
m_widthLight2Sprite = (lightOuter.width * spriteOuter.height) / (lightOuter.height * spriteOuter.width);
m_t1 = ( - m_widthLight2Sprite) * m_duration;
} protected override void OnUpdate()
{
base.OnUpdate(); if (RendererMat != null)
{
if (!m_initedMat)
{
m_initedMat = true; // init
RendererMat.SetFloat("_LightWidthToMain", m_widthLight2Sprite);
RendererMat.SetVector("_LightURange", m_lightURange);
} // 驱动流光动画
RendererMat.SetFloat("_TimeRate", m_timer / m_duration); m_timer += Time.deltaTime; if (m_timer > m_duration)
m_timer = ;
else if (m_timer > m_t1)
RendererMat.SetFloat("_ReachBoundary", );
else
RendererMat.SetFloat("_ReachBoundary", -);
}
} Material RendererMat
{
get { return base.Renderer != null ? base.Renderer.sharedMaterial : null; }
} public float Duration
{
set
{
if (value <= )
throw new ArgumentException("value <= 0"); m_duration = value;
m_t1 = ( - m_widthLight2Sprite) * m_duration;
}
}
}
UISprite
对应的 shader 如下:
Shader "Bleach/Walk Light Colored"
{
Properties
{
_MainTex ("RGB", 2D) = "black" {}
_AlphaTex ("Alpha", 2D) = "black" {}
} SubShader
{
LOD Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
} Pass
{
Cull Off
Lighting Off
ZWrite Off
Fog { Mode Off }
Offset -, -
Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM
#pragma vertex vert
#pragma fragment frag sampler2D _MainTex;
sampler2D _AlphaTex; uniform fixed2 _LightURange; // 光图片在 u 上的范围
uniform fixed _LightWidthToMain; // 光图片宽度占主图片宽度的比例
uniform fixed _ReachBoundary; // 小于0表示未到边界,大于0表示到达边界
uniform fixed _TimeRate; // 时间/周期 struct appdata_t
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
fixed4 color : COLOR;
}; struct v2f
{
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
half2 uv2 : TEXCOORD1; // 流光图的 uv 坐标
}; v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = v.texcoord;
fixed fixedU=(v.color.x - _LightURange.x) / (_LightURange.y - _LightURange.x); // 把 u 坐标转到[0,1]范围
o.uv2 = fixed2(fixedU,v.color.y);
return o;
} fixed4 frag (v2f IN) : COLOR
{
fixed4 main;
main.rgb = tex2D(_MainTex, IN.texcoord).rgb;
main.a = tex2D(_AlphaTex, IN.texcoord).a; // 流光
fixed x = _ReachBoundary > && IN.uv2.x < _LightWidthToMain ? IN.uv2.x+ : IN.uv2.x;
fixed lightU = (x - _TimeRate) / _LightWidthToMain;
lightU = (_LightURange.y - _LightURange.x) * lightU + _LightURange.x; // 把 u 坐标从[0,1]范围转回来
lightU = clamp(lightU, _LightURange.x, _LightURange.y);
fixed2 lightUV = fixed2(lightU, IN.uv2.y);
fixed lightA = tex2D(_AlphaTex, lightUV).a; // 融合
fixed3 col = main.rgb * ( + lightA * 1.5);
return fixed4(col, main.a);
}
ENDCG
}
} SubShader
{
LOD Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
} Pass
{
Cull Off
Lighting Off
ZWrite Off
Fog { Mode Off }
Offset -, -
ColorMask RGB
Blend SrcAlpha OneMinusSrcAlpha
ColorMaterial AmbientAndDiffuse SetTexture [_MainTex]
{
Combine Texture * Primary
} SetTexture [_AlphaTex]
{
Combine previous, texture * primary
}
}
}
}
Shader
转载请注明出处:http://www.cnblogs.com/jietian331/p/5261772.html
NGUI具有流光效果的UISprite的更多相关文章
- NGUI制作流光效果
效果展示: 技巧: 1.勾选UIPanel下的Normal启用UI的法线贴图,并建立带有法线贴图的UI对象(此处用NGUI自带的Reflector.Atlas中的图作为UI). 2.建立点光源并为其添 ...
- Unity3d流光效果
Material中纹理的属性都有Tiling和Offset,可以利用Offset做uv动画,从而完成各种有趣的动画,比如流光效果! 流过效果即通常一条高光光在物体上划过,模拟高光移动照射物体的效果,之 ...
- Unity3d之流光效果
所谓流光效果,如一个图片上一条刀光从左闪到右边,以下为实现代码: c#代码: using System; using UnityEngine; public class WalkLightEffect ...
- Unity Shader 效果(1) :图片流光效果
很多游戏Logo中可以看到这种流光效果,一般的实现方案就是对带有光条的图片uv根据时间进行移动,然后和原图就行叠加实现,不过实现过程中稍稍有点需要注意的地方.之前考虑过风宇冲的实现方式,但是考虑到sh ...
- 今天写shader流光效果,shader代码少了个括号,unity shader compiler卡死且不提示原因
今天写shader流光效果,shader代码少了个括号,unity shader compiler卡死且不提示原因 好在找到了原因,shader 代码如下,原理是提高经过的颜色亮度 void surf ...
- css流光效果
css流光效果1: <!DOCTYPE html> <html> <head> <title>ww</title> </head> ...
- NGUI技能CD效果制作(sprite的type:filled)
一,我们先添加一个sprite,改名为skill.给当前skill添加图片,然后再sprite下添加一个sprite和一个label,结果如下 二现在我们来设置skill下的sprite,给他设置一个 ...
- unity 实现流光效果
1.通过一些简单效果可以让我们更好的去理解shader,具体都在代码注释中: Shader "Unlit/MoveLightImage" { Properties { //主纹理 ...
- Unity之流光效果
效果如图: shader如下: Shader "Unlit/Walk light" { Properties { _MainTex ("Base (RGB), Alpha ...
随机推荐
- Qt多线程编程总结(一)
http://blog.csdn.net/mznewfacer/article/details/6965799 QMutex类 一个线程可以锁定互斥量,并且在它锁定之后,其它线程就不能再锁定这个互斥量 ...
- QML Flipable、Flickable和状态与动画 下篇
本文介绍的是Flickable和状态与动画,我们以前接触过QML相关的内容,那么本文介绍的内容就很明了了.先来看内容. AD: Flickable和状态与动画 下篇是本节要介绍的内容,Flickabl ...
- SQL语句创建access表
CREATE TABLE Persons(ID AutoIncrement primary key,Id_P int NOT NULL,LastName varchar(255) NOT NULL,s ...
- ant 配置 和测试 1
配置路径 D:\dba\change\UAT\unity\schema\test ----v0 版本 sql.xml (默认target 是versionfinal ,也就是最终版本) --ver ...
- regress
#! /bin/ksh ############### ### UAT ### ############### export ENVS=/test/change/env/env_test.sq ...
- 一款值得推荐的shell工具
1. 一款比较出色的shell工具 熟练的运用shell语言可以提高我们的工作效率,而一款好的shell工具能提高学习的效率,fish shell就是这样一款工具.并且是一款跨平台的工具, 同时可以在 ...
- initWithFrame、initWithCoder、awakeFromNib的区别和调用次序 & UIViewController生命周期 查缺补漏
当我们创建或者自定义一个UI控件时,就很可能会调用awakeFromNib.initWithCoder .initWithFrame这些方法.三者的具体区别如下: initWithFrame: 通过代 ...
- 基础-Servlet
Servlet是运行在web服务器上的一个java类. 它的作用是将http请求和http相应进行操作完成我们的业务逻辑. servlet创建: 1.创建一个类extends HttpServlet ...
- ajax遇到的问题
今天做了个小小的实验,用ajax XMLHttpRequest对象读取服务器上的txt文件里的内容,展示出来 直接把html文件放在桌面用浏览器打开,没有反应,部分代码如下: function oHt ...
- “玲珑杯”ACM比赛 Round #1 题解
A:DESCRIPTION Eric has an array of integers a1,a2,...,ana1,a2,...,an. Every time, he can choose a co ...