You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/Plugins/Animancer/Examples/09 Animator Controllers/02 3D Game Kit/States/LandingState.cs

95 lines
3.9 KiB
C#

3 months ago
// Animancer // Copyright 2020 Kybernetik //
#pragma warning disable CS0618 // Type or member is obsolete (for Mixers in Animancer Lite).
#pragma warning disable CS0649 // Field is never assigned to, and will always have its default value.
using UnityEngine;
using UnityEngine.Events;
namespace Animancer.Examples.AnimatorControllers.GameKit
{
[AddComponentMenu(Strings.MenuPrefix + "Examples/Game Kit - Landing State")]
[HelpURL(Strings.APIDocumentationURL + ".Examples.AnimatorControllers.GameKit/LandingState")]
public sealed class LandingState : CreatureState
{
/************************************************************************************************************************/
[SerializeField] private MixerState.Transition2D _SoftLanding;
[SerializeField] private ClipState.Transition _HardLanding;
[SerializeField] private float _HardLandingForwardSpeed = 5;
[SerializeField] private float _HardLandingVerticalSpeed = -10;
[SerializeField] private UnityEvent _PlayAudio;// See the Read Me.
private bool _IsSoftLanding;
/************************************************************************************************************************/
private void Awake()
{
_SoftLanding.Events.Sequence.OnEnd =
_HardLanding.Events.Sequence.OnEnd =
() => Creature.CheckMotionState();
}
/************************************************************************************************************************/
public override bool CanEnterState(CreatureState previousState)
{
return Creature.CharacterController.isGrounded;
}
/************************************************************************************************************************/
/// <summary>
/// Performs either a hard or soft landing depending on the current speed (both horizontal and vertical).
/// </summary>
private void OnEnable()
{
Creature.ForwardSpeed = Creature.DesiredForwardSpeed;
if (Creature.VerticalSpeed <= _HardLandingVerticalSpeed &&
Creature.ForwardSpeed >= _HardLandingForwardSpeed)
{
_IsSoftLanding = false;
Creature.Animancer.Play(_HardLanding);
}
else
{
_IsSoftLanding = true;
Creature.Animancer.Play(_SoftLanding);
_SoftLanding.State.Parameter = new Vector2(Creature.ForwardSpeed, Creature.VerticalSpeed);
}
// The landing sounds in the full 3D Game Kit have different variations based on the ground material, just
// like the footstep sounds as discussed in the LocomotionState.
_PlayAudio.Invoke();
}
/************************************************************************************************************************/
public override bool FullMovementControl { get { return _IsSoftLanding; } }
/************************************************************************************************************************/
private void FixedUpdate()
{
if (!Creature.CharacterController.isGrounded &&
Creature.StateMachine.TrySetState(Creature.Airborne))
return;
Creature.UpdateSpeedControl();
if (_IsSoftLanding)
{
// Update the horizontal speed but keep the initial vertical speed from when you first landed.
var parameter = _SoftLanding.State.Parameter;
parameter.x = Creature.ForwardSpeed;
_SoftLanding.State.Parameter = parameter;
}
}
/************************************************************************************************************************/
}
}