U3D架構系列之- FSM有限狀態機設計四

     接下來,我們繼續我們的FSM有限狀態機的設計,在設計三中我們實現了FSState這個類,我們繼續實現FSEvent事件處理類。在FSEvent類裏面我們聲明瞭FiniteStateMachine裏面定義的委託函數。代碼如下:

	protected FiniteStateMachine.EnterState mEnterDelegate;
	protected FiniteStateMachine.PushState mPushDelegate;
	protected FiniteStateMachine.PopState mPopDelegate;

同時我們定義了一個枚舉用於處理有限狀態機的狀態,使用了System裏面自帶的封裝的一個具有三個參數並返回TResult參數制定的雷興志的方法。

public Func<object,object,object,bool>	mAction = null;

這個FSEvent事件類也是獨立的,不繼承Mono。它的核心功能主要是處理FSState的Enter,Push,Pop。代碼如下:

public FSState Enter(string stateName) {
		mTargetState = stateName;
		eType = EventType.ENTER;
		return mStateOwner;
	}

	public FSState Push(string stateName) {
		mTargetState = stateName;
		eType = EventType.PUSH;
		return mStateOwner;
	}

	public void Pop() {
		eType = EventType.POP;
	}

	public void Execute(object o1,object o2,object o3) {
		if (eType == EventType.POP) {
			mPopDelegate();
		}
		else if (eType == EventType.PUSH) {
			mPushDelegate(mTargetState, mOwner.CurrentState.StateName);
		}
		else if (eType == EventType.ENTER) {
			mEnterDelegate(mTargetState);
		}
		else if (mAction != null) {
			mAction(o1, o2, o3);
		}
	}

總的來說,FSEvent是通過調用Enter,Push,Pop,Execute執行狀態的切換。下面把整個代碼給大家展現一下:

using System;

public class FSEvent {
	protected FiniteStateMachine.EnterState mEnterDelegate;
	protected FiniteStateMachine.PushState mPushDelegate;
	protected FiniteStateMachine.PopState mPopDelegate;

	protected enum EventType { NONE, ENTER, PUSH, POP };
	protected string mEventName;
	protected FSState mStateOwner;
	protected string mTargetState;
	protected FiniteStateMachine mOwner;
	protected EventType eType;
	public Func<object,object,object,bool>	mAction = null;

	public FSEvent(string name, string target, FSState state, FiniteStateMachine owner, FiniteStateMachine.EnterState e, FiniteStateMachine.PushState pu, FiniteStateMachine.PopState po) {
		mStateOwner = state;
		mEventName = name;
		mTargetState = target;
		mOwner = owner;
		eType = EventType.NONE;
		mEnterDelegate = e;
		mPushDelegate = pu;
		mPopDelegate = po;
	}

	public FSState Enter(string stateName) {
		mTargetState = stateName;
		eType = EventType.ENTER;
		return mStateOwner;
	}

	public FSState Push(string stateName) {
		mTargetState = stateName;
		eType = EventType.PUSH;
		return mStateOwner;
	}

	public void Pop() {
		eType = EventType.POP;
	}

	public void Execute(object o1,object o2,object o3) {
		if (eType == EventType.POP) {
			mPopDelegate();
		}
		else if (eType == EventType.PUSH) {
			mPushDelegate(mTargetState, mOwner.CurrentState.StateName);
		}
		else if (eType == EventType.ENTER) {
			mEnterDelegate(mTargetState);
		}
		else if (mAction != null) {
			mAction(o1, o2, o3);
		}
	}
}

設計四把FSM常用的類已經封裝好了,接下來我們會在設計五中去封裝一個EventSystem類。用於處理事件的註冊,分發等功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章