using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(menuName = "Finite State Machine/State/Default")] public class State : ScriptableObject { //Variables [SerializeField] private Action entryAction; [SerializeField] private Action[] actions; [SerializeField] private Action exitAction; [SerializeField] private Transition[] transitions; [SerializeField] private State initialSubState; [SerializeField] private List<State> subStates; [SerializeField] private State parentState; public State GetParentState() => parentState; // Getter for parent state //Methods public Action GetEntryAction() => entryAction; public Action[] GetActions() => actions; public Action ExitAction() => exitAction; public Transition[] GetTransitions() => transitions; public List<State> SubStates() => subStates; //Runs the entry action of the currentState public void Enter(FSM fsm) { Debug.Log($"Entering state: {name}"); entryAction?.Execute(fsm); if (initialSubState != null) { fsm.ChangeState(initialSubState); } } //Executes all the actions of the state public void ExecuteActions(FSM fsm) { foreach (Action action in actions) { action?.Execute(fsm); } } //Gets a triggered transition public Transition GetTriggeredTransition(FSM fsm) { foreach (Transition transition in transitions) { if (transition.IsTriggered(fsm)) { return transition; } } return null; } public void SetParentState(State parent) { parentState = parent; // Assign this state as the parent to its substates foreach (State subState in subStates) { subState.SetParentState(this); } } // This method should be called to initialize parent-child relationships public void InitializeSubStates() { foreach (State subState in subStates) { subState.SetParentState(this); subState.InitializeSubStates(); // Recursively initialize all substates } } }