首页 > 解决方案 > 在状态机实现中是否有任何适当的方法来实例化状态?

问题描述

我想以编程方式统一实现一个状态机,遵循它的传统定义。我创建了一个接口IState和一个接口IStateMachine

public interface IState {
    GameObject Entity {set;get;}
    IStateMachine SM {set;get;}
    void OnEnterState();
    void OnStayAtState();
    void OnExitState();
}

public interface IStateMachine {
    IState CurState { get; }
    bool SwitchTo(string name);
    void Reset();
}

我计划在机器中维护一个字典(k:状态名称字符串,v:IState),以便我可以按名称切换不同的状态。但我不知道如何实例化状态并将它们正确放入字典中。

我有许多状态,包括Moving, Attacking, Sleeping,其中一些具有复杂的实现。我想我在实例化状态机的时候可以一起实例化它们,但这似乎不是一个好主意。我希望机器可以做一些像惰性实例化这样的事情:

    public void SwitchTo(string name) {
        if (_states.ContainsKey(name)) {
            // Switch current state as name
        } else {
            // Do State Instantiation here and put it in dictionary
            // then switch
        }

我不知道如何实现这一点。C# 有什么方法可以保留类的信息或构造函数吗,我希望我可以保留一个静态只读字典,例如

Dictionary<string, Class> _stateList;
_stateList[stateName]::constructor();

编辑: 我想了一个方法。我将实例化的职责转换IState为特定状态,然后将其注册到状态机,例如:(in WalkingState

void Rest() {
      if(!SM.SwitchStateByName("rest")){
           // Rest state isn't instantiated as far
           IState Rest = new RestState();
           SM.AddState(Rest); // register
           SM.SwitchToState(Rest);
     }
}

我认为这是一个可能的解决方案,但我不确定它是否遵循状态机设计的想法。

标签: c#unity3d

解决方案


推荐阅读