您的位置:首页 > 移动开发 > Unity3D

【Unity特效】永恒战士3中的死亡特效

2015-11-13 15:31 471 查看

概述

玩过永恒战士3的玩家,应该对它的怪物死亡特效记忆犹新,没玩过也不要紧,先放一张效果图。



原理

首先,我们需要2张控制图,如下所示。



模型由它原本的贴图,逐渐过渡到storm贴图的,看上去类似尘埃的效果。timeline则用于显示效果的控制,随着uv的x方向的逐渐递增,会看到光环闪过,并且x坐标接近1时,alpha会快速递减。

我们看到,模型有一个顶点外扩的过程。这里加了一个控制,越上面的顶点,会越先往外扩。上面提到的timeline的uv坐标也有这个特性。

实现

接下来,看下具体的代码实现。

v2f vert(appdata_base v)
{
v2f o = (v2f)0;
o.pos = mul(_Object2World, v.vertex);
float3 dir = o.pos.xyz - _WorldPos.xyz;
float progress = _Control - (1.0 - dir.y / _MaxHeight);
dir = normalize(dir) + float3(0,1,0);
o.pos.xyz += dir * _Explore * max(0.0, progress - _Delay);
o.pos = mul(UNITY_MATRIX_VP, o.pos);
o.uv.xy = v.texcoord.xy;
o.uv.z = clamp(progress, 0.0, 1.0);
return o;
}


在vertex shader中,将顶点变换到世界空间中,和应用程序中传入的_WorldPos得到外扩的方向,随后归一化,加上y轴单位坐标,得到一个方向修正的外扩方向。

float progress = _Control - (1.0 - dir.y / _MaxHeight);


progress变量控制整个动画进程,_MaxHeight是由应用程序传入的模型高度。越高的点,progress的值就越大。

o.pos.xyz += dir * _Explore * max(0.0, progress - _Delay);


这句代码,将顶点沿方向外扩。_Explore是定义的外扩程度,_Delay起到的效果是,等着timeline贴图的金边闪过后,再顶点外扩。

fixed4 frag(v2f i) : Color
{
fixed4 c = tex2D(_MainTex, i.uv.xy);
fixed4 storm = tex2D(_Storm, i.uv.xy * 2.0);
fixed4 time = tex2D(_TimeLine, i.uv.zw);
fixed4 final;
final.rgb = lerp(c.rgb, storm.rgb, float3(i.uv.z)) + time.rgb;
final.a = lerp(1.0, storm.a, i.uv.z) * time.a;
return final;
}


代码和资源

图片和完整源代码,有需要可以自行去下载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: