parent
928f5437fc
commit
60984220a0
15 changed files with 35 additions and 27 deletions
|
|
@ -13,9 +13,10 @@ keywords = ["bevy", "rhai", "scripting", "game", "gamedev"]
|
|||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
bevy = { default-features = false, version = "0.11.0", features = [
|
||||
bevy = { default-features = false, version = "0.12.0", features = [
|
||||
"bevy_asset",
|
||||
] }
|
||||
serde = "1.0.162"
|
||||
rhai = { version = "1.14.0", features = ["sync", "internals", "unchecked"] }
|
||||
thiserror = "1.0.40"
|
||||
anyhow = "1.0.82"
|
||||
|
|
|
|||
|
|
@ -144,6 +144,7 @@ The examples live in `examples` directory and their corresponding scripts live i
|
|||
|
||||
| bevy version | bevy_scriptum version |
|
||||
|--------------|----------------------|
|
||||
| 0.12 | 0.3 |
|
||||
| 0.11 | 0.2 |
|
||||
| 0.10 | 0.1 |
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ fn main() {
|
|||
loop {
|
||||
if let Some(app_exit_events) = app.world.get_resource_mut::<Events<AppExit>>() {
|
||||
if app_exit_event_reader
|
||||
.iter(&app_exit_events)
|
||||
.read(&app_exit_events)
|
||||
.last()
|
||||
.is_some()
|
||||
{
|
||||
|
|
@ -21,7 +21,7 @@ fn main() {
|
|||
}
|
||||
})
|
||||
.add_plugins(DefaultPlugins)
|
||||
.add_plugins(ScriptingPlugin::default())
|
||||
.add_plugins(ScriptingPlugin)
|
||||
.add_systems(Startup, startup)
|
||||
.add_systems(Update, call_rhai_on_update_from_rust)
|
||||
.add_script_function(String::from("quit"), |mut exit: EventWriter<AppExit>| {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ use bevy_scriptum::{prelude::*, Script};
|
|||
fn main() {
|
||||
App::new()
|
||||
.add_plugins(DefaultPlugins)
|
||||
.add_plugins(ScriptingPlugin::default())
|
||||
.add_plugins(ScriptingPlugin)
|
||||
.add_script_function(
|
||||
String::from("get_name"),
|
||||
|In((entity,)): In<(Entity,)>, names: Query<&Name>| {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ use bevy_scriptum::{prelude::*, Script, ScriptingRuntime};
|
|||
fn main() {
|
||||
App::new()
|
||||
.add_plugins(DefaultPlugins)
|
||||
.add_plugins(ScriptingPlugin::default())
|
||||
.add_plugins(ScriptingPlugin)
|
||||
.add_script_function(String::from("hello_bevy"), || {
|
||||
println!("hello bevy, called from script");
|
||||
})
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ struct Player;
|
|||
fn main() {
|
||||
App::new()
|
||||
.add_plugins(DefaultPlugins)
|
||||
.add_plugins(ScriptingPlugin::default())
|
||||
.add_plugins(ScriptingPlugin)
|
||||
.add_script_function(
|
||||
String::from("print_player_names"),
|
||||
|players: Query<&Name, With<Player>>| {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ use bevy_scriptum::{prelude::*, Script};
|
|||
fn main() {
|
||||
App::new()
|
||||
.add_plugins(DefaultPlugins)
|
||||
.add_plugins(ScriptingPlugin::default())
|
||||
.add_plugins(ScriptingPlugin)
|
||||
.add_systems(Startup, startup)
|
||||
.run();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ use rhai::ImmutableString;
|
|||
fn main() {
|
||||
App::new()
|
||||
.add_plugins(DefaultPlugins)
|
||||
.add_plugins(ScriptingPlugin::default())
|
||||
.add_plugins(ScriptingPlugin)
|
||||
.add_script_function(String::from("fun_without_params"), || {
|
||||
println!("called without params");
|
||||
})
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ use bevy_scriptum::{prelude::*, Script};
|
|||
fn main() {
|
||||
App::new()
|
||||
.add_plugins(DefaultPlugins)
|
||||
.add_plugins(ScriptingPlugin::default())
|
||||
.add_plugins(ScriptingPlugin)
|
||||
.add_script_function(String::from("hello_bevy"), || {
|
||||
println!("hello bevy, called from script");
|
||||
})
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ use bevy_scriptum::{prelude::*, Script};
|
|||
fn main() {
|
||||
App::new()
|
||||
.add_plugins(DefaultPlugins)
|
||||
.add_plugins(ScriptingPlugin::default())
|
||||
.add_plugins(ScriptingPlugin)
|
||||
.add_script_function(String::from("hello_bevy"), hello_bevy_callback_system)
|
||||
.add_systems(Startup, startup)
|
||||
.run();
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ struct Player;
|
|||
fn main() {
|
||||
App::new()
|
||||
.add_plugins(DefaultPlugins)
|
||||
.add_plugins(ScriptingPlugin::default())
|
||||
.add_plugins(ScriptingPlugin)
|
||||
.add_script_function(
|
||||
String::from("get_player_name"),
|
||||
|player_names: Query<&Name, With<Player>>| player_names.single().to_string(),
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ fn main() {
|
|||
loop {
|
||||
if let Some(app_exit_events) = app.world.get_resource_mut::<Events<AppExit>>() {
|
||||
if app_exit_event_reader
|
||||
.iter(&app_exit_events)
|
||||
.read(&app_exit_events)
|
||||
.last()
|
||||
.is_some()
|
||||
{
|
||||
|
|
@ -24,7 +24,7 @@ fn main() {
|
|||
}
|
||||
})
|
||||
.add_plugins(DefaultPlugins)
|
||||
.add_plugins(ScriptingPlugin::default())
|
||||
.add_plugins(ScriptingPlugin)
|
||||
.add_systems(Startup, startup)
|
||||
.add_systems(Update, print_entity_names_and_quit)
|
||||
.add_script_function(String::from("spawn_entity"), spawn_entity)
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
use bevy::{
|
||||
asset::{AssetLoader, LoadContext, LoadedAsset},
|
||||
asset::{io::Reader, Asset, AssetLoader, AsyncReadExt as _, LoadContext},
|
||||
reflect::{TypePath, TypeUuid},
|
||||
utils::BoxedFuture,
|
||||
};
|
||||
use serde::Deserialize;
|
||||
|
||||
/// A script that can be loaded by the [crate::ScriptingPlugin].
|
||||
#[derive(Debug, Deserialize, TypeUuid, TypePath)]
|
||||
#[derive(Asset, Debug, Deserialize, TypeUuid, TypePath)]
|
||||
#[uuid = "3ed4b68b-4f5d-4d82-96f6-5194e358921a"]
|
||||
pub struct RhaiScript(pub String);
|
||||
|
||||
|
|
@ -15,15 +15,22 @@ pub struct RhaiScript(pub String);
|
|||
pub struct RhaiScriptLoader;
|
||||
|
||||
impl AssetLoader for RhaiScriptLoader {
|
||||
type Asset = RhaiScript;
|
||||
type Settings = ();
|
||||
type Error = anyhow::Error;
|
||||
|
||||
fn load<'a>(
|
||||
&'a self,
|
||||
bytes: &'a [u8],
|
||||
load_context: &'a mut LoadContext,
|
||||
) -> BoxedFuture<'a, Result<(), bevy::asset::Error>> {
|
||||
reader: &'a mut Reader,
|
||||
_settings: &'a Self::Settings,
|
||||
_load_context: &'a mut LoadContext,
|
||||
) -> BoxedFuture<'a, anyhow::Result<RhaiScript, anyhow::Error>> {
|
||||
Box::pin(async move {
|
||||
let mut bytes = Vec::new();
|
||||
reader.read_to_end(&mut bytes).await?;
|
||||
|
||||
let rhai_script = RhaiScript(String::from_utf8(bytes.to_vec())?);
|
||||
load_context.set_default_asset(LoadedAsset::new(rhai_script));
|
||||
Ok(())
|
||||
Ok(rhai_script)
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
//! ⚠️ **Pre-release, alpha version**: API is bound to change, bugs are to be expected.
|
||||
//!
|
||||
//! bevy_scriptum is a a plugin for [Bevy](https://bevyengine.org/) that allows you to write some of your game logic in a scripting language.
|
||||
//! Currently, only [Rhai](https://rhai.rs/) is supported, but more languages may be added in the future.
|
||||
//!
|
||||
|
|
@ -144,6 +142,7 @@
|
|||
//!
|
||||
//! | bevy version | bevy_scriptum version |
|
||||
//! |--------------|----------------------|
|
||||
//! | 0.12 | 0.3 |
|
||||
//! | 0.11 | 0.2 |
|
||||
//! | 0.10 | 0.1 |
|
||||
//!
|
||||
|
|
@ -218,8 +217,8 @@ pub struct ScriptingPlugin;
|
|||
|
||||
impl Plugin for ScriptingPlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
app.add_asset::<RhaiScript>()
|
||||
.init_asset_loader::<RhaiScriptLoader>()
|
||||
app.register_asset_loader(RhaiScriptLoader)
|
||||
.init_asset::<RhaiScript>()
|
||||
.init_resource::<Callbacks>()
|
||||
.insert_resource(ScriptingRuntime::default())
|
||||
.add_systems(Startup, init_engine.pipe(log_errors))
|
||||
|
|
|
|||
|
|
@ -48,10 +48,10 @@ pub(crate) fn reload_scripts(
|
|||
mut ev_asset: EventReader<AssetEvent<RhaiScript>>,
|
||||
mut scripts: Query<(Entity, &mut Script)>,
|
||||
) {
|
||||
for ev in ev_asset.iter() {
|
||||
if let AssetEvent::Modified { handle } = ev {
|
||||
for ev in ev_asset.read() {
|
||||
if let AssetEvent::Modified { id } = ev {
|
||||
for (entity, script) in &mut scripts {
|
||||
if script.script == *handle {
|
||||
if script.script.id() == *id {
|
||||
commands.entity(entity).remove::<ScriptData>();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue