游戏中物体腐化消失,燃烧消失时,会有从部分慢慢消失的作用,然后配合常州手游开发一些粒子特效,就能达到非常好的美术作用。
		
			类似作用如下:
		
			注:
		
			_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
		
			        }
		
			    } 
		
			}
		



