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 ...
随机推荐
- BIND rndc—使用说明
rndc—使用说明 rndc设置(本地) 产生/etc/rndc.key 执行”rndc-confgen -a”指令后,会在/etc目录下产生rndc.key文件, 而所产生的文 ...
- Windows GTK+ 环境搭建(详解)
来源:http://blog.sina.com.cn/s/blog_a6fb6cc901017ygy.html Windows GTK+ 环境搭建 最近要做界面的一些东西,但是对微软提供的类库MFC不 ...
- 基于Win32 SDK实现的一个简易线程池
利用C++实现了一个简易的线程池模型(基于Win32 SDK),方便使用多线程处理任务.共包含Thread.h.Thread.cpp.ThreadPool.h.ThreadPool.cpp四个源文件. ...
- STM32F407的硬件I2C
源:STM32F407的硬件I2C 我使用的是STM32的固件库. 硬件模块使用之前必须配置其参数,I2C的配置如下: void IIC_Config(void) { GPIO_InitTypeDef ...
- Goods transportation
Goods transportation time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- phpmyadmin导出数据中文乱码问题
phpMyAdmin版本是2.9.1.1 用phpMyAdmin备份数据库,导出来后,在本地用sqlyog还原的时候,出现如下错误:Error occured at:2009-03-03 10:09: ...
- easyui实现权限管理
在js中: function makeEasyTree(data){ if(!data) return []; var _newData = []; //最终返回结果 var _treeArray = ...
- ntp源码解读(一)
/* * session_key - generate session key * * This routine generates a session key from the source add ...
- js框架——angular.js(6)
1. ng-class 这个指令是用来绑定一个或者多个css代码.它的值一般是一个表达式,也可以是函数什么的,只要返回的确实是一个类的名字就可以—— ng-class="nextPageDi ...
- HTML一些小细节
这里主要是记录一些看起来不重要,但是其实作用不小或者使用起来某种情况下好用的东西,又或者是重要的但容易忽略的基础知识 1. HTML5之后的第一个标签是<!DOCTYPE html> 这个 ...