#input #bevy #ui #mouse-input #gamedev #game-engine #game

virtual_joystick

适用于移动游戏的Bevy虚拟摇杆

11 个稳定版本

2.3.0 2024年8月6日
2.2.0 2024年3月23日
2.1.0 2023年11月18日
2.0.1 2023年8月3日
0.1.1 2023年4月7日

#41 in 游戏开发

Download history 28/week @ 2024-07-01 1/week @ 2024-07-29 130/week @ 2024-08-05 6/week @ 2024-08-12

137 每月下载量

MIT/Apache

130KB
981

Bevy虚拟摇杆

VJoystick_Fixed_Preview


GitHub Workflow Status GitHub release (latest by date)

bevy游戏引擎中创建和使用UI虚拟摇杆。

版本

可用和兼容版本

bevy VirtualJoystick
0.14 2.3.0
0.13 2.2.0
0.12 2.1.0
0.11 2.0.1
0.10.1 1.1.2

特性

  • 支持鼠标和触摸
  • 易于使用
  • 屏幕上多个摇杆
  • 多种类型的摇杆行为
  • 跟踪摇杆上的事件(按下、拖动和向上)
  • 支持轴阻塞(水平、垂直或两者)

注意:为了编译Android项目,您可以使用cargo-apkdocker-rust-android项目容器,其中您不需要安装或准备任何SDK,更多详情请参阅移动项目的readme文件。

两者(默认) 水平 垂直
VJoystick_Fixed_Both VJoystick_Fixed_Horizontal VJoystick_Fixed_Vertical

摇杆类型

固定 浮动(默认) 动态(待修复:修复移动感觉)
VJoystick_Fixed_Both VJoystick_Floating_Both VJoystick_Dynamic_Both

示例

特性

  • inspect:用于egui检查器进行世界检查
  • serde(默认):用于所有类型的序列化支持(可用于保存和加载设置)
virtual_joystick = {
    version = "*",
    default-features = false,
    features = [ "inspect", "serde" ]
}

使用方法

有关详细信息,请查看示例

# to run example
cargo run --example simple -F=inspect

添加到Cargo.toml

[dependencies]
bevy = "0.12"
virtual_joystick = "*" # Add your version

最小要求

use bevy::prelude::*;
// import crate
use virtual_joystick::*;

// ID for joysticks
#[derive(Default, Reflect, Hash, Clone, PartialEq, Eq)]
enum JoystickControllerID {
    #[default]
    Joystick1,
    Joystick2,
}

#[bevy_main]
fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        // Add plugin to application
        .add_plugin(VirtualJoystickPlugin::<JoystickControllerID>::default())
        .run()
}

创建摇杆

#[bevy_main]
fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        // Add plugin to application
        .add_plugin(VirtualJoystickPlugin)
        // Create system
        .add_startup_system(create_scene)
        // update System
        .add_system(update_player)
        .run()
}


fn create_scene(mut cmd: Commands, asset_server: Res<AssetServer>) {
    cmd.spawn(Camera2dBundle::default());
    cmd.spawn_empty().insert(Player(30.));

    // Spawn Virtual Joystick at horizontal center
    create_joystick(
        &mut cmd,
        asset_server.load("Knob.png"),
        asset_server.load("Outline.png"),
        None,
        None,
        Some(Color::rgba(1.0, 0.27, 0.0, 0.3))),
        Vec2::new(75., 75.),
        Vec2::new(150., 150.),
        VirtualJoystickNode {
            dead_zone: 0.,
            id: "UniqueJoystick".to_string(),
            axis: VirtualJoystickAxis::Both,
            behaviour: VirtualJoystickType::Floating,
        },
        Style {
            width: Val::Px(150.),
            height: Val::Px(150.),
            position_type: PositionType::Absolute,
            left: Val::Percent(50.),
            bottom: Val::Percent(15.),
            ..default()
        },
    );
}

使用摇杆生成的变量

fn update_joystick(
    mut joystick: EventReader<VirtualJoystickEvent<String>>,
    mut player: Query<(&mut Transform, &Player)>,
    time_step: Res<Time>,
) {
    // Get player
    let (mut player, player_data) = player.single_mut();

    // Iter each joystick event
    for j in joystick.read() {
        let Vec2 { x, y } = j.axis();
        // Verify ID of joystick for movement
        match j.id() {
            JoystickControllerID::Joystick1 => {
                // Move player using joystick axis value
                player.translation.x += x * player_data.0 * time_step.delta_seconds();
                player.translation.y += y * player_data.0 * time_step.delta_seconds();
            }
        }
    }
}

待办事项

  • WIP:添加更多更好的文档

依赖项

~37–75MB
~1.5M SLoC