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