Unity制作角色溶解变成光点消失
大家好,我是阿赵。
在很多游戏里面,角色死亡之后都会有一些特殊的消失方式。这里我也来做一种,角色溶解成光点消失的效果。
我还是随便拿了Unity的资源商店的免费资源来使用。不过由于这个角色自带没有死亡动作,所以我就让他站立着消失了。
刚开始的时候,角色会有一个类似于燃烧分解的过程,然后角色会发光,并且从头到脚开始往上飘,最后化成光点消失:
制作过程:
这个效果主要有2个部分组成,分别是1.角色化成光点、2.往上飘散。
1、 角色化成光点
化成光点分为了RGB和Alpha两个部分
1. RGB
过程很简单,我使用了屏幕坐标为UV,采样一张噪声图,然后通过SmoothStep调整噪声图的颜色范围
再通过一个mixVal混合值,把士兵原有的颜色,和采样噪声图的颜色做一个混合
得到了一个颜色方面的变化。
2. Alpha
Alpha值其实只是一个从白到黑的过程,还是刚才那张噪声图,通过SmoothStep,可以控制噪声图的黑白范围,纯白的时候,就是整个模型都看得到,渐渐变得纯黑了之后,模型就看不到了,中间的黑白交错的噪声效果,看起来会觉得角色是在溶解。
结合起来就是这种效果:
至于为什么会发光,其实只是在噪声的颜色上面乘了一个HDR颜色,然后加一点Bloom后处理就可以了。
2、 往上飘散
由于我这里只是想控制光点往上飘,所以只控制了顶点的Y坐标移动。设置一个高度值,当顶点的坐标大于这个值时,顶点就会往上增加Y坐标。
下面是一个夸张的举例说明,实际上由于heightMoveVal参数控制了偏移量,所以只需要往上飘一点点就够了,因为很快模型就已经变成光点,并且Alpha变成0 了。
在ASE里面的连线是这样:
代码:
bash
// Made with Amplify Shader Editor
// Available at the Unity Asset Store - http://u3d.as/y3X
Shader "SmokeDisapear"
{
Properties
{
_MainTex("MainTex", 2D) = "white" {}
_MainCol("MainCol", Color) = (1,1,1,0)
_NoiseTex("NoiseTex", 2D) = "white" {}
_min("min", Range( -1 , 1)) = 0
_max("max", Range( -1 , 1.5)) = 1
_height("height", Float) = 0
_tiling("tiling", Vector) = (1,1,0,0)
[HDR]_NoiseAddCol("NoiseAddCol", Color) = (1,1,1,0)
_mixVal("mixVal", Range( 0 , 1)) = 0
_heightMoveVal("heightMoveVal", Float) = 1
[HideInInspector] _texcoord( "", 2D ) = "white" {}
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent" }
LOD 100
CGINCLUDE
#pragma target 3.0
ENDCG
Blend SrcAlpha OneMinusSrcAlpha
AlphaToMask Off
Cull Back
ColorMask RGBA
ZWrite On
ZTest LEqual
Offset 0 , 0
Pass
{
Name "Unlit"
Tags { "LightMode"="ForwardBase" }
CGPROGRAM
#define ASE_ABSOLUTE_VERTEX_POS 1
#ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX
//only defining to not throw compilation error over Unity 5.5
#define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input)
#endif
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float4 color : COLOR;
float4 ase_texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
#ifdef ASE_NEEDS_FRAG_WORLD_POSITION
float3 worldPos : TEXCOORD0;
#endif
float4 ase_texcoord1 : TEXCOORD1;
float4 ase_texcoord2 : TEXCOORD2;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
uniform float _height;
uniform float _heightMoveVal;
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform float4 _MainCol;
uniform float _mixVal;
uniform sampler2D _NoiseTex;
uniform float2 _tiling;
uniform float _min;
uniform float _max;
uniform float4 _NoiseAddCol;
inline float4 ASE_ComputeGrabScreenPos( float4 pos )
{
#if UNITY_UV_STARTS_AT_TOP
float scale = -1.0;
#else
float scale = 1.0;
#endif
float4 o = pos;
o.y = pos.w * 0.5f;
o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y;
return o;
}
v2f vert ( appdata v )
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
UNITY_TRANSFER_INSTANCE_ID(v, o);
float3 ase_worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
float3 objToWorld23 = mul( unity_ObjectToWorld, float4( float3( 0,0,0 ), 1 ) ).xyz;
float3 appendResult27 = (float3(ase_worldPos.x , ( ase_worldPos.y + ( max( ( ( ase_worldPos.y - objToWorld23.y ) - _height ) , 0.0 ) * _heightMoveVal ) ) , ase_worldPos.z));
float3 worldToObj30 = mul( unity_WorldToObject, float4( appendResult27, 1 ) ).xyz;
float3 VertexOffset56 = worldToObj30;
float4 ase_clipPos = UnityObjectToClipPos(v.vertex);
float4 screenPos = ComputeScreenPos(ase_clipPos);
o.ase_texcoord2 = screenPos;
o.ase_texcoord1.xy = v.ase_texcoord.xy;
//setting value to unused interpolator channels and avoid initialization warnings
o.ase_texcoord1.zw = 0;
float3 vertexValue = float3(0, 0, 0);
#if ASE_ABSOLUTE_VERTEX_POS
vertexValue = v.vertex.xyz;
#endif
vertexValue = VertexOffset56;
#if ASE_ABSOLUTE_VERTEX_POS
v.vertex.xyz = vertexValue;
#else
v.vertex.xyz += vertexValue;
#endif
o.vertex = UnityObjectToClipPos(v.vertex);
#ifdef ASE_NEEDS_FRAG_WORLD_POSITION
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
#endif
return o;
}
fixed4 frag (v2f i ) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(i);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
fixed4 finalColor;
#ifdef ASE_NEEDS_FRAG_WORLD_POSITION
float3 WorldPosition = i.worldPos;
#endif
float2 uv_MainTex = i.ase_texcoord1.xy * _MainTex_ST.xy + _MainTex_ST.zw;
float4 BaseCol2 = ( tex2D( _MainTex, uv_MainTex ) * _MainCol );
float4 screenPos = i.ase_texcoord2;
float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos );
float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w;
float4 tex2DNode9 = tex2D( _NoiseTex, ( ase_grabScreenPosNorm * float4( _tiling, 0.0 , 0.0 ) ).xy );
float smoothstepResult17 = smoothstep( _min , _max , tex2DNode9.r);
float4 appendResult14 = (float4(tex2DNode9.rgb , smoothstepResult17));
float4 break34 = appendResult14;
float3 appendResult35 = (float3(break34.x , break34.y , break34.z));
float4 NoiseCol37 = ( float4( appendResult35 , 0.0 ) * _NoiseAddCol );
float4 mixRGB60 = ( ( BaseCol2 * ( 1.0 - _mixVal ) ) + ( NoiseCol37 * _mixVal ) );
float NoiseAlpha38 = break34.w;
float4 appendResult47 = (float4(mixRGB60.rgb , NoiseAlpha38));
finalColor = appendResult47;
return finalColor;
}
ENDCG
}
}
CustomEditor "ASEMaterialInspector"
}
/*ASEBEGIN
Version=18500
1913;32;1920;987;3680.344;1392.808;2.392733;True;True
Node;AmplifyShaderEditor.CommentaryNode;59;-2530.342,-1221.827;Inherit;False;1840.743;752.6192;Comment;15;10;31;32;8;18;19;9;17;40;38;37;14;34;35;39;Noise;1,1,1,1;0;0
Node;AmplifyShaderEditor.Vector2Node;31;-2223.449,-649.3306;Inherit;False;Property;_tiling;tiling;6;0;Create;True;0;0;False;0;False;1,1;4,4;0;3;FLOAT2;0;FLOAT;1;FLOAT;2
Node;AmplifyShaderEditor.GrabScreenPosition;10;-2480.341,-828.205;Inherit;False;0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;32;-2162.449,-754.3303;Inherit;False;2;2;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0,0;False;1;FLOAT4;0
Node;AmplifyShaderEditor.TexturePropertyNode;8;-2321.81,-1093.691;Inherit;True;Property;_NoiseTex;NoiseTex;2;0;Create;True;0;0;False;0;False;None;31cddcf296ab7b147bcab794e0b7b8ed;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1
Node;AmplifyShaderEditor.SamplerNode;9;-1968.668,-898.8738;Inherit;True;Property;_TextureSample0;Texture Sample 0;3;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.RangedFloatNode;18;-1928.39,-672.2086;Inherit;False;Property;_min;min;3;0;Create;True;0;0;False;0;False;0;0;-1;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;19;-1929.39,-585.2089;Inherit;False;Property;_max;max;4;0;Create;True;0;0;False;0;False;1;0;-1;1.5;0;1;FLOAT;0
Node;AmplifyShaderEditor.SmoothstepOpNode;17;-1616.391,-667.2086;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;1;False;1;FLOAT;0
Node;AmplifyShaderEditor.CommentaryNode;57;-2313.414,292.6314;Inherit;False;1257.095;546.9834;Comment;12;56;30;27;49;24;28;50;55;25;22;23;21;VertexOffset;1,1,1,1;0;0
Node;AmplifyShaderEditor.DynamicAppendNode;14;-1608.537,-890.0309;Inherit;False;FLOAT4;4;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0
Node;AmplifyShaderEditor.WorldPosInputsNode;21;-2250.344,391.5267;Inherit;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.TransformPositionNode;23;-2263.414,598.2891;Inherit;False;Object;World;False;Fast;True;1;0;FLOAT3;0,0,0;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.BreakToComponentsNode;34;-1432.258,-946.3212;Inherit;False;FLOAT4;1;0;FLOAT4;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15
Node;AmplifyShaderEditor.CommentaryNode;5;-2590.961,-341.9665;Inherit;False;846;484.7515;Comment;4;1;3;4;2;BaseCol;1,1,1,1;0;0
Node;AmplifyShaderEditor.DynamicAppendNode;35;-1257.349,-1125.164;Inherit;False;FLOAT3;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.RangedFloatNode;24;-1995.551,688.6921;Inherit;False;Property;_height;height;5;0;Create;True;0;0;False;0;False;0;1.8;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.ColorNode;3;-2540.961,-69.21489;Inherit;False;Property;_MainCol;MainCol;1;0;Create;True;0;0;False;0;False;1,1,1,0;1,1,1,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SamplerNode;1;-2518.612,-291.9667;Inherit;True;Property;_MainTex;MainTex;0;0;Create;True;0;0;False;0;False;-1;None;8293059b819fbd34983493640ff4b930;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SimpleSubtractOpNode;22;-2012.413,550.2891;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.ColorNode;39;-1175.305,-993.0585;Inherit;False;Property;_NoiseAddCol;NoiseAddCol;7;1;[HDR];Create;True;0;0;False;0;False;1,1,1,0;16,16,16,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.CommentaryNode;61;-1676.467,-294.687;Inherit;False;999.3699;447.8433;Comment;8;42;6;43;12;44;45;46;60;mixRGB;1,1,1,1;0;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;40;-1018.162,-1171.828;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleSubtractOpNode;25;-1820.551,570.6921;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;4;-2185.96,-213.215;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMaxOpNode;55;-1681.888,577.0236;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;37;-921.4471,-1000.216;Inherit;False;NoiseCol;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;2;-1968.958,-240.215;Inherit;False;BaseCol;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.RangedFloatNode;49;-1848.277,740.5146;Inherit;False;Property;_heightMoveVal;heightMoveVal;9;0;Create;True;0;0;False;0;False;1;0;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;42;-1626.467,-76.0649;Inherit;False;Property;_mixVal;mixVal;8;0;Create;True;0;0;False;0;False;0;1;0;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.GetLocalVarNode;6;-1499.159,-244.687;Inherit;False;2;BaseCol;1;0;OBJECT;;False;1;COLOR;0
Node;AmplifyShaderEditor.OneMinusNode;43;-1331.467,-140.065;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.GetLocalVarNode;12;-1559.026,37.15596;Inherit;False;37;NoiseCol;1;0;OBJECT;;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;50;-1550.277,637.5146;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;44;-1223.467,-234.0649;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;45;-1314.467,-11.06507;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleAddOpNode;28;-1605.688,467.4084;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleAddOpNode;46;-1064.467,-87.06497;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.DynamicAppendNode;27;-1843.73,389.4314;Inherit;False;FLOAT3;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.TransformPositionNode;30;-1476.529,376.2321;Inherit;False;World;Object;False;Fast;True;1;0;FLOAT3;0,0,0;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.RegisterLocalVarNode;38;-1031.205,-754.5867;Inherit;False;NoiseAlpha;-1;True;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;60;-901.0974,-65.65731;Inherit;False;mixRGB;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.GetLocalVarNode;62;-576.2823,-236.8541;Inherit;False;60;mixRGB;1;0;OBJECT;;False;1;COLOR;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;56;-1292.018,589.9708;Inherit;False;VertexOffset;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.GetLocalVarNode;48;-592.2823,-156.8542;Inherit;False;38;NoiseAlpha;1;0;OBJECT;;False;1;FLOAT;0
Node;AmplifyShaderEditor.GetLocalVarNode;58;-384.282,-44.85415;Inherit;False;56;VertexOffset;1;0;OBJECT;;False;1;FLOAT3;0
Node;AmplifyShaderEditor.DynamicAppendNode;47;-384.282,-236.8541;Inherit;False;FLOAT4;4;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;1;False;1;FLOAT4;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;0;-208.2823,-140.8542;Float;False;True;-1;2;ASEMaterialInspector;100;1;SmokeDisapear;0770190933193b94aaa3065e307002fa;True;Unlit;0;0;Unlit;2;True;2;5;False;-1;10;False;-1;0;1;False;-1;0;False;-1;True;0;False;-1;0;False;-1;False;False;False;False;False;False;True;0;False;-1;True;0;False;-1;True;True;True;True;True;0;False;-1;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;2;RenderType=Transparent=RenderType;Queue=Transparent=Queue=0;True;2;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=ForwardBase;False;0;;0;0;Standard;1;Vertex Position,InvertActionOnDeselection;0;0;1;True;False;;False;0
WireConnection;32;0;10;0
WireConnection;32;1;31;0
WireConnection;9;0;8;0
WireConnection;9;1;32;0
WireConnection;17;0;9;1
WireConnection;17;1;18;0
WireConnection;17;2;19;0
WireConnection;14;0;9;0
WireConnection;14;3;17;0
WireConnection;34;0;14;0
WireConnection;35;0;34;0
WireConnection;35;1;34;1
WireConnection;35;2;34;2
WireConnection;22;0;21;2
WireConnection;22;1;23;2
WireConnection;40;0;35;0
WireConnection;40;1;39;0
WireConnection;25;0;22;0
WireConnection;25;1;24;0
WireConnection;4;0;1;0
WireConnection;4;1;3;0
WireConnection;55;0;25;0
WireConnection;37;0;40;0
WireConnection;2;0;4;0
WireConnection;43;0;42;0
WireConnection;50;0;55;0
WireConnection;50;1;49;0
WireConnection;44;0;6;0
WireConnection;44;1;43;0
WireConnection;45;0;12;0
WireConnection;45;1;42;0
WireConnection;28;0;21;2
WireConnection;28;1;50;0
WireConnection;46;0;44;0
WireConnection;46;1;45;0
WireConnection;27;0;21;1
WireConnection;27;1;28;0
WireConnection;27;2;21;3
WireConnection;30;0;27;0
WireConnection;38;0;34;3
WireConnection;60;0;46;0
WireConnection;56;0;30;0
WireConnection;47;0;62;0
WireConnection;47;3;48;0
WireConnection;0;0;47;0
WireConnection;0;1;58;0
ASEEND*/
//CHKSM=D280B36700255D651F08848CF5C3AAE371240F19