#input #action #bevy #gamepad #processing #mapping #manager

leafwing-input-manager

为 Bevy 游戏引擎提供的一种强大、灵活且人体工程学的动作输入键绑定管理方式

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游戏开发

Download history 1195/week @ 2024-05-02 962/week @ 2024-05-09 1063/week @ 2024-05-16 981/week @ 2024-05-23 1003/week @ 2024-05-30 851/week @ 2024-06-06 983/week @ 2024-06-13 1029/week @ 2024-06-20 803/week @ 2024-06-27 832/week @ 2024-07-04 1177/week @ 2024-07-11 1370/week @ 2024-07-18 1885/week @ 2024-07-25 1721/week @ 2024-08-01 2171/week @ 2024-08-08 1321/week @ 2024-08-15

7,271 每月下载量
14 crates 使用

MIT/Apache

500KB
9K SLoC

关于

Crates.io docs.rs

为 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

入门

  1. leafwing-input-manager 添加到你的 Cargo.toml
  2. 创建一个枚举来表示你想要表示的逻辑动作,并为其推导 Actionlike 特性。
  3. InputManagerPlugin 添加到你的 App
  4. InputManagerBundle 添加到你的玩家实体(或实体!)。
  5. 通过修改玩家实体上的 InputMap 组件来配置你的输入与动作之间的映射。
  6. 读取玩家实体上的 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