HybridMoveState.cs 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Animancer // https://kybernetik.com.au/animancer // Copyright 2022 Kybernetik //
  2. using Animancer.Examples.StateMachines;
  3. using Animancer.Units;
  4. using UnityEngine;
  5. namespace Animancer.Examples.AnimatorControllers
  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. /// This class is very similar to <see cref="MoveState"/>, except that it manages a
  14. /// Blend Tree instead of a Mixer.
  15. /// </remarks>
  16. ///
  17. /// <example><see href="https://kybernetik.com.au/animancer/docs/examples/animator-controllers/character">Hybrid Character</see></example>
  18. ///
  19. /// https://kybernetik.com.au/animancer/api/Animancer.Examples.AnimatorControllers/HybridMoveState
  20. ///
  21. [AddComponentMenu(Strings.ExamplesMenuPrefix + "Hybrid - Move State")]
  22. [HelpURL(Strings.DocsURLs.ExampleAPIDocumentation + nameof(AnimatorControllers) + "/" + nameof(HybridMoveState))]
  23. public sealed class HybridMoveState : CharacterState
  24. {
  25. /************************************************************************************************************************/
  26. [SerializeField, DegreesPerSecond] private float _TurnSpeed = 360;
  27. [SerializeField] private float _ParameterFadeSpeed = 2;
  28. private float _MoveBlend;
  29. /************************************************************************************************************************/
  30. /// <summary>
  31. /// Normally the <see cref="Character"/> class would have a reference to the specific type of
  32. /// <see cref="AnimancerComponent"/> we want, but for the sake of reusing code from the earlier example, we
  33. /// just use a type cast here.
  34. /// </summary>
  35. private HybridAnimancerComponent HybridAnimancer
  36. => (HybridAnimancerComponent)Character.Animancer;
  37. /************************************************************************************************************************/
  38. private void OnEnable()
  39. {
  40. HybridAnimancer.PlayController();
  41. HybridAnimancer.SetBool(Animations.IsMoving, true);
  42. _MoveBlend = Character.Parameters.WantsToRun ? 1 : 0;
  43. }
  44. /************************************************************************************************************************/
  45. private void Update()
  46. {
  47. UpdateAnimation();
  48. UpdateTurning();
  49. }
  50. /************************************************************************************************************************/
  51. /// <summary>This method is similar to <see cref="MoveState.UpdateAnimation"/>.</summary>
  52. private void UpdateAnimation()
  53. {
  54. var target = Character.Parameters.WantsToRun ? 1 : 0;
  55. _MoveBlend = Mathf.MoveTowards(
  56. _MoveBlend,
  57. target,
  58. _ParameterFadeSpeed * Time.deltaTime);
  59. HybridAnimancer.SetFloat(Animations.MoveBlend, _MoveBlend);
  60. }
  61. /************************************************************************************************************************/
  62. /// <remarks>This method is identical to <see cref="MoveState.UpdateTurning"/>.</remarks>
  63. private void UpdateTurning()
  64. {
  65. var movement = Character.Parameters.MovementDirection;
  66. if (movement == default)
  67. return;
  68. var targetAngle = Mathf.Atan2(movement.x, movement.z) * Mathf.Rad2Deg;
  69. var turnDelta = _TurnSpeed * Time.deltaTime;
  70. var transform = Character.Animancer.transform;
  71. var eulerAngles = transform.eulerAngles;
  72. eulerAngles.y = Mathf.MoveTowardsAngle(eulerAngles.y, targetAngle, turnDelta);
  73. transform.eulerAngles = eulerAngles;
  74. }
  75. /************************************************************************************************************************/
  76. }
  77. }