Unity制作角色溶解变成光点消失

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
相关推荐
xlsw_22 分钟前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹1 小时前
基于java的改良版超级玛丽小游戏
java
异次元的归来1 小时前
Unity DOTS中的share component
unity·游戏引擎
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭2 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫2 小时前
泛型(2)
java
超爱吃士力架2 小时前
邀请逻辑
java·linux·后端
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石2 小时前
12/21java基础
java
李小白662 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp3 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea