Newer
Older
Dreamsturbia-Project-IADE-Unity3D / Assets / Scripts / AI / FSM / FiniteStateMachine.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Animations;

public class FiniteStateMachine : MonoBehaviour
{
    public State initialState;

    public State currentState;

    public Transform target;

    
    public AnimationController animationController; 

    

    private NavMeshAgentController agent;
    [HideInInspector]
    public Rigidbody rb;

    public DictionariesFSM<float> floatDictionary;
    public DictionariesFSM<MonoBehaviour> monoDictionary;
    public DictionariesFSM<Vector3> positionsDictionary;
    public DictionariesFSM<bool> booleanDictionary;

    private void Awake()
    {
        agent = GetComponent<NavMeshAgentController>();
        currentState = initialState;
        floatDictionary = new DictionariesFSM<float>();
        monoDictionary = new DictionariesFSM<MonoBehaviour>();
        positionsDictionary = new DictionariesFSM<Vector3>();
        booleanDictionary = new DictionariesFSM<bool>();

        rb = GetComponent<Rigidbody>();
        
    }

    private void Update()
    {
        if (currentState != null)
        {
            Transition selectedTransition = null;


            foreach (Transition transition in currentState.GetTransitions())
            {

                if (transition.IsTriggered(this))
                {

                    if (selectedTransition == null)
                    {

                        selectedTransition = transition;
                    }
                    else
                    {
                        if (transition.weight > selectedTransition.weight)
                        {
                            selectedTransition = transition;
                        }
                    }


                }
            }

            List<Action> actions = new List<Action>();

            if (selectedTransition)
            {
                State targetState = selectedTransition.GetTargetState();


                actions.Add(currentState.GetExitAction());
                // actions.Add(triggeredTransition.GetAction());
                
                actions.Add(targetState.GetEntryAction());
                targetState.entryAction?.Act(this);
                currentState = targetState;
            }
            else
            {
                foreach (Action action in currentState.GetStateActions())
                {
                    actions.Add(action);
                }
            }

            foreach (Action action in actions)
            {
                if (action)
                {
                    action.Act(this);
                }
            }

        }

    }

    public NavMeshAgentController GetAgent()
    {
        return agent;
    }
}