【问题标题】:Is there a suitable pattern to combine key bindings?是否有合适的模式来组合键绑定?
【发布时间】:2022-02-03 12:31:50
【问题描述】:

在 UE4 上制作 RTS 逻辑。我可以将类方法或 lambda 绑定到“OnPressed”、“OnReleased”和“Axis”信号。考虑使用 Guarded State Machine 模式和 Command 模式来定义键连词,但没有简单的方法可以在最后一步确定最终命令。需要类似变形的东西。 例如:

LeftClick = Nothing
LeftClick + Unit under cursor = Select unit
Shift + LeftClick = Nothing
Shift + LeftClick + Unit under cursor = Add unit to selection
Shift + LeftClick + Moving cursor + Units under cursor = Add units to selection
Ctrl + LeftClick + Unit under cursor = Remove unit from selection
RightClick = Nothing
RightClick + Units selected = Move units

也许我应该使用行为树模式而不是状态机模式?但是树会很大(这个例子已经被简化了)。

【问题讨论】:

  • 嘿,有必要进一步澄清一下“在最后一步确定最终命令没有简单的方法。需要类似变形的东西。”目前,这似乎是一个输入组合问题,但“变形”和“最终命令”等不常见术语的使用使这一点变得不确定

标签: c++ design-patterns architecture unreal-engine4 game-development


【解决方案1】:

嘿,好第一个问题!为草率的回答道歉,但有几个关键点:

  1. 对于要结合使用的输入,您需要自己手动处理状态。例如,如果您希望 Ctrl 然后 LeftClick 执行与 LeftClick 不同的操作,那么您需要记住 Ctrl 是较早单击的并执行不同的行为。在实践中,这往往是...
    • 在 Ctrl OnPressed 中,将 bool 设置为 true(并且 OnReleased 将其设置为 false)
    • 在 LeftClick OnPressed 中,检查该布尔值是否为真。如果是,请执行 X 行为。否则做 Y 行为
  2. 请注意,这与您选择的设计模式无关。即,无论您使用行为树还是状态机,您都需要记住之前的键发生了什么,以便联合执行行为
  3. 最后一点 - 如果我误解了这个问题,我们深表歉意 - 但您似乎过于复杂地确定输入组合与使用给定输入集的相应行为。即,LeftClick +“光标下的单位”(假设“光标下的单位”尚未存储状态)不是来自 LeftClick 的单独输入,而是您在 LeftClick OnPressed 事件发生后检查的内容
    • 无论您选择哪种设计模式,您都需要根据编码/实现的正常情况逐案处理。即,“我的光线投射是否击中了一个单位?” -> {选择行为}会发生任何一种方式。我假设这就是您所说的“变形”和“最终命令”

【讨论】:

  • 顺便说一句,我更喜欢 ECS,它具有固有的面向数据的方法,这也使得很容易解耦互连逻辑。以易于维护的方式在其之上添加现有设计模式的变体(如状态机)也很容易 =)
  • 非常好的提示!同意,简单的决定没有灵丹妙药
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2011-09-26
相关资源
最近更新 更多