#scripting #bevy #gamedev #wasm

bevy_wasm_scripting

为Bevy添加对wasm/wat资产的支持,并启用简单的脚本编写

2个不稳定版本

0.2.0 2023年4月24日
0.1.0 2022年12月20日

#1546 in 游戏开发

MIT许可证

48KB
715

bevy_wasm_scripting

为Bevy添加对wasm/wat资产的支持,并启用简单的脚本编写。这是通过wasmer包实现的。

  • 准备公开使用。这是一个非常实验性的版本!请在Bevy Discord中分享任何反馈!
  • 通过Bevy资产管理管理的脚本
  • 附加到组件的脚本
  • 附加到资源的脚本
  • 基于组件和资源的脚本的即时重新加载
  • 基本示例
  • 使基于资源和组件的脚本一致,因为它们都可以更简单地进行定义。
  • 通过游戏项目来检验,以找到痛点
  • 确认WorldPointer导入策略的安全性。
  • 研究编译性能和多线程选项。
  • 研究内存使用。
  • 研究与Web构建的合作。
  • 为Wasmer Tunables配置
  • 为Wasmer编译器配置。(目前硬编码为Cranelift编译器。)
  • 示例游戏(可能是一个带有奖励的 breakout 克隆)
  • Rust -> wasm 脚本示例
  • Lua -> wasm 脚本示例
  • 其他语言示例?

示例

对于基于组件的脚本

fn main() {
    App::new()
    ...
        .add_plugin(WasmPlugin)
        .add_wasm_script_component::<AdderScript>()
        .add_startup_system(spawn_script_entity)
        .add_system(call_script_on_entity)
    ...
}

impl WasmScriptComponent for AdderScript {
    type ImportQueriedComponents = ();
    type ImportResources = ();
    fn get_wasm_script_handle(&self) -> &Handle<WasmScript> {
        &self.handle
    }
}

fn spawn_script_entity(mut commands: Commands, asset_server: Res<AssetServer>) {
    commands.spawn(AdderScript {
        handle: asset_server.load("add_one.wat"),
        accumulator: 0,
    });
}

// 
fn call_script_on_entity(
    mut scripted_entities: Query<&mut AdderScript>,
    mut script_env: WasmScriptComponentEnv<AdderScript>,
) {
    for mut scripted_entity in scripted_entities.iter_mut() {
        if let Ok(new_val) = script_env.call_if_instantiated(
            &scripted_entity.handle,
            "main",
            scripted_entity.accumulator,
        ) {
            scripted_entity.accumulator = new_val;
        }
        println!("Accumulated value: {}", scripted_entity.accumulator);
    }
}

更多示例,包括热加载、基于资源的脚本和脚本导入,可以在示例目录中找到。

Web 构建示例

您可以使用与bevy示例非常相似的 breakout 示例来运行

cargo build --release --example breakout --target wasm32-unknown-unknown --features js --no-default-features
wasm-bindgen --out-name wasm_example   --out-dir examples/wasm/target   --target web target/wasm32-unknown-unknown/release/examples/breakout.wasm
basic-http-server examples/wasm

依赖关系

~21–59MB
~1M SLoC