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

   在設計二中,我們實現了有限狀態機管理類,接下來,我們實現FSState這個類,這裏類主要是狀態的基本操作以及事件觸發。在這裏我們定義了在FiniteStateMachine類裏聲明的三個委託。在FSState裏面使用的代碼如下:

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

這個FSState是獨立的一個類,不繼承Mono,我們定義了一個構造函數,將我們的委託進行了初始化:

public FSState(IState obj, FiniteStateMachine owner, string name, FiniteStateMachine.EnterState e, FiniteStateMachine.PushState pu, FiniteStateMachine.PopState po) {
                mStateObject = obj;
                mStateName = name;
                mOwner = owner;
                mEnterDelegate = e;
                mPushDelegate = pu;
                mPopDelegate = po;
                mTranslationEvents = new Dictionary<string, FSEvent>();

        }

我們聲明瞭FSEvent事件處理函數用於將事件的名字和事件加入的Dictionary裏面

public FSEvent On(string eventName) {
                FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
                mTranslationEvents.Add(eventName, newEvent);
                return newEvent;

        }

加入到列表後,我們需要從表裏面取出去執行,這就需要Trigger觸發函數:

public void Trigger(string name) {
                mTranslationEvents[name].Execute(null, null, null);
        }


        public void Trigger(string eventName, object param1) {
                mTranslationEvents[eventName].Execute(param1, null, null);
        }
        
        public void Trigger(string eventName, object param1, object param2) {
                mTranslationEvents[eventName].Execute(param1, param2, null);
        }
        
        public void Trigger(string eventName, object param1, object param2, object param3) {
                mTranslationEvents[eventName].Execute(param1, param2, param3);

        }

以上也是FSState類的核心代碼,閒話少說,FSState類的整個代碼,如下:

using System;
using System.Collections;
using System.Collections.Generic;

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

	protected IState mStateObject;
	protected string mStateName;
	protected FiniteStateMachine mOwner;
	protected Dictionary<string, FSEvent> mTranslationEvents;

	public FSState(IState obj, FiniteStateMachine owner, string name, FiniteStateMachine.EnterState e, FiniteStateMachine.PushState pu, FiniteStateMachine.PopState po) {
		mStateObject = obj;
		mStateName = name;
		mOwner = owner;
		mEnterDelegate = e;
		mPushDelegate = pu;
		mPopDelegate = po;
		mTranslationEvents = new Dictionary<string, FSEvent>();
	}

	public IState StateObject {
		get {
			return mStateObject;
		}
	}

	public string StateName {
		get {
			return mStateName;
		}
	}

	public FSEvent On(string eventName) {
		FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
		mTranslationEvents.Add(eventName, newEvent);
		return newEvent;
	}

	public void Trigger(string name) {
		mTranslationEvents[name].Execute(null, null, null);
	}

	public void Trigger(string eventName, object param1) {
		mTranslationEvents[eventName].Execute(param1, null, null);
	}
	
	public void Trigger(string eventName, object param1, object param2) {
		mTranslationEvents[eventName].Execute(param1, param2, null);
	}
	
	public void Trigger(string eventName, object param1, object param2, object param3) {
		mTranslationEvents[eventName].Execute(param1, param2, param3);
	}

	
	public FSState On<T>(string eventName, Func<T, bool> action) {
		FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
		newEvent.mAction = delegate (object o1, object o2, object o3) {
			T param1;
			try { param1 = (T)o1; } catch { param1 = default(T); }
			action(param1);
			return true;
		};
		mTranslationEvents.Add(eventName, newEvent);
		return this;
	}
	
	public FSState On<T>(string eventName, Action<T> action) {
		FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
		newEvent.mAction = delegate (object o1, object o2, object o3) {
			T param1;
			try { param1 = (T)o1; } catch { param1 = default(T); }
			action(param1);
			return true;
		};
		mTranslationEvents.Add(eventName, newEvent);
		return this;
	}
	
	public FSState On<T1, T2>(string eventName, Func<T1, T2, bool> action) {
		FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
		newEvent.mAction = delegate (object o1, object o2, object o3) {
			T1 param1;
			T2 param2;
			try { param1 = (T1)o1; } catch { param1 = default(T1); }
			try { param2 = (T2)o2; } catch { param2 = default(T2); }
			action(param1, param2);
			return true;
		};
		mTranslationEvents.Add(eventName, newEvent);
		return this;
	}
	
	public FSState On<T1, T2>(string eventName, Action<T1, T2> action) {
		FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
		newEvent.mAction = delegate (object o1, object o2, object o3) {
			T1 param1;
			T2 param2;
			try { param1 = (T1)o1; } catch { param1 = default(T1); }
			try { param2 = (T2)o2; } catch { param2 = default(T2); }
			action(param1, param2);
			return true;
		};
		mTranslationEvents.Add(eventName, newEvent);
		return this;
	}

	public FSState On<T1, T2, T3>(string eventName, Func<T1, T2, T3, bool> action) {
		FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
		newEvent.mAction = delegate (object o1, object o2, object o3) {
			T1 param1;
			T2 param2;
			T3 param3;
			try { param1 = (T1)o1; } catch { param1 = default(T1); }
			try { param2 = (T2)o2; } catch { param2 = default(T2); }
			try { param3 = (T3)o3; } catch { param3 = default(T3); }
			action(param1, param2, param3);
			return true;
		};
		mTranslationEvents.Add(eventName, newEvent);
		return this;
	}
	
	public FSState On<T1, T2, T3>(string eventName, Action<T1, T2, T3> action) {
		FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
		newEvent.mAction = delegate (object o1, object o2, object o3) {
			T1 param1;
			T2 param2;
			T3 param3;
			try { param1 = (T1)o1; } catch { param1 = default(T1); }
			try { param2 = (T2)o2; } catch { param2 = default(T2); }
			try { param3 = (T3)o3; } catch { param3 = default(T3); }
			action(param1, param2, param3);
			return true;
		};
		mTranslationEvents.Add(eventName, newEvent);
		return this;
	}
}

接下來會在設計四中繼續講解 FSEvent類

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