以下是对您的翻译结果:

下面的内容是简单而模块化的状态机架构。我只将简单状态机模型概括为"状态",即具体状态如"状态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的代码
    }
}