A straightforward but robust input-action manager for Bevy.
Inputs from various input sources (keyboard, mouse and gamepad) are collected into a common ActionState
on your player entity,
which can be conveniently used in your game logic.
The mapping between inputs and actions is many-to-many, and easily configured and extended with the InputMap
components on each player entity.
A single action can be triggered by multiple inputs (or set directly by UI elements or gameplay logic),
and a single input can result in multiple actions being triggered, which can be handled contextually.
InputMap
component
Keybindings<KeyCode>
, Keybindings<Gamepad>
headachesActionState
component
input_map.insert(Action::Jump, KeyCode::Space)
XOR input_map.insert(Action::Jump, GamepadButtonType::South)
? Have both!input_map.insert_chord(Action::Console, [KeyCode::LCtrl, KeyCode::Shift, KeyCode::C])
ClashStrategy
enum: stop triggering individual buttons when you meant to press a chord!ActionDiff
representation to send on the wireapp.send_input(KeyCode::B)
or world.send_input(UserInput::chord([KeyCode::B, KeyCode::E, KeyCode::V, KeyCode::Y])
#![forbid(missing_docs)]
Button
enum only includes KeyCode
, MouseButton
and GamepadButtonType
.
bevy::input::Input
ActionState
are pub
: it's designed to be hooked into and extended.Gamepads
resource and use InputMap::set_gamepad
.Development occurs on the dev
branch, which is merged into main
on each release.
This ensures the examples are in-sync with the latest release.
leafwing-input-manager
to your Cargo.toml
.Actionlike
trait for it.InputManagerPlugin
to your App
.InputManagerBundle
to your player entity (or entities!).InputMap
component on your player entity.ActionState
component on your player entity to check the collected input state!Use cargo run
.
This repo is set up to always build with full optimizations, so there's no need for a --release
flag in most cases.
Dynamic linking is enabled to ensure build times stay snappy.
To run an example, use cargo run --example_name
, where example_name
is the file name of the example without the .rs
extension.