#events #input #bevy #logic #separate #input-event #action

bevy_keybind

bevy_input的通用事件接口,以便我们更好地将逻辑与配置分离

1 个稳定版本

1.0.0 2022年5月21日

#2139游戏开发

MIT/Apache

25KB
206

Bevy_Keybind

这是Bevy游戏引擎的一个辅助插件。它添加了类似虚幻引擎的按键绑定功能,在现有的引擎级输入功能之上。

使用案例

Bevy引擎以这种方式分离了类似的概念,我们无法在Rust代码中通用:例如,KeyCodeMouseButton 是完全不同的概念,但在我们的项目中,我们需要能够为任何一个匿名分配某种游戏动作。因此,我们需要为KeyCode类型编写一个处理器,然后有效地复制粘贴相同的逻辑,以便它也可以支持MouseButton类型。

通常在这里可以使用trait,但我们不能使用它,因为Bevy引擎不支持将Traits用作组件,因此事件和查询等事物在那里不兼容。

因此,我们通过这个项目解决的痛点是,作为开发者,我们应该能够将输入逻辑与游戏逻辑分离。

我们为此提供的解决方案是利用Bevy引擎的事件功能,使得所有不同类型的设备输入都将在统一输入概念下广播,因此我们不会直接对输入事件做出反应,而是对“键绑定”事件做出反应,我们可以在YAML文件中定义和配置这些事件。

如何使用

只需创建一个具有以下规范的YAML文件,将KeyBindPlugin添加到您的项目中,它就会根据您的配置自动在按下给定键时发出动作事件!

示例YAML文件

actions:
  W: MoveForward
  A: MoveLeft
  S: MoveBack
  D: MoveRight
  C: Crouch
  Mouse1: Fire
  Mouse2: Zoom
  Mouse3: PushToTalk

axes:
  MouseX: LookRight
  MouseY: LookUp

事件类型actions:发出三种类型的事件

  • KeyBindActionJustPressedEvent
  • KeyBindActionPressedEvent
  • KeyBindActionJustReleasedEvent

事件类型axes:发出一种类型的事件

  • KeyBindAxisEvent(包含一个f32的有效负载,表示轴运动的幅度)。

因此,使用上述按键绑定示例,每次您按下并释放键盘上的W按钮时,您都可以预期上述每个KeyBindAction...事件都会广播,其中有效负载为MoveForward,类型为String

优点

从这个设计中我们得到的好处是,您可以分离游戏逻辑和用户输入,并允许用户通过YAML文件自行配置!

更具体地说,您可以在您的ECS系统中使用这些EventReader<KeyBind...Event>,并根据事件做出相应的反应。这样,您就不必在游戏逻辑中硬编码特定的键码等。相反,您只需设置游戏以对您在YAML文件中指定的字符串做出反应!您甚至可以更进一步,让每个字符串(例如MoveForwardLookRight等)成为一个枚举,然后将枚举映射到实际的游戏动作。

依赖关系

~14MB
~300K SLoC