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

概述

玩过永恒战士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;
}

代码和资源

图片和完整源代码,有需要可以自行去下载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值