Newer
Older
HardPoint-Project-Abertay-University-Unity3D / Assets / Scripts / FSM / FiniteStateMachine.cs
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class FiniteStateMachine : MonoBehaviour, IUpdatable
{
    public State initialState;
    [SerializeField]
    private State currentState;
    private GameObject target;
    [HideInInspector]
    public DictionariesFSM<object> dic = new DictionariesFSM<object>();
    public DictionariesFSM<Vector3> dicVecs = new DictionariesFSM<Vector3>();
    public DictionariesFSM<bool> dicBools = new DictionariesFSM<bool>();

    void Start()
    {
        currentState = initialState;
        target = GameObject.FindGameObjectWithTag("Player");
        if(currentState.GetEntryAction() != null)
        {
            currentState.GetEntryAction().Act(this);
        }
    }

    public GameObject GetTarget()
    {
        return target;
    }

    public void Updating()
    {

        Transition triggeredTransition = null;
        if (currentState == null) currentState = initialState;
        foreach (Transition transition in currentState.GetTransitions())
        {
            if (transition.IsTriggered(this))
            {
                triggeredTransition = transition;
                break;
            }
        }
        List<Action> actions = new List<Action>();
        if (triggeredTransition)
        {
            State targetState = triggeredTransition.GetTargetState();
            actions.Add(currentState.GetExitAction());
            actions.Add(triggeredTransition.GetAction());
            actions.Add(targetState.GetEntryAction());
            currentState = targetState;
        }
        else
        {
            foreach (Action action in currentState.GetStateActions())
            {
                actions.Add(action);
            }
        }
        foreach (Action action in actions)
        {
            if (action)
            {
                //Debug.Log(action.name);
                action.Act(this);
            }
        }
    }
}