S&box Wiki

Revision Difference

Player_Animator#548293

<cat>Code.Player</cat>⤶ ⤶ <title>Player Animator</title>⤶ ⤶ # What is a Player Animator⤶ ⤶ The Animator is responsible for maintaining your AnimGraph with up to date information. You can also set the position and rotation of your player in the Animator. ⤶ ⤶ ⤶ # Example⤶ ⤶ ```⤶ public class StandardPlayerAnimator : PawnAnimator⤶ {⤶ TimeSince TimeSinceFootShuffle = 60;⤶ ⤶ ⤶ float duck;⤶ ⤶ public override void Simulate()⤶ {⤶ var player = Pawn as Player;⤶ var idealRotation = Rotation.LookAt( Input.Rotation.Forward.WithZ( 0 ), Vector3.Up );⤶ ⤶ DoRotation( idealRotation );⤶ DoWalk();⤶ ⤶ //⤶ // Let the animation graph know some shit⤶ //⤶ bool sitting = HasTag( "sitting" );⤶ bool noclip = HasTag( "noclip" ) && !sitting;⤶ ⤶ SetAnimParameter( "b_grounded", GroundEntity != null || noclip || sitting );⤶ SetAnimParameter( "b_noclip", noclip );⤶ SetAnimParameter( "b_sit", sitting );⤶ SetAnimParameter( "b_swim", Pawn.WaterLevel > 0.5f && !sitting );⤶ ⤶ if ( Host.IsClient && Client.IsValid() )⤶ {⤶ SetAnimParameter( "voice", Client.TimeSinceLastVoice < 0.5f ? Client.VoiceLevel : 0.0f );⤶ }⤶ ⤶ Vector3 aimPos = Pawn.EyePosition + Input.Rotation.Forward * 200;⤶ Vector3 lookPos = aimPos;⤶ ⤶ //⤶ // Look in the direction what the player's input is facing⤶ //⤶ SetLookAt( "aim_eyes", lookPos );⤶ SetLookAt( "aim_head", lookPos );⤶ SetLookAt( "aim_body", aimPos );⤶ ⤶ if ( HasTag( "ducked" ) ) duck = duck.LerpTo( 1.0f, Time.Delta * 10.0f );⤶ else duck = duck.LerpTo( 0.0f, Time.Delta * 5.0f );⤶ ⤶ SetAnimParameter( "duck", duck );⤶ ⤶ if ( player != null && player.ActiveChild is BaseCarriable carry )⤶ {⤶ carry.SimulateAnimator( this );⤶ }⤶ else⤶ {⤶ SetAnimParameter( "holdtype", 0 );⤶ SetAnimParameter( "aim_body_weight", 0.5f );⤶ }⤶ ⤶ }⤶ ⤶ public virtual void DoRotation( Rotation idealRotation )⤶ {⤶ var player = Pawn as Player;⤶ ⤶ //⤶ // Our ideal player model rotation is the way we're facing⤶ //⤶ var allowYawDiff = player?.ActiveChild == null ? 90 : 50;⤶ ⤶ float turnSpeed = 0.01f;⤶ if ( HasTag( "ducked" ) ) turnSpeed = 0.1f;⤶ ⤶ //⤶ // If we're moving, rotate to our ideal rotation⤶ //⤶ Rotation = Rotation.Slerp( Rotation, idealRotation, WishVelocity.Length * Time.Delta * turnSpeed );⤶ ⤶ //⤶ // Clamp the foot rotation to within 120 degrees of the ideal rotation⤶ //⤶ Rotation = Rotation.Clamp( idealRotation, allowYawDiff, out var change );⤶ ⤶ //⤶ // If we did restrict, and are standing still, add a foot shuffle⤶ //⤶ if ( change > 1 && WishVelocity.Length <= 1 ) TimeSinceFootShuffle = 0;⤶ ⤶ SetAnimParameter( "b_shuffle", TimeSinceFootShuffle < 0.1 );⤶ }⤶ ⤶ void DoWalk()⤶ {⤶ // Move Speed⤶ {⤶ var dir = Velocity;⤶ var forward = Rotation.Forward.Dot( dir );⤶ var sideward = Rotation.Right.Dot( dir );⤶ ⤶ var angle = MathF.Atan2( sideward, forward ).RadianToDegree().NormalizeDegrees();⤶ ⤶ SetAnimParameter( "move_direction", angle );⤶ SetAnimParameter( "move_speed", Velocity.Length );⤶ SetAnimParameter( "move_groundspeed", Velocity.WithZ( 0 ).Length );⤶ SetAnimParameter( "move_y", sideward );⤶ SetAnimParameter( "move_x", forward );⤶ SetAnimParameter( "move_z", Velocity.z );⤶ }⤶ ⤶ // Wish Speed⤶ {⤶ var dir = WishVelocity;⤶ var forward = Rotation.Forward.Dot( dir );⤶ var sideward = Rotation.Right.Dot( dir );⤶ ⤶ var angle = MathF.Atan2( sideward, forward ).RadianToDegree().NormalizeDegrees();⤶ ⤶ SetAnimParameter( "wish_direction", angle );⤶ SetAnimParameter( "wish_speed", WishVelocity.Length );⤶ SetAnimParameter( "wish_groundspeed", WishVelocity.WithZ( 0 ).Length );⤶ SetAnimParameter( "wish_y", sideward );⤶ SetAnimParameter( "wish_x", forward );⤶ SetAnimParameter( "wish_z", WishVelocity.z );⤶ }⤶ }⤶ ⤶ public override void OnEvent( string name )⤶ {⤶ // DebugOverlay.Text( Pos + Vector3.Up * 100, name, 5.0f );⤶ ⤶ if ( name == "jump" )⤶ {⤶ Trigger( "b_jump" );⤶ }⤶ ⤶ base.OnEvent( name );⤶ }⤶ }⤶ ```⤶ ⤶ ⤶ # Setting ⤶ ⤶ Setting the Animator is the same as setting a <page>Player Controller</page>.⤶ ⤶ ```⤶ public override void Respawn()⤶ {⤶ base.Respawn();⤶ ⤶ Animator = new StandardPlayerAnimator();⤶ }⤶ ```⤶ ⤶ Like the <page>Player Controller</page>, this property can be changed at any time and is replicated to the client. Setting to null will mean your player isn't animated.