1 个稳定版本
1.0.0 | 2022年5月21日 |
---|
#2139 在 游戏开发
25KB
206 行
Bevy_Keybind
这是Bevy游戏引擎的一个辅助插件。它添加了类似虚幻引擎的按键绑定功能,在现有的引擎级输入功能之上。
使用案例
Bevy引擎以这种方式分离了类似的概念,我们无法在Rust代码中通用:例如,KeyCode
和 MouseButton
是完全不同的概念,但在我们的项目中,我们需要能够为任何一个匿名分配某种游戏动作。因此,我们需要为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文件中指定的字符串做出反应!您甚至可以更进一步,让每个字符串(例如MoveForward
、LookRight
等)成为一个枚举,然后将枚举映射到实际的游戏动作。
依赖关系
~14MB
~300K SLoC