#bevy #gamedev #game

bevy_wasm_shared

在Bevy中运行WASM系统

7个版本

0.10.1 2023年3月21日
0.10.0 2023年3月6日
0.9.9 2023年2月13日
0.9.7 2022年12月30日

#436 in WebAssembly


2 个库 使用

MIT/Apache

13KB
69

Bevy WASM

使用WebAssembly修改您的Bevy游戏!

CI MIT/Apache 2.0 Crates.io
Bevy

bevy_wasm 用于游戏
bevy_wasm_sys 用于模组
bevy_wasm_shared 用于协议

请参阅 examples/cubes 了解如何使用此功能的全面示例。

更新日志

协议

我们的协议库定义了游戏和模组之间通信的两个消息类型。

[dependencies]
bevy_wasm_shared = "0.10"
serde = { version = "1.0", features = ["derive"] }
use bevy_wasm_shared::prelude::*;
use serde::{Deserialize, Serialize};

/// The version of the protocol. Automatically set from the `CARGO_PKG_XXX` environment variables.
pub const PROTOCOL_VERSION: Version = version!();

/// A message to be sent Mod -> Game.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ModMessage {
    Hello,
}

/// A message to be sent Game -> Mod.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum GameMessage {
    HiThere,
}

游戏

我们的游戏将从 bevy_wasm 中导入 WasmPlugin,并使用它来自动发送和接收与模组的消息。

[dependencies]
bevy = "0.10"
bevy_wasm = "0.10"
my_game_protocol = { git = "https://github.com/username/my_game_protocol" }
use bevy::prelude::*;
use bevy_wasm::prelude::*;
use my_game_protocol::{GameMessage, ModMessage, PROTOCOL_VERSION};

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugin(WasmPlugin::<GameMessage, ModMessage>::new(PROTOCOL_VERSION))
        .add_startup_system(add_mods)
        .add_system(listen_for_mod_messages)
        .add_system(send_messages_to_mods)
        .run();
}

fn add_mods(mut commands: Commands, asset_server: Res<AssetServer>) {
    commands.spawn(WasmMod {
        wasm: asset_server.load("some_mod.wasm"),
    });
    commands.spawn(WasmMod {
        wasm: asset_server.load("some_other_mod.wasm"),
    })
}

fn listen_for_mod_messages(mut events: EventReader<ModMessage>) {
    for event in events.iter() {
        match event {
            ModMessage::Hello => {
                println!("The mod said hello!");
            }
        }
    }
}

fn send_messages_to_mods(mut events: EventWriter<GameMessage>) {
    events.send(GameMessage::HiThere);
}

模组

我们的模组将从 bevy_wasm_sys 中导入 FFIPlugin,并使用它来自动发送和接收与游戏的邮件。

[dependencies]
bevy_wasm_sys = "0.10"
my_game_protocol = { git = "https://github.com/username/my_game_protocol" }
use bevy_wasm_sys::prelude::*;
use my_game_protocol::{GameMessage, ModMessage, PROTOCOL_VERSION};

#[no_mangle]
pub unsafe extern "C" fn build_app() {
    App::new()
        .add_plugin(FFIPlugin::<GameMessage, ModMessage>::new(PROTOCOL_VERSION))
        .add_system(listen_for_game_messages)
        .add_system(send_messages_to_game)
        .run();
}

fn listen_for_game_messages(mut events: EventReader<GameMessage>) {
    for event in events.iter() {
        match event {
            GameMessage::HiThere => {
                println!("The game said hi there!");
            }
        }
    }
}

fn send_messages_to_game(mut events: EventWriter<ModMessage>) {
    events.send(ModMessage::Hello);
}

共享资源

协议

#[derive(Resource, Default, Serialize, Deserialize)]
pub struct MyResource {
    pub value: i32,
}

游戏

App::new()
    ...
    .add_resource(MyResource { value: 0 })
    .add_plugin(
        WasmPlugin::<GameMessage, ModMessage>::new(PROTOCOL_VERSION)
            .share_resource::<MyResource>()
    )
    .add_system(change_resource_value)
    ...

fn change_resource_value(mut resource: ResMut<MyResource>) {
    resource.value += 1;
}

模组

App::new()
    ...
    .add_plugin(FFIPlugin::<GameMessage, ModMessage>::new(PROTOCOL_VERSION))
    .add_startup_system(setup)
    .add_system(print_resource_value)
    ...

fn setup(mut extern_resource: ResMut<ExternResources>) {
    extern_resources.insert::<MyResource>();
}

fn print_resource_value(resource: ExternRes<MyResource>) {
    println!("MyResource value: {}", resource.value);
}

请参阅 examples/shared_resources 了解完整示例。

路线图

游戏中的wasmtime运行时
从模组向游戏发送消息
从游戏向模组发送消息
多模组支持
时间管理
协议版本检查
外部资源
启动系统模组加载
直接更新控制
卸载模组
模组区分(事件并非广播到所有)
浏览器支持
外部查询
同步时间
模组热加载
自动组件同步

许可

Bevy WASM是免费的、开源的,且具有许可权!除非特别说明(如下或单独文件中),此仓库中的所有代码都采用以下两种许可方式之一进行双重许可

您可以选择您喜欢的许可证!这种双重许可方法在Rust生态系统中是事实标准,并且有 很好的理由 包含两者。

您的贡献

除非您明确声明,否则根据Apache-2.0许可证定义的您有意提交以包含在工作中的任何贡献,应按照上述方式双重授权,不附加任何额外条款或条件。

无运行时依赖