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 游戏开发
137 每月下载量
130KB
981 行
Bevy虚拟摇杆
在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-apk或docker-rust-android项目容器,其中您不需要安装或准备任何SDK,更多详情请参阅移动项目的readme文件。
轴
两者(默认) | 水平 | 垂直 |
---|---|---|
摇杆类型
固定 | 浮动(默认) | 动态(待修复:修复移动感觉) |
---|---|---|
示例
特性
- 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