120 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
	
	
using System;
 | 
						|
using System.Reflection;
 | 
						|
using System.Collections;
 | 
						|
using System.Collections.Generic;
 | 
						|
using UnityEngine;
 | 
						|
 | 
						|
public class FSM<T>
 | 
						|
{
 | 
						|
    public string CurrentState => mCurrentState != null ? mCurrentState.GetType().ToString() : "";
 | 
						|
 | 
						|
    private Dictionary<Type, BaseState<T>> mStateDic;
 | 
						|
    private T mMaster;
 | 
						|
    private BaseState<T> mCurrentState;
 | 
						|
    private bool mActive;
 | 
						|
 | 
						|
    public FSM(T pMaster)
 | 
						|
    {
 | 
						|
        mMaster = pMaster;
 | 
						|
        mStateDic = new Dictionary<Type, BaseState<T>>();
 | 
						|
        mActive = true;
 | 
						|
    }
 | 
						|
 | 
						|
    public void ChangeState(Type pStateType = null)
 | 
						|
    {
 | 
						|
        if (pStateType == null)//change to empty
 | 
						|
        {
 | 
						|
            if (mCurrentState != null)
 | 
						|
                mCurrentState.ExitState(null);
 | 
						|
            mCurrentState = null;
 | 
						|
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        BaseState<T> tNextState = null;
 | 
						|
        if (pStateType != null)
 | 
						|
        {
 | 
						|
            if (!mStateDic.ContainsKey(pStateType))
 | 
						|
            {
 | 
						|
                object tInstance = pStateType.Assembly.CreateInstance(pStateType.Name);
 | 
						|
                if (tInstance is BaseState<T>)
 | 
						|
                {
 | 
						|
                    tNextState = tInstance as BaseState<T>;
 | 
						|
                    tNextState.SetFSM(this);
 | 
						|
                    tNextState.SetMaster(mMaster);
 | 
						|
                    mStateDic.Add(pStateType, tNextState);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    Debug.LogError("State Class : " + pStateType.Name + " is not a " + typeof(BaseState<T>).Name + "!");
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                tNextState = mStateDic[pStateType];
 | 
						|
            }
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            Debug.LogError("State Class : " + pStateType.Name + " is not found!");
 | 
						|
        }
 | 
						|
 | 
						|
        if (tNextState != null && tNextState != mCurrentState)
 | 
						|
        {
 | 
						|
            if (mCurrentState != null)
 | 
						|
                mCurrentState.ExitState(tNextState.GetType());
 | 
						|
            tNextState.EnterState(mCurrentState?.GetType());
 | 
						|
            mCurrentState = tNextState;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public void Execute(float pDeltaTime)
 | 
						|
    {
 | 
						|
        if (!mActive)
 | 
						|
            return;
 | 
						|
 | 
						|
        if (mCurrentState != null)
 | 
						|
            mCurrentState.ExecuteState(pDeltaTime);
 | 
						|
    }
 | 
						|
 | 
						|
    public void SetActive(bool pActive)
 | 
						|
    {
 | 
						|
        mActive = pActive;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
public class BaseState<T>
 | 
						|
{
 | 
						|
    protected T mMaster;
 | 
						|
    protected FSM<T> mFSM;
 | 
						|
 | 
						|
    public void SetFSM(FSM<T> pFSM)
 | 
						|
    {
 | 
						|
        mFSM = pFSM;
 | 
						|
    }
 | 
						|
 | 
						|
    public void SetMaster(T pMaster)
 | 
						|
    {
 | 
						|
        mMaster = pMaster;
 | 
						|
    }
 | 
						|
 | 
						|
    public virtual void EnterState(Type pLastState)
 | 
						|
    {
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    public virtual void ExitState(Type pNextState)
 | 
						|
    {
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    public virtual void ExecuteState(float pDeltaTime)
 | 
						|
    {
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    protected void ChangeState(Type pType)
 | 
						|
    {
 | 
						|
        mFSM.ChangeState(pType);
 | 
						|
    }
 | 
						|
} |