c# - 在状态机实现中是否有任何适当的方法来实例化状态?
问题描述
我想以编程方式统一实现一个状态机,遵循它的传统定义。我创建了一个接口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);
}
}
我认为这是一个可能的解决方案,但我不确定它是否遵循状态机设计的想法。
解决方案
推荐阅读
- kotlin - 为什么我可以在 Kotlin 中使用 Observer(adapter::submitList) 而不是 Observer { adapter.submitList(it)?
- python-3.x - 模块“tensorflow”在 Colab 中没有带有 TFANN 的属性“variable_scope”
- java - 具有自定义注释的字段的 Gson 自定义序列化
- c - typedef struct变量赋值中的typedef struct在c中不起作用
- python - 在 for 循环中使用 pandas csv_read 读取 csv 文件
- python - 如何从特定索引之前的列表中找到最大的数字?
- ffmpeg - ffmpeg:加入+交叉淡入淡出5个输入文件(视频+音频)到一个输出文件
- flutter - 用户单击后退按钮后颤振重新开始
- javascript - 环境变量反应
- python-3.x - 如何使用 Python3 以高效的方式将 .csv 文件从 S-3 存储桶上传到 Redshift 作为特定模式下的新表?