Open32

Bevy Engineプラグイン 便利そうなものまとめ 2025

funatsufumiyafunatsufumiya

フレームバッファにレンダリングさせるためのプラグイン。(bevy 0.15〜)
https://crates.io/crates/bevy_framebuffer

※ ちなみにこのプラグインの主眼としているのはひょっとしたら通常のフレームバッファの使い方とは異なる可能性もあるので、一応RenderTargetを使った一般的な方法も以下に掲載しておきたい。
https://bevyengine.org/examples/3d-rendering/render-to-texture/

funatsufumiyafunatsufumiya

ResourceやComponentの変更に対して、リアクティブにしてくれるプラグイン。これがあればReactみたいなノリで書くことができて便利そう。
https://crates.io/crates/bevy_mod_reaction

fn setup(mut commands: Commands) {
    // Coarse-grained reactivity:
    // This reaction will only run when the `Health` component belonging to `scope.entity` changes.
    commands.spawn((
        Health(100),
        Reaction::derive(|scope: In<Scope>, mut query: ReactiveQuery<&Health>| {
            let health = query.get(scope.entity).unwrap();
            Damage(health.0 * 2)
        }),
    ));
}

執筆時点で0.14のみ対応だったので、0.15対応のPRを作成してみた。(マージされるかやコードレビューについては都度追記したい。)
https://github.com/matthunz/bevy_mod_reaction/pull/1/files

ちなみに実用してみると意外と利用できないケースも多く、完全にReactみたいに使いたい場合はちょっと制約がキツイかも。

funatsufumiyafunatsufumiya

メッシュをプログラムで書いていきたいときに便利なプラグイン。
https://github.com/bevy-procedural/meshes

こちらも執筆時点で0.14まで対応だったので、0.15対応のPRを作成してマージ待ち。

【追記】0.15 / 0.16 対応のPRが無事マージされた。そのとき、後継のクレートがあることがREADMEに追記された。こちらはBevy連動機能もあるものの、フレームワーク非依存になるよう意識して実装されているとのこと。

https://github.com/bevy-procedural/modelling

funatsufumiyafunatsufumiya

トレイトをクエリの対象にしたいときに使えるプラグイン。具体的には、例えばPlayer、Enemyなどの実体にかかわらず、共通のトレイトを持つものをクエリするときに使える。
https://github.com/JoJoJet/bevy-trait-query

fn show_tooltips(
    tooltips: Query<&dyn Tooltip>,
    // ...
) {
    for tooltip in tooltips.iter().flatten() {
        println!("Tooltip: {}", tooltip.tooltip());
    }
}
funatsufumiyafunatsufumiya

忘れがちな登録関係を自動化してくれるプラグイン。
https://crates.io/crates/bevy_auto_plugin

use bevy::prelude::*;
use bevy_auto_plugin::auto_plugin_module::*;

#[auto_plugin(init_name=init)]
mod plugin_module {
    use super::*;
    
    #[auto_register_type]
    #[derive(Component, Reflect)]
    #[reflect(Component)]
    #[auto_name]
    pub struct FooComponent;

    #[auto_register_type]
    #[auto_add_event]
    #[derive(Event, Reflect)]
    pub struct FooEvent;

    #[auto_register_type]
    #[auto_init_resource]
    #[derive(Resource, Default, Reflect)]
    #[reflect(Resource)]
    pub struct FooResource;
}

#[auto_plugin(app=app)]
fn plugin(app: &mut App) {
    plugin_module::init(app);
}

上記コードは以下を自動生成してくれる。

mod plugin_module {
    // ...
    fn init(app: &mut App) {
        app.register_type::<FooComponent>();
        app.register_type::<FooEvent>();
        app.register_type::<FooResource>();

        app.add_event::<FooEvent>();

        app.init_resource::<FooResource>();

        app.register_required_components_with::<FooComponent, Name>(|| Name::new("FooComponent"));
    }
}
funatsufumiyafunatsufumiya

BevyにWebサーバ機能を追加するアドオン。OSCのように他のアプリケーションとの連動の際に便利そうだし、シンプルなWebサーバの実験にはこれで十分そう。
https://crates.io/crates/bevy_webserver

use bevy::prelude::*;
use bevy_webserver::RouterAppExt;

fn main() {
    App::new()
        .add_plugins(MinimalPlugins)
        .route("/hello_world", axum::routing::get(hello_world))
        .run();
}

async fn hello_world() -> axum::response::Html<String> {
    axum::response::Html("<p>Hello world!</p>".to_string())
}

また、同じ作者によるDB実装も便利そう。リソース等を自動永続化してくれるのは良い。

https://crates.io/crates/bevy_easy_database

use bevy::prelude::*;
use bevy_database::{DatabasePlugin, DatabaseIgnore};

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(DatabasePlugin)  // Add the database plugin
        .add_database_mapping::<Transform>()  // Register components you want to persist
        .run();
}
funatsufumiyafunatsufumiya

プラグインを作るときの微妙に読みづらくなりがちなスパゲッティコードを、アノテーションによって読みやすくしてくれるもの。DSLっぽくて好き。
https://github.com/TGRCdev/bevy-butler

use bevy::prelude::*;
use bevy_butler::*;

#[butler_plugin]
struct MyPlugin;

#[derive(Resource)]
#[insert_resource(plugin = MyPlugin, init = Hello("World".to_string()))]
struct Hello(String);

#[add_system(schedule = Update, plugin = MyPlugin)]
fn hello_plugin(name: Res<Hello>)
{
    info!("Hello, {}!", name.0);
}

#[add_system(schedule = Update, plugin = MyPlugin, after = hello_plugin)]
fn goodbye_plugin(name: Res<Hello>)
{
    info!("Goodbye, {}!", name.0);
}

fn main() {
    App::new()
        .add_plugins(MyPlugin)
        .run();
}
funatsufumiyafunatsufumiya

BevyでFunDSPというサウンドライブラリを使いやすくするクレート。これで音関係は最強の予感。
https://github.com/harudagondi/bevy_fundsp

注意としては、Bevy 0.16まで対応する各種PRが既になされているものの、作者がマージしていない様子。そのため、git指定やサブモジュールから使えば最新まで対応できる。

またFunDSP自体は、Debugビルドでは音にグリッチが発生しやすく、Releaseビルドでないと性能を発揮しないので、実用上はFunDSPを別プロジェクトとしてdllなどを作るようコンパイルして、リンクさせるのがいいと思う。(例えばSuperColliderなどのサウンドサーバが別にあることが多いのと同じ。)

ちなみにglicolというRustで実装されたTidalCycles的な音楽・音響言語も存在していて、こちらもRustに埋め込んで利用することが可能なので、Bevyバインディングなどを作ってみたいところ。
https://github.com/chaosprint/glicol

funatsufumiyafunatsufumiya

Bevyのプラグインではないのだけれど、Rustでディープラーニングを可能にするクレート。これを使えば例えば、画像認識などはもちろん、コンピュートシェーダーで実行するような処理もテンソルで書けるようになるので、幅が広がる。
https://burn.dev/

https://github.com/tracel-ai/burn

funatsufumiyafunatsufumiya

CADのようなパラメトリック・モデリングを可能にするクレート。READMEの動画を見ていただければわかるけれど、可能性の塊で、こういうクレートが続々と出てくることにBevyの末恐ろしさを感じる。
https://github.com/nilaysavant/bevy_pmetra

内部的に、RustにおけるCADカーネル実装を利用していて、複雑なことがいろいろできそうな予感。
https://github.com/ricosjp/truck

funatsufumiyafunatsufumiya

bevy_pmetraとは違う意味で、プロシージャルでジェネラティブなメッシュ(3Dモデル)やテクスチャの生成ができるクレート。こちらはいわゆる地形生成などに便利そう。見た感じノイズベースのものか?
https://github.com/manankarnik/bevy_generative

Procedraというサイトでどんなモデルが生成できるかが確認できる。パラメータはリアルタイムに変更できる。

funatsufumiyafunatsufumiya

This Week in Bevy で紹介されていた、bevyのステートのロード/セーブを支援するためのクレート。
https://docs.rs/bevy_save/latest/bevy_save/

単純にシリアライズするだけならSerdeがあるけれど、Bevyに特化しているのでECSを絡めた複合的な処理やフローが書けるのが特徴の様子。

funatsufumiyafunatsufumiya

This Week in Bevy で紹介されていた、WebRTCを通じてクラウドゲーミングを実現できるクレート。こういうクレートが出るとワクワクするし、Bevyは今後どういう広がりを見せていくのかが本当に楽しみになる。

https://github.com/rlamarche/bevy_streaming

funatsufumiyafunatsufumiya

フェードイン・フェードアウトを実現するためのアドオン。公式にはAnimationTransitionsなどを使うと良いのかなと思うけれど、もっと気軽にフェードインなどができそう。

https://github.com/mintlu8/bevy_mod_opacity

フェードインができたらスライドインなどもやりたくなるけれど、そうした複雑なことはこのアドオンではできなそう。bevy_flurx などもうまく使うといいのかな。