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 ...
随机推荐
- 转载 C语言中volatile关键字的作用
一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没 ...
- Mysql转化blob为可读
-- info 为列名 SELECT convert(info using latin1) FROM drupal755.system; SELECT convert(info using utf8) ...
- 字符串查找 cmd find命令
find /i "ora-" *.log 我对findstr是如此的依赖,以至于当我向各位讲解find命令的时候,我还得老老实实地在cmd窗口中敲下 find /? 这条命令,然后 ...
- java跳过构造方法新建对象
Java有四种创建对象的方法: (1) 用new语句创建对象,这是最常见的创建对象的方法. (2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constr ...
- java获取程序执行时间
第一种是以毫秒为单位计算的. //伪代码 long startTime=System.currentTimeMillis(); //获取开始时间 doSomeThing(); //测试的代码段 lon ...
- Hibernate 系列教程9-自关联
自关联:本质还是原来双向一对多,原来要配置两个类,现在全部都配置在一个类里面 Employee public class Employee { private Long id; private Str ...
- UVA - 11732 "strcmp()" Anyone?左兄弟右儿子trie
input n 2<=n<=4000 s1 s2 ... sn 1<=len(si)<=1000 output 输出用strcmp()两两比较si,sj(i!=j)要比较的次数 ...
- ThreadLocal类及常用的线程安全类探究
1.ThreadLocal类 ThreadLocal是Thread Local Variable的简称,意思是线程局部变量.作用是为每一个使用该变量的线程都提供一个该变量的副本,使每一个线程都能独立操 ...
- AI 人工智能 探索 (一)
碰撞检测 //逗留碰撞 void OnTriggerStay (Collider other) { if (other.transform.name == name) { //检测距离 //根据距离 ...
- img图片inline-block总结
<div style="font-size:0;"> <img data-src="http://image.zhangxinxu.com/image/ ...