Rust製ゲームエンジン Bevy を触ってみる 1: Getting Started
はじめに
Rust とは
最近評判を上げているプログラミング言語のひとつ。 最近といっても注目され始めてから大分経ち、もはや中堅〜ベテランの顔もしている。
コードを書く時のルール (縛り) が多いのが特徴的で、ちゃんと書けば読みやすくパフォーマンスも高い。一方、 書き方を理解するまではそのメリットを活かしきれずよく分からないエラーに苦しめられたり、初心者向きではない、ともよく言われる。
個人開発で使う分には良いと思います。将来性もありそうで、勉強も兼ねて最近よく使うようにしています。
Bevy とは
Rust 製のゲームエンジン。ECS (Entity / Component / System) というアーキテクチャを採用しているのが特徴と言われています。
Rust 製のゲームエンジンの中では一番の知名度がありそう。
Getting Started
https://bevy.org/learn/quick-start/getting-started/ を進めていきます。
まずはサンプルコードを実行します。
Rust (Cargo) はインストール済みの想定。
|
|
ブロック崩しが始まりました。(音も出ました)

プロジェクトの作成
サンプルが動いたところで、自分でプロジェクトを作成する方法。
これもシンプルです。
1. 普通に Rust プロジェクトを作成
|
|
2. Bevy を追加
|
|
3. ビルドの最適化設定
Cargo.toml に追記
|
|
最適化方法は他にも記載されていましたが、オプションなので今はスルー。
4. 最小構成の作成
main.rs を以下のようにする。
|
|
cargo run で実行。まだ何も起こらない。
コードの説明
ここからコードの説明に入ります。
最小コードに出てきた App には以下の 3 つのフィールドがあります。
| world | ゲームデータ全てを保管する。 |
| schedule | ゲームデータを処理するシステムと、その処理順の情報を保管する。 |
| runner | schedule に基づいて実際の挙動をコントロールする。 |
これらの詳細を理解するために、次に Bevy の設計思想である “ECS” の説明です。
ECS
Entity, Component, System の頭文字。それぞれが表すものは…
| Entity | ゲーム上のそれぞれの物。 |
| Component | Entity に割り当てるもの。 |
| System | Component を処理するのに使う。 |
以下のような例が挙げられている。
playerEntity がPosition,VelocityComponent を持つ。houseEntity はPosition,ColorComponent を持つ。movementSystem により、Position,Velocity両方の Component を持つ Entity が動かされる。
その次が具体例。
|
|
具体例の中身は見た通り。 関数の引数に型を指定するだけで Dependency Injection みたいに Entity を取得できるのが特徴的。
実行すると以下のようになります。
|
|
…コマンドラインばっかりで全然ゲームエンジンらしさが出てきませんね。
ゲームらしい画面を表示するため、次に Plugin の説明に入ります。
Plugin
Plugin も Bevy の特徴的な部分で、Bevy は様々な機能をプラグインとして提供しています。
UI が欲しければ UiPlugin, ゲーム画面をレンダリングしたければ RenderPlugin など。これらを入れていなかったのでコマンド画面だけだったということでした。
更に、これらのプラグインにはサードパーティーのものが多数存在します。つまり、コミュニティの人たちがそれぞれプラグインを作成し、それらを簡単に他の人も取り込める仕組みが整っているようです。
これら大量のプラグインは Bevy Assets で確認できます。
大量のプラグインがあって目が回りますが、基本的なプラグインは DefaultPlugins としてひとまとめになっているようです。
|
|
これで、空のゲーム画面が表示されるようになります。またついでに、hello world がコンソール画面を埋め尽くすようになりました。
イベントループが入り、フレームごとに hello_world が呼ばれているようです。

ここでプラグインの作り方についての説明がありました。すぐに使うことは無さそうですが、プラグインを作りやすいのはサードパーティープラグイン開発の活発化という意味では良さそうです。
先ほど作った hello world をプラグインにする例。
|
|
Resource
そして “Getting Started” の最後として、Resource の説明があります。
リソースはエンティティーとコンポーネントとは違い、グローバルに単一のデータです。 例えば以下のようなものがあります。
- ゲームの経過時間
- サウンドやテクスチャのアセット
- Renderer
実際に Time, Timer リソースを使い、hello world を 2 秒おきにしてみます。
リソースもコンポーネントと同じく、引数の型指定だけで取得できます。Res で read, ResMut だと write 権限と分かれています。
|
|
これで greet が 2秒おきになりました。
次のステップ
これで基本 of 基本の部分が完了です。 次に読むドキュメントとして以下のようなものが挙げられています。
- Examples: https://github.com/bevyengine/bevy/tree/latest/examples#examples
- サンプルコード集。
- Web Examples: https://bevy.org/examples
- ブラウザで動くサンプルコード集。
- Breakout: https://github.com/bevyengine/bevy/blob/latest/examples/games/breakout.rs
- 最初に動かした “ブロック崩し” のサンプルコード。
- API Docs: https://docs.rs/bevy
- API ドキュメント。前から読むものではない。
- Bevy Assets: https://bevy.org/assets/
- コミュニティのプロジェクト集。プラグインだけでなく、Bevy の学習教材やゲームもある。
- Bevy Cheatbook: https://bevy-cheatbook.github.io/
- Tips 集みたいなサイト。
次は順番通り Examples か、ブラウザで動かしたいので Web Examples を見てみようと思います。