12个版本

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

#238 in WebAssembly

Download history 2/week @ 2024-03-08 2/week @ 2024-03-15 56/week @ 2024-03-29 16/week @ 2024-04-05

每月70次下载

MIT/Apache

53KB
851

Bevy WASM

使用WebAssembly修改Bevy游戏!

CI MIT/Apache 2.0 Crates.io
Bevy

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

请参阅examples/cubes以获取使用此工具的综合示例。

变更日志

协议

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

[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许可证定义,您提交的任何有意包含在工作中的贡献,均应双授权如上,不得附加任何额外条款或条件。

依赖项

~21–65MB
~1M SLoC