#bevy #editor #pls #windows

bevy_editor_pls_default_windows

In-App editor tools for bevy apps

10 releases (breaking)

new 0.8.0 Feb 21, 2024
0.7.0 Dec 27, 2023
0.6.0 Nov 10, 2023
0.5.0 Oct 13, 2023
0.1.1 Aug 20, 2022

#1867 in Game dev

Download history 476/week @ 2023-11-03 517/week @ 2023-11-10 564/week @ 2023-11-17 567/week @ 2023-11-24 381/week @ 2023-12-01 532/week @ 2023-12-08 572/week @ 2023-12-15 507/week @ 2023-12-22 468/week @ 2023-12-29 623/week @ 2024-01-05 667/week @ 2024-01-12 665/week @ 2024-01-19 643/week @ 2024-01-26 508/week @ 2024-02-02 637/week @ 2024-02-09 972/week @ 2024-02-16

2,818 downloads per month
Used in bevy_editor_pls

MIT/Apache

115KB
2.5K SLoC

bevy_editor_pls

⚠️ This is very much work in progress: Take a look at the missing features to see if your use case isn't yet supported.

Adds debug tools to your bevy game, including

  • hierarchy view and component inspector
  • separate editor camera
  • some builtin editor panels for diagnostics, debug settings
  • scene export

This is not, and isn't meant to be, comparable to the actual editor bevy will end up with. bevy_editor_pls attempts to get the low hanging fruits by adding editor UI to the game executable, without having all the complexity that comes with having a proper well-designed editor architecture.

How to use:

Add the EditorPlugin:

+use bevy_editor_pls::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
+       .add_plugins(EditorPlugin::default())
        ...
        .run();
}

editor preview

Custom editor panels

use bevy_editor_pls::{egui, prelude::*};
use bevy_editor_pls_core::editor_window::{EditorWindow, EditorWindowContext};

fn main() {
    App::new()
        ...
        .add_editor_window::<MyEditorWindow>()
        ...
        .run();
}

pub struct MyEditorWindow;
struct MyEditorWindowState {
}
impl EditorWindow for MyEditorWindow {
    type State = MyEditorWindowState;
    const NAME: &'static str = "Another editor panel";

    fn ui(world: &mut World, cx: EditorWindowContext, ui: &mut egui::Ui) {
        let currently_inspected = &cx.state::<MyEditorWindow>().unwrap().selected;

        ui.label("Anything can go here");
    }
}

Controls

The default controls are:

  • E to toggle the editor
  • Ctrl+Enter to pause/unpause time
  • F to focus selected entity
  • T/R/S to show translate/rotate/scale gizmo
  • Double click on the menu bar to go fullscreen

Cameras:

  • 2d (Pan/Zoom): any mouse button to pan, scroll to zoom
  • 3d (Free): WASD + Ctrl/Shift + Shift for a speed boost for the free 3d camera
  • 3d (Pan/Orbit): Right click to rotate around focus, Middle mouse button to pan
Changing the default controls
use bevy_editor_pls::EditorPlugin;
use bevy_editor_pls::controls;
use bevy_editor_pls_default_windows::hierarchy::picking::EditorRayCastSource;

fn main() {
    App::new()
        // ..
        .add_plugin(EditorPlugin)
        .insert_resource(editor_controls())
        .add_startup_system(set_cam3d_controls)
        // ..
        .run();
}

fn editor_controls() -> EditorControls {
    let mut editor_controls = EditorControls::default_bindings();
    editor_controls.unbind(controls::Action::PlayPauseEditor);

    editor_controls.insert(
        controls::Action::PlayPauseEditor,
        controls::Binding {
            input: controls::UserInput::Single(controls::Button::Keyboard(KeyCode::Escape)),
            conditions: vec![controls::BindingCondition::ListeningForText(false)],
        },
    );

    editor_controls
}

fn set_cam3d_controls(
    mut query: Query<&mut bevy_editor_pls::default_windows::cameras::camera_3d_free::FlycamControls>,
) {
    let mut controls = query.single_mut();
    controls.key_up = KeyCode::Q;
    controls.key_down = KeyCode::E;
}

Missing features

  • scene import
  • visualization of invisible entities in editor (to see where the camera is for example)

Bevy support table

bevy bevy_editor_pls
0.13 0.8
0.12 0.7
0.12 0.6
0.11 0.5
0.10 0.4
0.10 0.3
0.9 0.2
0.8 0.1

Dependencies

~46–88MB
~1.5M SLoC