MovingCharacterBrain.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 UnityEngine;
  4. namespace Animancer.Samples.StateMachines
  5. {
  6. /// <summary>Uses player input to control a <see cref="Character"/>.</summary>
  7. ///
  8. /// <remarks>
  9. /// <strong>Sample:</strong>
  10. /// <see href="https://kybernetik.com.au/animancer/docs/samples/fsm/brains">
  11. /// Brains</see>
  12. /// </remarks>
  13. ///
  14. /// https://kybernetik.com.au/animancer/api/Animancer.Samples.StateMachines/MovingCharacterBrain
  15. ///
  16. [AddComponentMenu(Strings.SamplesMenuPrefix + "Brains - Moving Character Brain")]
  17. [AnimancerHelpUrl(typeof(MovingCharacterBrain))]
  18. public class MovingCharacterBrain : MonoBehaviour
  19. {
  20. /************************************************************************************************************************/
  21. [SerializeField] private Character _Character;
  22. [SerializeField] private CharacterState _Move;
  23. [SerializeField] private CharacterState _Action;
  24. /************************************************************************************************************************/
  25. protected virtual void Update()
  26. {
  27. UpdateMovement();
  28. UpdateAction();
  29. }
  30. /************************************************************************************************************************/
  31. private void UpdateMovement()
  32. {
  33. Vector2 input = SampleInput.WASD;
  34. if (input != Vector2.zero)
  35. {
  36. // Convert the input to 3D in the XZ plane.
  37. Vector3 movementDirection = new Vector3(input.x, 0, input.y);
  38. // Apply the camera's rotation and set the parameter.
  39. Transform camera = Camera.main.transform;
  40. movementDirection = camera.TransformDirection(movementDirection);
  41. _Character.Parameters.MovementDirection = movementDirection;
  42. // Enter the movement state if we aren't already in it.
  43. _Character.StateMachine.TrySetState(_Move);
  44. }
  45. else// If we aren't trying to move, clear the movement vector and return to idle.
  46. {
  47. _Character.Parameters.MovementDirection = Vector3.zero;
  48. _Character.StateMachine.TrySetDefaultState();
  49. }
  50. // Try to run while holding shift.
  51. _Character.Parameters.WantsToRun = SampleInput.LeftShiftHold;
  52. }
  53. /************************************************************************************************************************/
  54. private void UpdateAction()
  55. {
  56. if (SampleInput.LeftMouseUp)
  57. _Character.StateMachine.TryResetState(_Action);
  58. }
  59. /************************************************************************************************************************/
  60. }
  61. }