EquipState.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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>A <see cref="CharacterState"/> which managed the currently equipped <see cref="CurrentWeapon"/>.</summary>
  7. ///
  8. /// <remarks>
  9. /// <strong>Sample:</strong>
  10. /// <see href="https://kybernetik.com.au/animancer/docs/samples/fsm/weapons">
  11. /// Weapons</see>
  12. /// </remarks>
  13. ///
  14. /// https://kybernetik.com.au/animancer/api/Animancer.Samples.StateMachines/EquipState
  15. ///
  16. [AddComponentMenu(Strings.SamplesMenuPrefix + "Weapons - Equip State")]
  17. [AnimancerHelpUrl(typeof(EquipState))]
  18. public class EquipState : CharacterState
  19. {
  20. /************************************************************************************************************************/
  21. public Weapon NextWeapon { get; set; }
  22. public Weapon CurrentWeapon
  23. => Character.Equipment.Weapon;
  24. public override CharacterStatePriority Priority
  25. => CharacterStatePriority.Medium;
  26. /************************************************************************************************************************/
  27. protected virtual void Awake()
  28. {
  29. NextWeapon = CurrentWeapon;
  30. }
  31. /************************************************************************************************************************/
  32. public override bool CanEnterState
  33. => !enabled
  34. && NextWeapon != CurrentWeapon;
  35. /************************************************************************************************************************/
  36. protected virtual void OnEnable()
  37. {
  38. if (CurrentWeapon.UnequipAnimation.IsValid())
  39. {
  40. AnimancerState state = Character.Animancer.Play(CurrentWeapon.UnequipAnimation);
  41. state.Events(this).OnEnd ??= OnUnequipEnd;
  42. }
  43. else
  44. {
  45. OnUnequipEnd();
  46. }
  47. }
  48. /************************************************************************************************************************/
  49. private void OnUnequipEnd()
  50. {
  51. Character.Equipment.Weapon = NextWeapon;
  52. if (CurrentWeapon.EquipAnimation.IsValid())
  53. {
  54. AnimancerState state = Character.Animancer.Play(CurrentWeapon.EquipAnimation);
  55. state.Events(this).OnEnd ??= Character.StateMachine.ForceSetDefaultState;
  56. }
  57. else
  58. {
  59. Character.StateMachine.ForceSetDefaultState();
  60. }
  61. }
  62. /************************************************************************************************************************/
  63. }
  64. }