U3D 아키텍처 제품군 - FSM 유한 상태기 설계 4

3016 단어 unity설계FSM
그 다음에 우리는 FSM 유한 상태기의 디자인을 계속했다. 디자인 3에서 우리는 FSState 클래스를 실현했고 FSEvent 이벤트 처리 클래스를 계속 실현했다.FSEvent 클래스에서FiniteStateMachine에 정의된 의뢰 함수를 설명합니다.코드는 다음과 같습니다.
	protected FiniteStateMachine.EnterState mEnterDelegate;
	protected FiniteStateMachine.PushState mPushDelegate;
	protected FiniteStateMachine.PopState mPopDelegate;

또한 유한 상태기의 상태를 처리하는 데 사용되는 매거진을 정의했습니다. 시스템에서 자체로 봉인된 세 개의 파라미터를 사용하고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에서 자주 사용하는 클래스가 봉인되었습니다. 다음은 디자인 5에서 이벤트시스템 클래스를 봉인할 것입니다.이벤트 처리에 사용되는 등록, 배달 등 기능.

좋은 웹페이지 즐겨찾기