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