MoveState.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
  2. #pragma warning disable CS0649 // Field is never assigned to, and will always have its default value.
  3. using Animancer.Units;
  4. using UnityEngine;
  5. namespace Animancer.Samples.StateMachines
  6. {
  7. /// <summary>
  8. /// A <see cref="CharacterState"/> which moves the character according to their
  9. /// <see cref="CharacterParameters.MovementDirection"/>.
  10. /// </summary>
  11. ///
  12. /// <remarks>
  13. /// <strong>Sample:</strong>
  14. /// <see href="https://kybernetik.com.au/animancer/docs/samples/fsm/brains">
  15. /// Brains</see>
  16. /// </remarks>
  17. ///
  18. /// https://kybernetik.com.au/animancer/api/Animancer.Samples.StateMachines/MoveState
  19. ///
  20. [AddComponentMenu(Strings.SamplesMenuPrefix + "Brains - Move State")]
  21. [AnimancerHelpUrl(typeof(MoveState))]
  22. public class MoveState : CharacterState
  23. {
  24. /************************************************************************************************************************/
  25. [SerializeField] private TransitionAsset _Animation;
  26. [SerializeField] private StringAsset _SpeedParameter;
  27. [SerializeField] private float _WalkParameterValue = 0.5f;
  28. [SerializeField] private float _RunParameterValue = 1;
  29. [SerializeField, Seconds] private float _ParameterSmoothTime = 0.15f;
  30. [SerializeField, DegreesPerSecond] private float _TurnSpeed = 360;
  31. private SmoothedFloatParameter _Speed;
  32. /************************************************************************************************************************/
  33. protected virtual void Awake()
  34. {
  35. _Speed = new SmoothedFloatParameter(
  36. Character.Animancer,
  37. _SpeedParameter,
  38. _ParameterSmoothTime);
  39. }
  40. /************************************************************************************************************************/
  41. protected virtual void OnEnable()
  42. {
  43. Character.Animancer.Play(_Animation);
  44. }
  45. /************************************************************************************************************************/
  46. protected virtual void Update()
  47. {
  48. UpdateSpeed();
  49. UpdateTurning();
  50. }
  51. /************************************************************************************************************************/
  52. private void UpdateSpeed()
  53. {
  54. _Speed.TargetValue = Character.Parameters.WantsToRun
  55. ? _RunParameterValue
  56. : _WalkParameterValue;
  57. }
  58. /************************************************************************************************************************/
  59. private void UpdateTurning()
  60. {
  61. // Don't turn if we aren't trying to move.
  62. Vector3 movement = Character.Parameters.MovementDirection;
  63. if (movement == Vector3.zero)
  64. return;
  65. // Determine the angle we want to turn towards.
  66. // Without going into the maths behind it, Atan2 gives us the angle of a vector in radians.
  67. // So we just feed in the x and z values because we want an angle around the y axis,
  68. // then convert the result to degrees because Transform.eulerAngles uses degrees.
  69. float targetAngle = Mathf.Atan2(movement.x, movement.z) * Mathf.Rad2Deg;
  70. // Determine how far we can turn this frame (in degrees).
  71. float turnDelta = _TurnSpeed * Time.deltaTime;
  72. // Get the current rotation, move its y value towards the target, and apply it back to the Transform.
  73. Transform transform = Character.Animancer.transform;
  74. Vector3 eulerAngles = transform.eulerAngles;
  75. eulerAngles.y = Mathf.MoveTowardsAngle(eulerAngles.y, targetAngle, turnDelta);
  76. transform.eulerAngles = eulerAngles;
  77. }
  78. /************************************************************************************************************************/
  79. }
  80. }