【发布时间】:2021-07-26 23:17:47
【问题描述】:
我正在开发一个 Unity 中的状态机实现 (c#),计划主要用于 AI 相关的事情。
我不确定我应该如何处理各种“输入”/它应该如何与来自外部环境的知识交互。到目前为止,我考虑并尝试了两种方法:
1,我有一个专门的“查询”类,其中包含各种布尔值。在每个状态的 Tick() 方法结束时,我都会进行一些检查,例如
if (queries.JumpUp) { SetState(JumpState); }
负责切换状态。要更改状态,我只需将 bool 设置为 true。 这似乎工作正常,在“查询”和结果行为之间创建了一个非常松散的关系,并让我将几乎所有的转换逻辑放在一个专用方法中(我的基本 Tick() 方法在其调用 CheckForTransitions() 方法结束,这是我覆盖并放入所有转换逻辑的方法)。 到目前为止它运行良好,但我有点担心这种类型的逻辑可能有点太松散了。
2、为我想要处理的所有可能的“事件”创建虚拟方法。
public override void TryJump() { SetState(JumpState); }
为了改变状态,我显式调用了上面的方法(或一些围绕它的包装,在 StateMachine 中实现)。
这似乎也可以正常工作。与 1 相比,我可以看到一些轻微的负面影响: 我不能再依赖每帧最多进行一次转换这一事实,我也不能依赖这种转换将在帧结束时发生的事实。 我在代码中没有一个好地方可以准确地检查可能发生的排序转换以及它们的条件。 对于每个“TryJump”方法,我必须为每个状态提供大量虚拟方法。这可能是过早的优化(1,我只覆盖“CheckForTransitions()”)。
尽管如此,对 1 中的方法感觉有些不对劲 - 使用这样的布尔值似乎有点奇怪。
【问题讨论】:
-
这是一个有趣的问题,但可能更适合Software Engineering。
-
我同意,对于 SE 来说更好的问题。通常状态的变化是对动作的响应,而不是通过评估布尔值来触发。
-
查看github.com/IanMercer/Abodit.StateMachine 了解我如何处理此问题的示例。
-
public override void TryJump() SetState(JumpState)不是有效的 C#。你的意图是什么?