以下是对您的翻译结果:
下面的内容是简单而模块化的状态机架构。我只将简单状态机模型概括为"状态",即具体状态如"状态1 ",以及当然是 "状态机"。
public abstract class State
{
public StateMachine stateMachine;
public void enterStatePre(StateMachine stateMachine)
{
this.stateMachine = stateMachine;
enterState();
}
public abstract void enterState();
public abstract void updateState();
public abstract void exitState();
}
public class State1 : State
{
public override void enterState()
{
Debug.Log("进入状态1");
}
public override void updateState()
{
Debug.Log("更新状态1");
}
public override void exitState()
{
Debug.Log("退出状态1");
}
}
public class StateMachine : MonoBehaviour
{
public State currentState;
//具体状态
public State1 state1;
public State2 state2;
public State3 state3;
public State4 state4;
public void Awake()
{
//具体状态
state1 = new State1();
state2 = new State2();
state3 = new State3();
state4 = new State4();
}
public void Update()
{
if (currentState != null)
{
currentState.updateState();
}
}
public void changeState(State newState)
{
if (currentState != null)
{
currentState.exitState();
}
currentState = newState;
newState.enterStatePre(this);
}
}
我想知道如何将此架构转换为层级状态机,仍然保持其模块化。
我有一个想法。我如果要使状态X成为状态Y和Z的父状态,我将创建一个抽象的国家X来扩展国家类,并将Y和Z作为抽象类的具体类。这意味着我可以将Y和Z的条件放在一个父状态中,可以在Y和Z之间重复编写,而不必重新编写条件。这样的好处是,我可以在500个状态中无缝使用X,而不必重写条件500次,如果是模块化的,那么我可以有任意级别的嵌套状态
父级状态X将覆盖国家中的抽象方法,实现自己的代码,并且向下级状态提供机会来实现自己的代码。您会注意到以下内容:
public class X : State
{
public override void enterState()
{
//与所有X状态相关的代码
enterSubstateX();
}
public override void updateState()
{
//与所有X状态相关的代码
//如果我们在这里有转移代码,如if (speed > s) statemachine.changeState(...),这意味着所有X下的状态都会根据这个条件发生转换,即层级状态机的本质**
updateSubstateX();
}
public override void exitState()
{
//与所有X状态相关的代码
exitSubstateX();
}
public abstract void enterSubstateX();
public abstract void updateSubstateX();
public abstract void exitSubstateX();
}
public class Y : X
{
public override void enterSubstateX()
{
//特定于Y的代码
}
public override void updateSubstateX()
{
//特定于Y的代码
//在这里的转移代码,如if (acceleration > a) ...只适用于Y的具体状态
}
public override void exitSubstateX()
{
//特定于Y的代码
}
}
评论 (0)