32 个版本 (14 个重大变更)
0.15.0 | 2024 年 8 月 8 日 |
---|---|
0.14.0 | 2024 年 7 月 7 日 |
0.13.3 | 2024 年 2 月 23 日 |
0.11.2 | 2023 年 12 月 2 日 |
0.2.0 | 2022 年 2 月 9 日 |
#6 在 游戏开发
7,271 每月下载量
被 14 crates 使用
500KB
9K SLoC
关于
为 Bevy 提供的一个简单但健壮的输入动作管理器。
来自各种输入源(键盘、鼠标和游戏手柄)的输入被收集到玩家实体上的公共 ActionState
中,这可以在你的游戏逻辑中方便地使用。
输入和动作之间的映射是多对多,并且可以通过每个玩家实体上的 InputMap
组件轻松配置和扩展。单个动作可以由多个输入触发(或由 UI 元素或游戏逻辑直接设置),单个输入可以触发多个动作,这可以根据上下文进行处理。
支持的 Bevy 版本
Bevy | leafwing-input-manager |
---|---|
0.14 | 0.14..0.15 |
0.13 | 0.13 |
0.12 | 0.11..0.12 |
0.11 | 0.10 |
0.10 | 0.9 |
0.9 | 0.7..0.8 |
特性
- 对按钮样式和轴输入的完整键盘、鼠标和游戏手柄支持
- 对来自游戏手柄和游戏手柄的模拟输入的双轴支持
- 对死区、灵敏度和夹具的易于使用的轴处理
- 将任意按钮输入绑定到虚拟 D-Pad
- 使用一个简单的组件轻松地将 UI 按钮连接到游戏状态!
- 点击按钮时,将按相应的实体上的适当动作进行按下
- 将所有输入映射存储在单个
InputMap
组件中- 不再有定制的
Keybindings<KeyCode>
、Keybindings<Gamepad>
烦恼
- 不再有定制的
- 在单个
ActionState
组件中查找当前输入状态- 那烦人的最大 16 个系统参数让你头疼?再见了,那个输入处理超级系统
- 人体工程学插入 API,无缝融合多种输入类型
- 在
input_map.insert(Action::Jump, KeyCode::Space)
和input_map.insert(Action::Jump, GamepadButtonType::South)
之间无法做出决定?两者都支持!
- 在
- 完全支持任意按钮组合:随心所欲地弹奏和弦。
input_map.insert(Action::控制台, ButtonlikeChord::new([KeyCode::ControlLeft, KeyCode::Shift, KeyCode::KeyC]))
- 使用
ClashStrategy
枚举实现复杂的输入去歧义:当你想要按和弦时,停止触发单个按钮! - 通过添加多个此插件的副本,创建任意数量的强类型不交集动作集:解耦你的摄像机和玩家状态
- 本地多人游戏支持:自由地将键绑定到不同的实体,而不是担心全局状态的唯一性
- 网络多人游戏支持:可序列化的结构体,以及节省空间的
ActionDiff
表示,以便在网络上发送 - 强大的易于使用的输入模拟 API,用于集成测试你的 Bevy 应用程序
- 控制此插件活跃的状态:在菜单中时停止四处游荡!
- Leafwing Studio 的标志性
#![forbid(missing_docs)]
限制
- 必须手动将游戏手柄分配给每个输入映射:从
Gamepads
资源读取并使用InputMap::set_gamepad
。
入门
- 将
leafwing-input-manager
添加到你的Cargo.toml
。 - 创建一个枚举来表示你想要表示的逻辑动作,并为其推导
Actionlike
特性。 - 将
InputManagerPlugin
添加到你的App
。 - 将
InputManagerBundle
添加到你的玩家实体(或实体!)。 - 通过修改玩家实体上的
InputMap
组件来配置你的输入与动作之间的映射。 - 读取玩家实体上的
ActionState
组件以检查收集到的输入状态!
use bevy::prelude::*;
use leafwing_input_manager::prelude::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
// This plugin maps inputs to an input-type agnostic action-state
// We need to provide it with an enum which stores the possible actions a player could take
.add_plugins(InputManagerPlugin::<Action>::default())
// The InputMap and ActionState components will be added to any entity with the Player component
.add_systems(Startup, spawn_player)
// Read the ActionState in your systems using queries!
.add_systems(Update, jump)
.run();
}
// This is the list of "things in the game I want to be able to do based on input"
#[derive(Actionlike, PartialEq, Eq, Hash, Clone, Copy, Debug, Reflect)]
enum Action {
Run,
Jump,
}
#[derive(Component)]
struct Player;
fn spawn_player(mut commands: Commands) {
// Describes how to convert from player inputs into those actions
let input_map = InputMap::new([(Action::Jump, KeyCode::Space)]);
commands
.spawn(InputManagerBundle::with_map(input_map))
.insert(Player);
}
// Query for the `ActionState` component in your game logic systems!
fn jump(query: Query<&ActionState<Action>, With<Player>>) {
let action_state = query.single();
// Each action has a button-like state of its own that you can check
if action_state.just_pressed(&Action::Jump) {
println!("I'm jumping!");
}
}
此片段是从 examples
文件夹中的 minimal.rs
示例:请在那里查找更多深入的学习材料!
存储库功能标志
请参阅 Cargo.toml
中的 [features]
部分,了解有关可用存储库功能的详细信息。
依赖关系
~39–77MB
~1.5M SLoC