use bevy::{app::AppExit, prelude::*}; use bevy_scriptum::prelude::*; use bevy_scriptum::runtimes::rhai::prelude::*; fn main() { App::new() // This is just needed for headless console app, not needed for a regular bevy game // that uses a winit window .set_runner(move |mut app: App| { loop { app.update(); if let Some(exit) = app.should_exit() { return exit; } } }) .add_plugins(DefaultPlugins) .add_systems(Startup, startup) .add_systems(Update, call_rhai_on_update_from_rust) .add_scripting::(|runtime| { runtime.add_function(String::from("quit"), |mut exit: EventWriter| { exit.send(AppExit::Success); }); }) .run(); } fn startup(mut commands: Commands, assets_server: Res) { commands.spawn(Script::::new( assets_server.load("examples/rhai/call_function_from_rust.rhai"), )); } fn call_rhai_on_update_from_rust( mut scripted_entities: Query<(Entity, &mut RhaiScriptData)>, scripting_runtime: ResMut, ) { for (entity, mut script_data) in &mut scripted_entities { scripting_runtime .call_fn("on_update", &mut script_data, entity, ()) .unwrap(); } }