using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace MyCollections.AI.FinitStateMachine { [System.Serializable] public class FSM { private NPCConroller controller; [SerializeField] private State initialState; [SerializeField] private State currentState; [SerializeField] private GameObject target; public GameObject Target => target; public NPCConroller Controller => controller; public void SetUp() { if (initialState != null) { Debug.Log($"{controller.gameObject.name} initial state is {initialState}"); initialState.GetentryActions(); currentState = initialState; } else { Debug.LogError($"The NPC doesn't have an Initial State"); } } // Called Every Frame public void GUpdate() { if (currentState != null) { if (currentState.GetActions().Count > 0) { foreach (Action action in currentState.GetActions()) { action.Run(this); } } Transition triggeredTransition = currentState.GetTriggeredTransition(this); if (triggeredTransition != null) { ChangeState(triggeredTransition.TargetState()); } } } public void ChangeState(State state) { currentState.GetExitAction().Run(this); //Runs the exit action state.EnterState(this); } public State CurrentState() => currentState; public FSM(NPCConroller controller) { this.controller = controller; SetUp(); } } }