bevy_wasm
Mod your Bevy games with WebAssembly!
See examples/cubes for a comprehensive example of how to use this.
Protocol
Our protocol crate defines the two message types for communicating between the game and mods.
use serde::{Deserialize, Serialize};
#[derive(Clone, Serialize, Deserialize, Debug)]
pub enum ModMessage {
Hello,
}
#[derive(Clone, Serialize, Deserialize, Debug)]
pub enum GameMessage {
HiThere,
}
Game
Our game will import WasmPlugin
from bevy_wasm
, and use it to automatically send and receive messages with the mods.
use bevy::prelude::*;
use bevy_wasm::WasmPlugin;
use my_games_protocol::{GameMessage, ModMessage};
fn main() {
App::build()
.add_plugins(DefaultPlugins)
.add_plugin(WasmPlugin::<GameMessage, ModMessage>::default())
.add_system(listen_for_mod_messages)
.add_system(send_messages_to_mods)
.run();
}
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);
}
Mod
Our mod will import FFIPlugin
from bevy_wasm_sys
, and use it to automatically send and receive messages with the game.
use bevy_wasm_sys::prelude::*;
use my_games_protocol::{GameMessage, ModMessage};
#[no_mangle]
pub unsafe extern "C" fn build_app() {
App::new()
.add_plugin(FFIPlugin::<GameMessage, ModMessage>::default())
.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);
}