游戏中物体腐化消失,燃烧消失时,会有从部分慢慢消失的作用,然后配合常州手游开发一些粒子特效,就能达到非常好的美术作用。
类似作用如下:
注:
_DissColor为溶解主色,_AddColor为叠加色,按照溶解的移动方向来看开始色为DissColor+AddColor
上图中DissColor为红色,AddColor为绿色
所以燃烧时
开始色为DissColor + AddColor = 黄色
默许色为DissColor 红色
然后配上火的粒子特效,这样就能模拟比较实在的燃烧作用。
我们也能够设置其他的色彩,比如被各种魔法,化学物品击中.....算了,不敢幻想了,好残暴
代码和原理如下:
表面着色器:
仿制常州游戏开发培训代码
Shader "Dissolve/Dissolve_TexturCoords" {
Properties {
_Color ("主色彩", Color) = (1,1,1,1) // 主色
_MainTex ("模型贴图", 2D) = "white" {} // 主原料
_DissolveText ("溶解贴图", 2D) = "white" {} // 溶解贴图
_Tile("溶解贴图的平铺巨细", Range (0, 1)) = 1 // 平铺值,设置溶解贴图巨细
_Amount ("溶解值", Range (0, 1)) = 0.5 // 溶解度
_DissSize("溶解巨细", Range (0, 1)) = 0.1 // 溶解范围巨细
_DissColor ("溶解主色", Color) = (1,1,1,1) // 溶解色彩
_AddColor ("叠加色,与主色叠加为开始色[R|G|B>0表明启用]", Color) = (1,1,1,1) // 改色与溶解色交融构成开始色
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
Cull off
CGPROGRAM
#pragma target 3.0
#pragma surface surf BlinnPhong
sampler2D _MainTex;
sampler2D _DissolveText;
fixed4 _Color; // 主色
half _Tile; // 平铺值
half _Amount; // 溶解度
half _DissSize; // 溶解范围
half4 _DissColor; // 溶解色彩
half4 _AddColor; // 叠加色
// 终究色
static half3 finalColor = float3(1,1,1);
struct Input {
float2 uv_MainTex; // 只需要主原料的UV信息
};
void surf (Input IN, inout SurfaceOutput o) {
// 对主原料进行采样
fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
// 设置主原料和色彩
o.Albedo = tex.rgb * _Color.rgb;
// 对裁剪原料进行采样,取R色值
float ClipTex = tex2D (_DissolveText, IN.uv_MainTex/_Tile).r;
// 裁剪量 = 裁剪原料R - 外部设置量
float ClipAmount = ClipTex - _Amount;
if(_Amount > 0)
{
// 假如裁剪原料的R色值 < 设置的裁剪值 那么此点将被裁剪
if(ClipAmount < 0)
{
clip(-0.1);
}
// 然后处理没有被裁剪的值
else
{
// 针对没有被裁剪的点,【裁剪量】小于【裁剪巨细】的做处理
// 假如设置了手机App外包叠加色,那么该色为ClipAmount/_DissSize(这样会构成突变作用)
if(ClipAmount < _DissSize)
{
if(_AddColor.x == 0)
finalColor.x = _DissColor.x;
else
finalColor.x = ClipAmount/_DissSize;
if (_AddColor.y == 0)
finalColor.y = _DissColor.y;
else
finalColor.y = ClipAmount/_DissSize;
if (_AddColor.z == 0)
finalColor.z = _DissColor.z;
else
finalColor.z = ClipAmount/_DissSize;
// 交融
o.Albedo = o.Albedo * finalColor * 2;
}
}
}
o.Alpha = tex.a * _Color.a;
}
ENDCG
}//endsubshader
}
仿制代码
CG:
仿制代码
//溶解
Shader "Dissolve" {
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_DissolorTex ("DissolorTex (RGB)", 2D) = "white" {}
_RAmount ("RAmount", Range (0, 1)) = 0.5
_DissolorWith("DissolorWith", float) = 0.1//溶解过度宽度
_DissColor ("DissColor", Color) = (1,1,1,1)//溶解App开发培训色彩
_Illuminate ("Illuminate", Range (0, 4)) = 1
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
Pass
{
CGPROGRAM
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
float2 texcoord1 : TEXCOORD1;
};
struct v2f
{
float4 pos : POSITION;
half2 texcoord : TEXCOORD0;
half2 texcoord1 : TEXCOORD1;
};
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _DissolorTex;
float4 _DissolorTex_ST;
half _RAmount;
half _DissolorWith;
half4 _DissColor;
half _Illuminate;
v2f vert(appdata v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
o.texcoord1 = TRANSFORM_TEX(v.texcoord1, _DissolorTex);
return o;
}
half4 frag(v2f i) :COLOR
{
half4 mainCol = tex2D(_MainTex,i.texcoord);
half4 DissolorTexCol = tex2D(_DissolorTex,i.texcoord1);
half clipVauleR = DissolorTexCol.r - _RAmount;
if(clipVauleR <= 0)
{
if(clipVauleR > -_DissolorWith)
{
if(_RAmount != 1)
{
//插值色彩过度
float t = clipVauleR / -_DissolorWith;
mainCol = lerp(mainCol, _DissColor, t);
}
else
{
discard;
}
}
else
{
discard;
}
}
return mainCol * _Illuminate;
}
#pragma vertex vert
#pragma fragment frag
ENDCG
}
}
}