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类

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