Unity制作随风摇摆的植物

这篇具有很好参考价值的文章主要介绍了Unity制作随风摇摆的植物。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天记录一下如何实现随风摇摆的植物,之前项目里面的植物摇摆实现是使用骨骼动画实现的,这种方式太消耗性能,植物这种东西没必要,直接使用顶点动画即可。

准备

植物不需要使用标准的PBR流程,基础的颜色贴图加上法向贴图即可,它不区分金属非金属,精致一些可以加一个粗糙度贴图和AO。
我使用的植物模型还区分了树干和树也,通过顶点色的alpha通道去区分,这样可以在一个材质里面使用两套贴图。

首先看一下资源:
贴图有一张flowmap用于处理顶点动画,一张基础色贴图,一张法向贴图
unity树随风摆动,unity,unity,游戏引擎
顶点色 R通道用于区分可以摆动的幅度的强弱,越靠近地面,摆动越弱,这个用于控制整个树木的大范围的摇动效果
unity树随风摆动,unity,unity,游戏引擎
G通道用于处理树叶的摆动幅度的强弱,越靠近树干,摆动越弱,这个用于控制树叶的摆动
unity树随风摆动,unity,unity,游戏引擎
这两个通道一起混合使用,用来实现顶点动画。
B通道没有内容
A通道用于区分树干和树叶 白色的是树干,黑色的是树叶
unity树随风摆动,unity,unity,游戏引擎

渲染实现

渲染使用ASE连连看连出来先
树叶是面片,需要双面渲染的,所以我们需要将剔除模式Cull 设置为OFF
unity树随风摆动,unity,unity,游戏引擎

树叶的形状我们使用树叶的alpha通道进行裁剪,所以需要使用透明检测
unity树随风摆动,unity,unity,游戏引擎
基础颜色,通过A通道进行lerp插值,将树叶和树干插值出来,还需要透明度进行透明裁剪
unity树随风摆动,unity,unity,游戏引擎
法向这里也是使用了相同的方式,lerp插值,但是注意,由于树叶使用了双面渲染,背面法向是错误的,我们需要将法向的Z轴进行翻转(Z轴在切线空间里面是和法向朝向平行的)
unity树随风摆动,unity,unity,游戏引擎

实现摆动

我们先通过最基础的跟随时间进行摆动,可以自定义方向
unity树随风摆动,unity,unity,游戏引擎
Sin函数使用后的曲线图是以下这样的
unity树随风摆动,unity,unity,游戏引擎
如果先乘以PI以后再Sin,效果就在1的数值内半个循环,更好的控制
unity树随风摆动,unity,unity,游戏引擎
接下来我们将树叶摆动也添加进来,这里是受到顶点色的G通道控制
unity树随风摆动,unity,unity,游戏引擎
这里我们使用的cos去运算,它刚好和sin隔开
unity树随风摆动,unity,unity,游戏引擎
实现这一部以后,我们实现了一个不错的摆动的效果,但是缺少了一些的随机性,最简单的方法就是添加一张扰动图,使用扰动图去扰动树叶,让树叶有更多的随机性,看起来更自然
下图为使用了扰动图实现的节点,也使用到了顶点动画的G通道控制树叶。
unity树随风摆动,unity,unity,游戏引擎
上面的方法还需要额外去采样一张图片,接下来我们使用一种程序化的方法,直接使用一个节点去实现扰动
unity树随风摆动,unity,unity,游戏引擎
这个节点是通过UE里面的方式翻译过来的,这里要着重感谢一些Kerry大佬。节点是在Shader Function里面,自行查阅
unity树随风摆动,unity,unity,游戏引擎
我们就可以通过调整参数去控制整个树干带着树枝和树叶偏移,还能模拟树叶的摆动,效果挺不错
unity树随风摆动,unity,unity,游戏引擎
最后附上ASE代码:文章来源地址https://www.toymoban.com/news/detail-844501.html

// Made with Amplify Shader Editor
// Available at the Unity Asset Store - http://u3d.as/y3X 
Shader "Scene_Tree"
{
	Properties
	{
		_Cutoff( "Mask Clip Value", Float ) = 0.5
		_BaseMap_Beaf("BaseMap_Beaf", 2D) = "white" {}
		_NormalMap_Beaf("NormalMap_Beaf", 2D) = "bump" {}
		_BaseMap_Branch("BaseMap_Branch", 2D) = "white" {}
		_NormalMap_Branch("NormalMap_Branch", 2D) = "bump" {}
		_Roughness("Roughness", Range( 0 , 1)) = 0.5
		_GlobalWindSpeed("GlobalWindSpeed", Float) = 1
		_GlobalWindIntensity("GlobalWindIntensity", Float) = 1
		_GlobalWindDirection("GlobalWindDirection", Vector) = (0,0,0,0)
		_SmallWindSpeed("SmallWindSpeed", Float) = 1
		_SmallWindIntensity("SmallWindIntensity", Float) = 1
		_SmallWindDirection("SmallWindDirection", Vector) = (0,0,1,0)
		[HideInInspector] _texcoord( "", 2D ) = "white" {}
		[HideInInspector] __dirty( "", Int ) = 1
	}

	SubShader
	{
		Tags{ "RenderType" = "Opaque"  "Queue" = "AlphaTest+0" "DisableBatching" = "True" }
		Cull Off
		CGINCLUDE
		#include "UnityPBSLighting.cginc"
		#include "UnityShaderVariables.cginc"
		#include "Lighting.cginc"
		#pragma target 3.0
		#pragma multi_compile_instancing
		#ifdef UNITY_PASS_SHADOWCASTER
			#undef INTERNAL_DATA
			#undef WorldReflectionVector
			#undef WorldNormalVector
			#define INTERNAL_DATA half3 internalSurfaceTtoW0; half3 internalSurfaceTtoW1; half3 internalSurfaceTtoW2;
			#define WorldReflectionVector(data,normal) reflect (data.worldRefl, half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal)))
			#define WorldNormalVector(data,normal) half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal))
		#endif
		struct Input
		{
			float3 worldPos;
			float2 uv_texcoord;
			float4 vertexColor : COLOR;
			float3 worldNormal;
			INTERNAL_DATA
			half ASEVFace : VFACE;
		};

		struct SurfaceOutputCustomLightingCustom
		{
			half3 Albedo;
			half3 Normal;
			half3 Emission;
			half Metallic;
			half Smoothness;
			half Occlusion;
			half Alpha;
			Input SurfInput;
			UnityGIInput GIData;
		};

		uniform float _GlobalWindSpeed;
		uniform float _GlobalWindIntensity;
		uniform float3 _GlobalWindDirection;
		uniform float3 _SmallWindDirection;
		uniform float _SmallWindSpeed;
		uniform float _SmallWindIntensity;
		uniform sampler2D _BaseMap_Beaf;
		SamplerState sampler_BaseMap_Beaf;
		uniform float4 _BaseMap_Beaf_ST;
		uniform sampler2D _BaseMap_Branch;
		uniform float4 _BaseMap_Branch_ST;
		uniform sampler2D _NormalMap_Beaf;
		uniform float4 _NormalMap_Beaf_ST;
		SamplerState sampler_NormalMap_Beaf;
		uniform sampler2D _NormalMap_Branch;
		uniform float4 _NormalMap_Branch_ST;
		uniform float _Roughness;
		uniform float _Cutoff = 0.5;


		float3 RotateAroundAxis( float3 center, float3 original, float3 u, float angle )
		{
			original -= center;
			float C = cos( angle );
			float S = sin( angle );
			float t = 1 - C;
			float m00 = t * u.x * u.x + C;
			float m01 = t * u.x * u.y - S * u.z;
			float m02 = t * u.x * u.z + S * u.y;
			float m10 = t * u.x * u.y + S * u.z;
			float m11 = t * u.y * u.y + C;
			float m12 = t * u.y * u.z - S * u.x;
			float m20 = t * u.x * u.z - S * u.y;
			float m21 = t * u.y * u.z + S * u.x;
			float m22 = t * u.z * u.z + C;
			float3x3 finalMatrix = float3x3( m00, m01, m02, m10, m11, m12, m20, m21, m22 );
			return mul( finalMatrix, original ) + center;
		}


		void vertexDataFunc( inout appdata_full v, out Input o )
		{
			UNITY_INITIALIZE_OUTPUT( Input, o );
			float temp_output_34_0 = ( ( _GlobalWindSpeed * _Time.y ) * UNITY_PI );
			float temp_output_42_0 = ( _GlobalWindIntensity * 0.1 );
			float3 temp_output_7_0_g2 = _SmallWindDirection;
			float3 RotateAxis34_g2 = cross( temp_output_7_0_g2 , float3(0,1,0) );
			float3 wind_direction31_g2 = temp_output_7_0_g2;
			float3 wind_speed40_g2 = ( ( _Time.y * _SmallWindSpeed ) * float3(0.5,-0.5,-0.5) );
			float3 ase_worldPos = mul( unity_ObjectToWorld, v.vertex );
			float3 temp_cast_0 = (1.0).xxx;
			float3 temp_output_22_0_g2 = abs( ( ( frac( ( ( ( wind_direction31_g2 * wind_speed40_g2 ) + ( ase_worldPos / 10.0 ) ) + 0.5 ) ) * 2.0 ) - temp_cast_0 ) );
			float3 temp_cast_1 = (3.0).xxx;
			float dotResult30_g2 = dot( ( ( temp_output_22_0_g2 * temp_output_22_0_g2 ) * ( temp_cast_1 - ( temp_output_22_0_g2 * 2.0 ) ) ) , wind_direction31_g2 );
			float BigTriangleWave42_g2 = dotResult30_g2;
			float3 temp_cast_2 = (1.0).xxx;
			float3 temp_output_59_0_g2 = abs( ( ( frac( ( ( wind_speed40_g2 + ( ase_worldPos / 2.0 ) ) + 0.5 ) ) * 2.0 ) - temp_cast_2 ) );
			float3 temp_cast_3 = (3.0).xxx;
			float SmallTriangleWave52_g2 = distance( ( ( temp_output_59_0_g2 * temp_output_59_0_g2 ) * ( temp_cast_3 - ( temp_output_59_0_g2 * 2.0 ) ) ) , float3(0,0,0) );
			float3 rotatedValue72_g2 = RotateAroundAxis( ( ase_worldPos - float3(0,0.1,0) ), ase_worldPos, normalize( RotateAxis34_g2 ), ( ( BigTriangleWave42_g2 + SmallTriangleWave52_g2 ) * ( 2.0 * UNITY_PI ) ) );
			float3 worldToObj81_g2 = mul( unity_WorldToObject, float4( rotatedValue72_g2, 1 ) ).xyz;
			float3 ase_vertex3Pos = v.vertex.xyz;
			float3 VertexOffset39 = ( ( ( ( sin( temp_output_34_0 ) * temp_output_42_0 ) * _GlobalWindDirection ) * v.color.r ) + ( v.color.g * ( _GlobalWindDirection * ( cos( temp_output_34_0 ) * temp_output_42_0 ) ) ) + ( v.color.g * ( worldToObj81_g2 - ase_vertex3Pos ) * _SmallWindIntensity ) );
			v.vertex.xyz += VertexOffset39;
			v.vertex.w = 1;
		}

		inline half4 LightingStandardCustomLighting( inout SurfaceOutputCustomLightingCustom s, half3 viewDir, UnityGI gi )
		{
			UnityGIInput data = s.GIData;
			Input i = s.SurfInput;
			half4 c = 0;
			float2 uv_BaseMap_Beaf = i.uv_texcoord * _BaseMap_Beaf_ST.xy + _BaseMap_Beaf_ST.zw;
			float4 tex2DNode3 = tex2D( _BaseMap_Beaf, uv_BaseMap_Beaf );
			float lerpResult24 = lerp( tex2DNode3.a , 1.0 , i.vertexColor.a);
			float Alpha22 = lerpResult24;
			SurfaceOutputStandard s2 = (SurfaceOutputStandard ) 0;
			float2 uv_BaseMap_Branch = i.uv_texcoord * _BaseMap_Branch_ST.xy + _BaseMap_Branch_ST.zw;
			float4 lerpResult6 = lerp( tex2DNode3 , tex2D( _BaseMap_Branch, uv_BaseMap_Branch ) , i.vertexColor.a);
			float4 BaseColor8 = lerpResult6;
			s2.Albedo = BaseColor8.rgb;
			float2 uv_NormalMap_Beaf = i.uv_texcoord * _NormalMap_Beaf_ST.xy + _NormalMap_Beaf_ST.zw;
			float3 tex2DNode10 = UnpackNormal( tex2D( _NormalMap_Beaf, uv_NormalMap_Beaf ) );
			float3 appendResult26 = (float3(tex2DNode10.r , tex2DNode10.g , -tex2DNode10.b));
			float3 switchResult25 = (((i.ASEVFace>0)?(tex2DNode10):(appendResult26)));
			float2 uv_NormalMap_Branch = i.uv_texcoord * _NormalMap_Branch_ST.xy + _NormalMap_Branch_ST.zw;
			float3 lerpResult12 = lerp( switchResult25 , UnpackNormal( tex2D( _NormalMap_Branch, uv_NormalMap_Branch ) ) , i.vertexColor.a);
			float3 Normal14 = lerpResult12;
			s2.Normal = WorldNormalVector( i , Normal14 );
			s2.Emission = float3( 0,0,0 );
			s2.Metallic = 0.0;
			s2.Smoothness = ( 1.0 - _Roughness );
			s2.Occlusion = 1.0;

			data.light = gi.light;

			UnityGI gi2 = gi;
			#ifdef UNITY_PASS_FORWARDBASE
			Unity_GlossyEnvironmentData g2 = UnityGlossyEnvironmentSetup( s2.Smoothness, data.worldViewDir, s2.Normal, float3(0,0,0));
			gi2 = UnityGlobalIllumination( data, s2.Occlusion, s2.Normal, g2 );
			#endif

			float3 surfResult2 = LightingStandard ( s2, viewDir, gi2 ).rgb;
			surfResult2 += s2.Emission;

			#ifdef UNITY_PASS_FORWARDADD//2
			surfResult2 -= s2.Emission;
			#endif//2
			c.rgb = surfResult2;
			c.a = 1;
			clip( Alpha22 - _Cutoff );
			return c;
		}

		inline void LightingStandardCustomLighting_GI( inout SurfaceOutputCustomLightingCustom s, UnityGIInput data, inout UnityGI gi )
		{
			s.GIData = data;
		}

		void surf( Input i , inout SurfaceOutputCustomLightingCustom o )
		{
			o.SurfInput = i;
			o.Normal = float3(0,0,1);
		}

		ENDCG
		CGPROGRAM
		#pragma surface surf StandardCustomLighting keepalpha fullforwardshadows vertex:vertexDataFunc 

		ENDCG
		Pass
		{
			Name "ShadowCaster"
			Tags{ "LightMode" = "ShadowCaster" }
			ZWrite On
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma target 3.0
			#pragma multi_compile_shadowcaster
			#pragma multi_compile UNITY_PASS_SHADOWCASTER
			#pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2
			#include "HLSLSupport.cginc"
			#if ( SHADER_API_D3D11 || SHADER_API_GLCORE || SHADER_API_GLES || SHADER_API_GLES3 || SHADER_API_METAL || SHADER_API_VULKAN )
				#define CAN_SKIP_VPOS
			#endif
			#include "UnityCG.cginc"
			#include "Lighting.cginc"
			#include "UnityPBSLighting.cginc"
			struct v2f
			{
				V2F_SHADOW_CASTER;
				float2 customPack1 : TEXCOORD1;
				float4 tSpace0 : TEXCOORD2;
				float4 tSpace1 : TEXCOORD3;
				float4 tSpace2 : TEXCOORD4;
				half4 color : COLOR0;
				UNITY_VERTEX_INPUT_INSTANCE_ID
				UNITY_VERTEX_OUTPUT_STEREO
			};
			v2f vert( appdata_full v )
			{
				v2f o;
				UNITY_SETUP_INSTANCE_ID( v );
				UNITY_INITIALIZE_OUTPUT( v2f, o );
				UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o );
				UNITY_TRANSFER_INSTANCE_ID( v, o );
				Input customInputData;
				vertexDataFunc( v, customInputData );
				float3 worldPos = mul( unity_ObjectToWorld, v.vertex ).xyz;
				half3 worldNormal = UnityObjectToWorldNormal( v.normal );
				half3 worldTangent = UnityObjectToWorldDir( v.tangent.xyz );
				half tangentSign = v.tangent.w * unity_WorldTransformParams.w;
				half3 worldBinormal = cross( worldNormal, worldTangent ) * tangentSign;
				o.tSpace0 = float4( worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x );
				o.tSpace1 = float4( worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y );
				o.tSpace2 = float4( worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z );
				o.customPack1.xy = customInputData.uv_texcoord;
				o.customPack1.xy = v.texcoord;
				TRANSFER_SHADOW_CASTER_NORMALOFFSET( o )
				o.color = v.color;
				return o;
			}
			half4 frag( v2f IN
			#if !defined( CAN_SKIP_VPOS )
			, UNITY_VPOS_TYPE vpos : VPOS
			#endif
			) : SV_Target
			{
				UNITY_SETUP_INSTANCE_ID( IN );
				Input surfIN;
				UNITY_INITIALIZE_OUTPUT( Input, surfIN );
				surfIN.uv_texcoord = IN.customPack1.xy;
				float3 worldPos = float3( IN.tSpace0.w, IN.tSpace1.w, IN.tSpace2.w );
				half3 worldViewDir = normalize( UnityWorldSpaceViewDir( worldPos ) );
				surfIN.worldPos = worldPos;
				surfIN.worldNormal = float3( IN.tSpace0.z, IN.tSpace1.z, IN.tSpace2.z );
				surfIN.internalSurfaceTtoW0 = IN.tSpace0.xyz;
				surfIN.internalSurfaceTtoW1 = IN.tSpace1.xyz;
				surfIN.internalSurfaceTtoW2 = IN.tSpace2.xyz;
				surfIN.vertexColor = IN.color;
				SurfaceOutputCustomLightingCustom o;
				UNITY_INITIALIZE_OUTPUT( SurfaceOutputCustomLightingCustom, o )
				surf( surfIN, o );
				UnityGI gi;
				UNITY_INITIALIZE_OUTPUT( UnityGI, gi );
				o.Alpha = LightingStandardCustomLighting( o, worldViewDir, gi ).a;
				#if defined( CAN_SKIP_VPOS )
				float2 vpos = IN.pos;
				#endif
				SHADOW_CASTER_FRAGMENT( IN )
			}
			ENDCG
		}
	}
	Fallback "Diffuse"
	CustomEditor "ASEMaterialInspector"
}
/*ASEBEGIN
Version=18703
2120;79.2;1910;949;4682.4;-429.11;3.238338;True;False
Node;AmplifyShaderEditor.CommentaryNode;67;-3105.601,1169.338;Inherit;False;2873.335;1730.373;wind;29;30;29;33;31;34;43;41;45;42;32;52;44;37;46;53;48;38;56;35;59;55;49;47;50;39;61;62;63;66;wind;1,1,1,1;0;0
Node;AmplifyShaderEditor.RangedFloatNode;29;-3055.601,1219.338;Inherit;False;Property;_GlobalWindSpeed;GlobalWindSpeed;6;0;Create;True;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleTimeNode;30;-3043.186,1352.248;Inherit;False;1;0;FLOAT;1;False;1;FLOAT;0
Node;AmplifyShaderEditor.PiNode;33;-2783.186,1482.248;Inherit;False;1;0;FLOAT;1;False;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;31;-2745.186,1287.248;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.CommentaryNode;15;-2930.545,336.9109;Inherit;False;1445.533;706.7714;Normal;8;14;12;13;11;25;26;27;10;Normal;1,1,1,1;0;0
Node;AmplifyShaderEditor.RangedFloatNode;41;-2955.43,1670.371;Inherit;False;Property;_GlobalWindIntensity;GlobalWindIntensity;7;0;Create;True;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;43;-2925.43,1805.371;Inherit;False;Constant;_Float1;Float 1;8;0;Create;True;0;0;False;0;False;0.1;0;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;34;-2557.186,1286.846;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.SamplerNode;10;-2878.545,386.9108;Inherit;True;Property;_NormalMap_Beaf;NormalMap_Beaf;2;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;bump;Auto;True;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;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SinOpNode;32;-2232.243,1288.323;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;42;-2637.43,1734.371;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.CosOpNode;45;-2219.916,1709.438;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.NegateNode;27;-2584.474,549.029;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;46;-1915.738,1713.87;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.DynamicAppendNode;26;-2416.474,461.029;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.SimpleMultiplyOpNode;44;-1913.612,1285.143;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.Vector3Node;37;-1748.591,1486.79;Inherit;False;Property;_GlobalWindDirection;GlobalWindDirection;8;0;Create;True;0;0;False;0;False;0,0,0;0,0,0;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.CommentaryNode;9;-2927.645,-558.358;Inherit;False;1016.54;730.0001;BaseColor;7;3;5;6;7;8;22;24;BaseColor;1,1,1,1;0;0
Node;AmplifyShaderEditor.Vector3Node;53;-1793.54,2134.001;Inherit;False;Property;_SmallWindDirection;SmallWindDirection;11;0;Create;True;0;0;False;0;False;0,0,1;0,0,1;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.RangedFloatNode;52;-1794.54,2038.001;Inherit;False;Property;_SmallWindSpeed;SmallWindSpeed;9;0;Create;True;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;56;-1334.54,2214.001;Inherit;False;Property;_SmallWindIntensity;SmallWindIntensity;10;0;Create;True;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SamplerNode;3;-2875.645,-508.358;Inherit;True;Property;_BaseMap_Beaf;BaseMap_Beaf;1;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.VertexColorNode;13;-2814.545,862.9108;Inherit;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SwitchByFaceNode;25;-2268.474,395.029;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.VertexColorNode;7;-2811.645,-32.35796;Inherit;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;35;-1497.784,1283.848;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.SamplerNode;11;-2880.545,614.9108;Inherit;True;Property;_NormalMap_Branch;NormalMap_Branch;4;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;bump;Auto;True;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;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.FunctionNode;59;-1455.411,2047.701;Inherit;False;SimpleGrassWind;-1;;2;205beb641ec413548834c7eb5a342298;0;2;1;FLOAT;1;False;7;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;48;-1499.984,1701.418;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.VertexColorNode;38;-1283.142,1459.165;Inherit;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SamplerNode;5;-2877.645,-280.358;Inherit;True;Property;_BaseMap_Branch;BaseMap_Branch;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.LerpOp;12;-2037.545,548.9108;Inherit;False;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;49;-1067.25,1675.393;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;55;-1048.54,2023.562;Inherit;False;3;3;0;FLOAT;0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.LerpOp;6;-2431.645,-356.358;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;47;-1055.393,1285.441;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.SimpleAddOpNode;50;-708.7696,1479.748;Inherit;False;3;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.RangedFloatNode;19;-1065.259,332.4771;Inherit;False;Property;_Roughness;Roughness;5;0;Create;True;0;0;False;0;False;0.5;0.5;0;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.LerpOp;24;-2397.259,-119.5229;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;1;False;2;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;8;-2135.906,-343.3085;Inherit;False;BaseColor;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;14;-1690.807,543.9604;Inherit;False;Normal;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.OneMinusNode;20;-715.2592,383.4771;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;39;-457.0661,1478.18;Inherit;False;VertexOffset;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.GetLocalVarNode;17;-873.2592,133.4771;Inherit;False;14;Normal;1;0;OBJECT;;False;1;FLOAT3;0
Node;AmplifyShaderEditor.GetLocalVarNode;16;-900.2592,17.47711;Inherit;False;8;BaseColor;1;0;OBJECT;;False;1;COLOR;0
Node;AmplifyShaderEditor.RangedFloatNode;18;-700.2592,205.4771;Inherit;False;Constant;_Float0;Float 0;4;0;Create;True;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;22;-2144.259,-66.52289;Inherit;False;Alpha;-1;True;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.PannerNode;62;-1493.22,2562.444;Inherit;False;3;0;FLOAT2;0,0;False;2;FLOAT2;0.1,0;False;1;FLOAT;1;False;1;FLOAT2;0
Node;AmplifyShaderEditor.SamplerNode;61;-1235.692,2534.748;Inherit;True;Property;_WindNoise;WindNoise;12;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.Vector2Node;66;-1789.412,2737.511;Inherit;False;Constant;_NoiseWindSpeed;NoiseWindSpeed;13;0;Create;True;0;0;False;0;False;1,0;0,0;0;3;FLOAT2;0;FLOAT;1;FLOAT;2
Node;AmplifyShaderEditor.GetLocalVarNode;40;-338.1208,457.1961;Inherit;False;39;VertexOffset;1;0;OBJECT;;False;1;FLOAT3;0
Node;AmplifyShaderEditor.GetLocalVarNode;23;-338.259,344.4771;Inherit;False;22;Alpha;1;0;OBJECT;;False;1;FLOAT;0
Node;AmplifyShaderEditor.CustomStandardSurface;2;-389,88.5;Inherit;False;Metallic;Tangent;6;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,1;False;2;FLOAT3;0,0,0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;1;False;1;FLOAT3;0
Node;AmplifyShaderEditor.TextureCoordinatesNode;63;-1841.955,2562.156;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.StandardSurfaceOutputNode;0;0,0;Float;False;True;-1;2;ASEMaterialInspector;0;0;CustomLighting;Scene_Tree;False;False;False;False;False;False;False;False;False;False;False;False;False;True;False;False;True;False;False;False;False;Off;0;False;-1;0;False;-1;False;0;False;-1;0;False;-1;False;0;Custom;0.5;True;True;0;True;Opaque;;AlphaTest;All;14;all;True;True;True;True;0;False;-1;False;0;False;-1;255;False;-1;255;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;False;2;15;10;25;False;0.5;True;0;0;False;-1;0;False;-1;0;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;0;0,0,0,0;VertexOffset;True;False;Cylindrical;False;Relative;0;;0;-1;-1;-1;0;False;0;0;False;-1;-1;0;False;-1;0;0;0;False;0.1;False;-1;0;False;-1;False;15;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;3;FLOAT3;0,0,0;False;4;FLOAT;0;False;6;FLOAT3;0,0,0;False;7;FLOAT3;0,0,0;False;8;FLOAT;0;False;9;FLOAT;0;False;10;FLOAT;0;False;13;FLOAT3;0,0,0;False;11;FLOAT3;0,0,0;False;12;FLOAT3;0,0,0;False;14;FLOAT4;0,0,0,0;False;15;FLOAT3;0,0,0;False;0
WireConnection;31;0;29;0
WireConnection;31;1;30;0
WireConnection;34;0;31;0
WireConnection;34;1;33;0
WireConnection;32;0;34;0
WireConnection;42;0;41;0
WireConnection;42;1;43;0
WireConnection;45;0;34;0
WireConnection;27;0;10;3
WireConnection;46;0;45;0
WireConnection;46;1;42;0
WireConnection;26;0;10;1
WireConnection;26;1;10;2
WireConnection;26;2;27;0
WireConnection;44;0;32;0
WireConnection;44;1;42;0
WireConnection;25;0;10;0
WireConnection;25;1;26;0
WireConnection;35;0;44;0
WireConnection;35;1;37;0
WireConnection;59;1;52;0
WireConnection;59;7;53;0
WireConnection;48;0;37;0
WireConnection;48;1;46;0
WireConnection;12;0;25;0
WireConnection;12;1;11;0
WireConnection;12;2;13;4
WireConnection;49;0;38;2
WireConnection;49;1;48;0
WireConnection;55;0;38;2
WireConnection;55;1;59;0
WireConnection;55;2;56;0
WireConnection;6;0;3;0
WireConnection;6;1;5;0
WireConnection;6;2;7;4
WireConnection;47;0;35;0
WireConnection;47;1;38;1
WireConnection;50;0;47;0
WireConnection;50;1;49;0
WireConnection;50;2;55;0
WireConnection;24;0;3;4
WireConnection;24;2;7;4
WireConnection;8;0;6;0
WireConnection;14;0;12;0
WireConnection;20;0;19;0
WireConnection;39;0;50;0
WireConnection;22;0;24;0
WireConnection;62;0;63;0
WireConnection;62;2;66;0
WireConnection;61;1;62;0
WireConnection;2;0;16;0
WireConnection;2;1;17;0
WireConnection;2;3;18;0
WireConnection;2;4;20;0
WireConnection;0;10;23;0
WireConnection;0;13;2;0
WireConnection;0;11;40;0
ASEEND*/
//CHKSM=8F50F204A593FDCB0B4FA785033F06AA0ABD468A

到了这里,关于Unity制作随风摇摆的植物的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【unity】快速了解游戏制作流程-制作九宫格简单游戏demo

            hi~大家好呀!欢迎来到我的unity学习笔记系列~,本篇我会简单的记录一下游戏流程并且简单上手一个通过九宫格移动到指定位置的小游戏,话不多说,我们直接开始吧~                  本篇源自我看B站一位up主的视频所做的笔记,感兴趣的可以去看原视频哦

    2023年04月08日
    浏览(54)
  • Unity制作 小球吃金币 游戏

    工程源文件下载地址-百度网盘 1. 新建一个项目 2. 新建一个平面对象 3. 新建一个材质球 为材质球设置颜色 5. 将材质球拖拽赋值给平面 6.  创建立方体对象,拉伸至平面宽度 7. 再复制三个立方体、调整位置、添加材质,用四个调整过的立方体将平面围起来 8. 创建一个球体(

    2024年01月15日
    浏览(46)
  • Unity游戏开始界面制作教学

    第一步: 新建一个Scene 第二步: 在Scene里添加一个Canvas对象(在Hierarchy右键–UI–Canavas) 如何给添加开始按钮: 在Canvas右键–UI–Button 如何给按钮添加文字: Button的子对象Text的Text组件可以修改按钮上的文字 如何给按钮添加事件: Button对象的Button组件最下面有一个“Oncl

    2024年02月02日
    浏览(41)
  • 编程小游戏制作植物僵尸,编程小游戏教程视频

    大家好,给大家分享一下编程小游戏植物大战僵尸,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 大家好,今天给大家带来30个 Python 小游戏,喜欢记得点赞、一定要收藏! 文章目录 有手就行 1、吃金币 2、打乒乓 3、滑雪 4、并夕夕版飞机大战 5、打地鼠

    2024年02月22日
    浏览(58)
  • 【unity demo】使用unity制作射击游戏demo (上)

    主要是安装unity对应的版本,并配置相应的ide,目前我用的是unity 2021.3.21。 通过edit-prefreneces面板,external tools选项中配置ide环境,自动使用vs code来打开工程中的代码文档。 即游戏设计文档(Game Design Document, GDD),我们需要预先对待实现的完整demo进行设计,包括5个部分:

    2024年02月08日
    浏览(63)
  • unity——小球酷跑游戏制作

    所有变量与物体名的命名原则都是见名知意 一、创建一个unity项目 二、Create所需3Dobject 1.Player 2.walls 三、添加属性 : 1.添加在Player上 a.添加Rigidbody组件 b.添加new script组件,并命名为PlayMove,代码如下: 2.添加到walls上 a.首先create empty将wall包含 b.在Wall上添加new script组件,代码

    2023年04月24日
    浏览(37)
  • unity制作FPS射击游戏

    角色动作方面包括行走、奔跑、跳跃、武器切换、弹夹更换、武器展示、弹壳抛出效果、射击效果、全自动与半自动射击效果、瞄准效果、后坐力效果、弹痕效果等多种动作。 非玩家角色(NPC)具备多个动画状态,包括固定路径巡逻、行走、奔跑、寻路攻击等多种行为。 太

    2024年02月08日
    浏览(55)
  • Unity学习之坦克游戏制作(1)开始场景的制作

    相当于开始界面,想怎么创建就怎么创建 我最终模拟的效果 这部分不关键,关键的是创建可用来装载脚本的button 这部分感兴趣的可以去看我博客的GUI部分,但建议大家把学GUI的时间拿来学UGUI 导入预设体 Root 创建一格Label组件作为标题 这部分也可以自己创建 同时创建四个按

    2024年01月22日
    浏览(48)
  • unity制作一款塔防游戏

    关键技术: 寻路系统 生成怪物算法 粒子系统 line renderer制作追踪射线 相机视角移动、放大 炮弹追踪算法 粒子特效 按钮动画制作 设置几个基准点,用于偏移方向 定义一个Move方法 判断当前行数是否超过位置数组的长度,如果是则直接返回 根据当前位置与目标位置计算出移

    2024年02月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包