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 个库 使用
13KB
69 行
Bevy WASM
使用WebAssembly修改您的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是免费的、开源的,且具有许可权!除非特别说明(如下或单独文件中),此仓库中的所有代码都采用以下两种许可方式之一进行双重许可
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
- Apache许可证2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
您可以选择您喜欢的许可证!这种双重许可方法在Rust生态系统中是事实标准,并且有 很好的理由 包含两者。
您的贡献
除非您明确声明,否则根据Apache-2.0许可证定义的您有意提交以包含在工作中的任何贡献,应按照上述方式双重授权,不附加任何额外条款或条件。