Newer
Older
HierarchicalFSM-Unity3D / Assets / Scripts / NPC / FSM / State.cs
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. [CreateAssetMenu(menuName = "Finite State Machine/State")]
  5. public class State : ScriptableObject
  6. {
  7. //Variables
  8. [SerializeField] private Action entryAction;
  9. [SerializeField] private Action[] actions;
  10. [SerializeField] private Action exitAction;
  11. [SerializeField] private Transition[] transitions;
  12. [SerializeField] private State initialSubState;
  13. [SerializeField] private List<State> subStates;
  14. //Methods
  15. public Action GetEntryAction() => entryAction;
  16. public Action[] GetActions() => actions;
  17. public Action ExitAction() => exitAction;
  18. public Transition[] Transitions() => transitions;
  19. public List<State> SubStates() => subStates;
  20. //Runs the entry action of the currentState
  21. public void Enter(FSM fsm)
  22. {
  23. Debug.Log($"Entering state: {name}");
  24. entryAction?.Execute(fsm);
  25. if (initialSubState != null)
  26. {
  27. fsm.ChangeState(initialSubState);
  28. }
  29. }
  30. //Executes all the actions of the state
  31. public void ExecuteActions(FSM fsm)
  32. {
  33. foreach (Action action in actions)
  34. {
  35. action?.Execute(fsm);
  36. }
  37. }
  38. //Gets a triggered transition
  39. public Transition GetTriggeredTransition(FSM fsm)
  40. {
  41. foreach (Transition transition in transitions)
  42. {
  43. if (transition.IsTriggered(fsm))
  44. {
  45. return transition;
  46. }
  47. }
  48. return null;
  49. }
  50. }