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
每月70次下载
53KB
851 行
Bevy WASM
使用WebAssembly修改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是免费、开源的,并且具有许可权!除非另有说明(以下和/或单个文件中),本仓库中的所有代码都根据您的选择以以下两种方式之一双重许可
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
- Apache许可证,版本2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
这意味着您可以选择您喜欢的许可证!这种双重许可方法是Rust生态系统的既定标准,并且有非常好的理由包含两者。
您的贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您提交的任何有意包含在工作中的贡献,均应双授权如上,不得附加任何额外条款或条件。
依赖项
~21–65MB
~1M SLoC