#hot-reload #bevy #ui #game-engine

dexterous_developer_internal

A modular hot reload system for rust

7 releases

0.2.0 Feb 18, 2024
0.1.0 Dec 2, 2023
0.0.12 Nov 16, 2023
0.0.11 Sep 26, 2023

#25 in #hot-reload

MIT/Apache

71KB
1.5K SLoC

Dexterous Developer

GitHub Workflow Status (with event) GitHub Workflow Status (with event) crates.io cli Static Badge

An experimental hot reload system for the bevy game engine. Inspired by DGriffin91's Ridiculous bevy hot reloading - adding the ability to re-load arbitrary systems, and the ability to transform resource/component structures over time.

Fuller documentation is available at: https://lee-orr.github.io/dexterous_developer/

Features

  • Define the reloadable areas of your game explicitly - which can include systems, components, states, events and resources (w/ some limitations)
  • Reset resources to a default or pre-determined value upon reload
  • Serialize/deserialize your reloadable resources & components, allowing you to evolve their schemas so long as they are compatible with the de-serializer (using rmp_serde)
  • Mark entities to get removed on hot reload
  • Run systems after hot-reload
  • Create functions to set up & tear down upon either entering/exiting a state or on hot reload
  • Only includes any hot reload capacity in your build when you explicitly enable it - such as by using the CLI launcher
  • Cross-platform/cross-device hot reload - run a "hot reload server" on a development environment, and execute the application elsewhere. For best results, the dev environment should be a linux device or a Linux-based development container, but it can be configured to work directly on windows or mac as well - albeit less reliably. Support for cross-compilation directly on windows/mac is not a priority, since those can always be set up to host a docker-in-docker environment with linux, which is confirmed to work. This feature does not work in the current version, but will be re-implemented in the future

Known issues

  • Won't work on mobile or WASM

Installation

Grab the CLI by running: cargo install dexterous_developer_cli.

You'll be able to run the dexterous version of your code by running dexterous_developer_cli run in your terminal.

In your Cargo.toml add the following:

[lib]
name = "lib_THE_NAME_OF_YOUR_GAME"
path = "src/lib.rs"
crate-type = ["rlib"]

[dependencies]
bevy = "0.13"
dexterous_developer = "0.1.1"
serde = "1" # If you want the serialization capacities

[package.metadata]
hot_reload_features = ["bevy/dynamic_linking", "bevy/embedded_watcher"] # this injects these features into the build, enabling the use of bevy's dynamic linking and asset hot reload capacity.

If your game is not a library yet, move all your main logic to lib.rs rather than main.rs. Then, in your main.rs - call the bevy_main function:

fn main() {
    lib_NAME_OF_YOUR_GAME::bevy_main();
}

and in your lib.rs, your main function should become:

#[hot_bevy_main]
pub fn bevy_main(initial_plugins: impl InitialPlugins) {
    App::new()
        .add_plugins(initial_plugins.initialize::<DefaultPlugins>()) // You can use either DefaultPlugins or MinimnalPlugins here, and use "set" on this as you would with them
    // Here you can do what you'd normally do with app
    // ... and so on
}

If you have a plugin where you want to add reloadable elements, add the following in the file defining the plugin:


impl Plugin for MyPlugin {
    fn build(&self, app: &mut App) {
        app
            .setup_reloadable_elements::<reloadable>();
    }
}

#[dexterous_developer_setup]
fn reloadable(app: &mut ReloadableAppContents) {
    app
        .add_systems(Update, this_system_will_reload);
}

Bevy Version Support

Bevy Dexterous Developer
0.13 >= 0.2
0.12 0.0.12, 0.1
0.11 <= 0.0.11

Dependencies

~2–14MB
~195K SLoC