Newer
Older
HierarchicalFSM-Unity3D / Assets / Scripts / NPC / FSM / State.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(menuName = "Finite State Machine/State")]
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;

    //Methods
    public Action GetEntryAction() => entryAction;
    public Action[] GetActions() => actions;
    public Action ExitAction() => exitAction;
    public Transition[] Transitions() => transitions;
    public List<State> SubStates() => subStates;

    //Runs the entry action of the currentState
    public void Enter(FSM fsm)
    {
        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;
    }
}