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; } }