之前做过一个流光效果(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的更多相关文章

  1. NGUI制作流光效果

    效果展示: 技巧: 1.勾选UIPanel下的Normal启用UI的法线贴图,并建立带有法线贴图的UI对象(此处用NGUI自带的Reflector.Atlas中的图作为UI). 2.建立点光源并为其添 ...

  2. Unity3d流光效果

    Material中纹理的属性都有Tiling和Offset,可以利用Offset做uv动画,从而完成各种有趣的动画,比如流光效果! 流过效果即通常一条高光光在物体上划过,模拟高光移动照射物体的效果,之 ...

  3. Unity3d之流光效果

    所谓流光效果,如一个图片上一条刀光从左闪到右边,以下为实现代码: c#代码: using System; using UnityEngine; public class WalkLightEffect ...

  4. Unity Shader 效果(1) :图片流光效果

    很多游戏Logo中可以看到这种流光效果,一般的实现方案就是对带有光条的图片uv根据时间进行移动,然后和原图就行叠加实现,不过实现过程中稍稍有点需要注意的地方.之前考虑过风宇冲的实现方式,但是考虑到sh ...

  5. 今天写shader流光效果,shader代码少了个括号,unity shader compiler卡死且不提示原因

    今天写shader流光效果,shader代码少了个括号,unity shader compiler卡死且不提示原因 好在找到了原因,shader 代码如下,原理是提高经过的颜色亮度 void surf ...

  6. css流光效果

    css流光效果1: <!DOCTYPE html> <html> <head> <title>ww</title> </head> ...

  7. NGUI技能CD效果制作(sprite的type:filled)

    一,我们先添加一个sprite,改名为skill.给当前skill添加图片,然后再sprite下添加一个sprite和一个label,结果如下 二现在我们来设置skill下的sprite,给他设置一个 ...

  8. unity 实现流光效果

    1.通过一些简单效果可以让我们更好的去理解shader,具体都在代码注释中: Shader "Unlit/MoveLightImage" { Properties { //主纹理 ...

  9. Unity之流光效果

    效果如图: shader如下: Shader "Unlit/Walk light" { Properties { _MainTex ("Base (RGB), Alpha ...

随机推荐

  1. 【转】PHP android ios相互兼容的AES加密算法

    APP项目用户密码传输一直没有用HTTPS,考虑到用户的隐私暂时先用AES对密码加密,以后也可以用于手机端与服务端加密交互. PHP的免费版phpAES项目,手机端解码各种不对. 好不容易找了PHP ...

  2. codeforces DIV2 D 最短路

    http://codeforces.com/contest/716/problem/D 题目大意:给你一些边,有权值,权值为0的表示目前该边不存在,但是可以把0修改成另外一个权值.现在,我们重新建路, ...

  3. windows下使用git管理github项目

    1. 下载安装msysgithttp://code.google.com/p/msysgit/downloads/list2. 注册github账号3. 生成ssh公钥和私钥ssh-keygen -C ...

  4. 百度,google的地理编码

    1.百度的地理编码:(不支持中国以外的其它城市) http://api.map.baidu.com/geocoder/v2/?ak=E974997f80db18330f8f5c61d084a677&a ...

  5. UIView的layoutSubviews,initWithFrame,initWithCoder方法

    ****************************layoutSubviews************************************ layoutSubviews是UIView ...

  6. 覆盖问题<shui>

    题目链接 /* hang[maxn]标记每行是否可以被攻击,并计算前缀和 lie [maxn]标记每列是否可以被攻击,并计算前缀和 */ #include<cstdio> // #incl ...

  7. liunx 平台下软件包管理

    RPM/DPKG 两大阵营简介 在 GNU/Linux( 以下简称 Linux) 操作系统中,RPM 和 DPKG 为最常见的两类软件包管理工具,他们分别应用于基于 RPM 软件包的 Linux 发行 ...

  8. Git本地项目上传 & SourceTree & GitHub 简单使用

    Git(分布式版本控制系统) Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理 ...

  9. Linux环境下Android JNI程序的编译

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/8993493 在android开发中,有时候需要编写一些C/C++代码,这时候 ...

  10. html5 之本地数据存储

    HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 cookie与webSt ...