Newer
Older
TheVengeance-Project-IADE-Unity2D / Assets / Scripts / NPC / FSM / FSM.cs
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();
        }
    }
}