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

公式のBevy Asset一覧はこちら。
前記事の、2024年の個人的Bevy Assetまとめはこちら。
なおBevyの最新情報は、This Week In BevyというYouTubeチャンネルがわかりやすい。

フレームバッファにレンダリングさせるためのプラグイン。(bevy 0.15〜)
※ ちなみにこのプラグインの主眼としているのはひょっとしたら通常のフレームバッファの使い方とは異なる可能性もあるので、一応RenderTargetを使った一般的な方法も以下に掲載しておきたい。

GIFやWebPアニメーションを再生できるようにするプラグイン(bevy 0.13〜)。こういうの地味に嬉しい。

ResourceやComponentの変更に対して、リアクティブにしてくれるプラグイン。これがあればReactみたいなノリで書くことができて便利そう。
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を作成してみた。(マージされるかやコードレビューについては都度追記したい。)
ちなみに実用してみると意外と利用できないケースも多く、完全にReactみたいに使いたい場合はちょっと制約がキツイかも。

こちらも同じくReactiveなアドオンとして有用そう。こちらの方が適用可能範囲は広そう。

こちらも同じく。haalkaと同じ作者の似た主旨のアドオンと思われるが、詳細は未調査。

メッシュをプログラムで書いていきたいときに便利なプラグイン。
こちらも執筆時点で0.14まで対応だったので、0.15対応のPRを作成してマージ待ち。
【追記】0.15 / 0.16 対応のPRが無事マージされた。そのとき、後継のクレートがあることがREADMEに追記された。こちらはBevy連動機能もあるものの、フレームワーク非依存になるよう意識して実装されているとのこと。

トレイトをクエリの対象にしたいときに使えるプラグイン。具体的には、例えばPlayer、Enemyなどの実体にかかわらず、共通のトレイトを持つものをクエリするときに使える。
fn show_tooltips(
tooltips: Query<&dyn Tooltip>,
// ...
) {
for tooltip in tooltips.iter().flatten() {
println!("Tooltip: {}", tooltip.tooltip());
}
}

2D/3D両対応の物理エンジン

Gameboy Advance上でBevyを動かそうとする取り組み。描画はagb-rsで行い、ECSなどのハンドリングにBevyを使用している様子。
aespiteからスプライトを読み込むなど本格的なのに、no-stdで利用する工夫が随所にあってすごい。

Bevyではないものの、ブーリアンなどのメッシュの操作ができるライブラリ。
ExampleはSTLファイルの読み書きになっているので、オンメモリで操作する方法を調べたいところ。
GodotでいうCSGをやりたい場合は以下も便利かもしれない。これを使えばおそらく大抵のCSGモデル生成は可能。

忘れがちな登録関係を自動化してくれるプラグイン。
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"));
}
}

BevyにWebサーバ機能を追加するアドオン。OSCのように他のアプリケーションとの連動の際に便利そうだし、シンプルなWebサーバの実験にはこれで十分そう。
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実装も便利そう。リソース等を自動永続化してくれるのは良い。
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();
}

今日のBevy this weekで紹介されていた、TrenchBroomというレベルエディタ連携。とても便利そうな予感。

bevy_mod_async: 非同期にspawnしたりを手助けするプラグイン。
同様のプラグインは複数存在するので、選択肢が多いとニーズに合致するものが増えるのではないかと思う。過去に紹介したbevy_flurxなども参考のこと。

BevyでCurvoを利用できるようにするプラグイン。NURBSの直接描画が可能になり、Loftなどの動的な造形が可能に。

任意のポリゴンメッシュを作る時に便利そうなプラグイン。BevyのPrimitives自体にもPolygonはあるので、適宜使い分けていくのが良さそう。

BevyでGLTFを読み込むと、座標系の違いにより180度回転してしまうことを防ぐプラグイン。(今後は公式で対応していくんじゃないだろうか。)

プラグインを作るときの微妙に読みづらくなりがちなスパゲッティコードを、アノテーションによって読みやすくしてくれるもの。DSLっぽくて好き。
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();
}

BevyでFunDSPというサウンドライブラリを使いやすくするクレート。これで音関係は最強の予感。
注意としては、Bevy 0.16まで対応する各種PRが既になされているものの、作者がマージしていない様子。そのため、git指定やサブモジュールから使えば最新まで対応できる。
またFunDSP自体は、Debugビルドでは音にグリッチが発生しやすく、Releaseビルドでないと性能を発揮しないので、実用上はFunDSPを別プロジェクトとしてdllなどを作るようコンパイルして、リンクさせるのがいいと思う。(例えばSuperColliderなどのサウンドサーバが別にあることが多いのと同じ。)
ちなみにglicolというRustで実装されたTidalCycles的な音楽・音響言語も存在していて、こちらもRustに埋め込んで利用することが可能なので、Bevyバインディングなどを作ってみたいところ。

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

動作中のBevyから情報を受信して、階層やリアルタイムのパラメータなどを確認できるインスペクタ。nvim上で動作する。

Bevyでエフェクト(VFX)を作る際のシェーダ呼び出しやアニメーション定義などをRONから書いて読み込めるようにするもの。

bevy_pmetraとは違う意味で、プロシージャルでジェネラティブなメッシュ(3Dモデル)やテクスチャの生成ができるクレート。こちらはいわゆる地形生成などに便利そう。見た感じノイズベースのものか?
Procedraというサイトでどんなモデルが生成できるかが確認できる。パラメータはリアルタイムに変更できる。

マップやモデルなどをプロシージャルに生成できるクレート。こちらは1つのメッシュを生成するのではなくて、生成ルールに従ってダンジョンやマップを生成できる。

ベクトル形状のアニメーションなどを扱うためのクレート。

NURBSカーブを扱うためのクレート。Bevyには非依存で実装されている。
以下のクレートを併用するとさらにインタラクティブに編集できたりもする様子。
ちなみに公式にも似た機能が存在。

クレートではないが、カーブからチューブを生成するときに役立つRedditのスレッド。

This Week in Bevy で紹介されていた、bevyのステートのロード/セーブを支援するためのクレート。
単純にシリアライズするだけならSerdeがあるけれど、Bevyに特化しているのでECSを絡めた複合的な処理やフローが書けるのが特徴の様子。

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

フェードイン・フェードアウトを実現するためのアドオン。公式にはAnimationTransitionsなどを使うと良いのかなと思うけれど、もっと気軽にフェードインなどができそう。
フェードインができたらスライドインなどもやりたくなるけれど、そうした複雑なことはこのアドオンではできなそう。bevy_flurx などもうまく使うといいのかな。