bevy_mod_ffi

Crates.iobevy_mod_ffi
lib.rsbevy_mod_ffi
version0.2.0
created_at2025-12-30 21:56:58.26699+00
updated_at2026-01-07 03:58:45.501905+00
descriptionFFI utilities for Bevy
homepagehttps://github.com/matthunz/bevy_mod_ffi
repositoryhttps://github.com/matthunz/bevy_mod_ffi
max_upload_size
id2013377
size156,803
Matt Hunzinger (matthunz)

documentation

https://docs.rs/bevy_mod_ffi

README

bevy_mod_ffi

License Crates.io Downloads Docs CI

Client

use bevy_mod_ffi::prelude::*;
use bevy_mod_ffi_example_core::{Damage, Health};

#[repr(C)]
#[derive(SharedComponent, Clone, Copy, Debug, Zeroable, Pod, TypePath)]
struct Zombie;

#[bevy_mod_ffi::main]
fn main(world: &mut World) {
    world.register_component::<Zombie>();

    world
        .spawn((Zombie, Health { current: 100. }))
        .observe(|event: OnEntity<Damage>, mut query: Query<&mut Health>| {
            println!("Entity {:?} took {} damage!", event.entity, event.amount);

            let health = query.get_mut(event.entity).unwrap();
            health.current -= event.amount;
        })
        .trigger(Damage { amount: 10. });
}

Host

use bevy::prelude::*;
use bevy_mod_ffi::SharedRegistry;
use bevy_mod_ffi_example_core::{Damage, Health};

fn main() {
    let mut registry = SharedRegistry::default();
    registry.register_event::<Damage>();

    let mut app = App::new();
    app.add_plugins(MinimalPlugins)
        .init_resource::<AppTypeRegistry>()
        .insert_resource(registry);

    app.world_mut().register_component::<Health>();
    app.update();

    let path = format!(
        "target/debug/{}bevy_mod_ffi_example_guest.{}",
        std::env::consts::DLL_PREFIX,
        std::env::consts::DLL_EXTENSION
    );

    let lib = unsafe { bevy_mod_ffi::run(path, app.world_mut()).unwrap() };
    lib.unload(app.world_mut());
}
Commit count: 42

cargo fmt