はじめに
この記事は
- Rustでゲーム開発をしてみたい
- UnityやUnrialEngineとは違うゲームエンジンに触れてみたい
- マイナーなものが好き
- 逆張りしたい
という方に向けて書いています。
Bevyとは
Bevyとは、Rust製のデータ駆動型ゲームエンジンの一つです。特徴として、
- オープンソースである。
- ECS(Entity component system)を採用している。公式ではBevyECSと言っている。
などがあります。詳しくはBevyの公式サイトで。
Bevyの導入
Bevyを導入するのはとても簡単です。その前に新しいプロジェクトを作成しましょう。
ここではRustのインストール済みであるとして進めます。
Rustを導入してない方はRustの公式サイトでインストールしてください。
では、プロジェクトを作成してBevyを導入しましょう。ここではHello_bevyとしてプロジェクトを作成します。
cargo new Hello_bevy
cd hello_bevy
お手元のエディタで./cargo.tomlファイルを開いて以下を追加してください。
[dependencies]
bevy = "0.6"
次に最初のプログラムとしてmain.rsを変更します。
use bevy::prelude::*;
fn main() {
App::new().add_system(hello_world_system).run();
}
fn hello_world_system() {
println!("hello world");
}
ここまで完了したらコンソールでcargo runしましょう。すると、
Hello World
と出力されます。ですが、このプログラムではコンソールにHello Worldと出力しているだけです。
「ゲームエンジンなんだから画面に描画しろよ」と言いたげですね。それは次章で行います。
画面の描画
まっさらでもなんでもいいからゲーム画面を描画したい。それは簡単にできます。
main内を以下のコードに書き換えてcargo runしてください。
App::new()
.add_plugins(DefaultPlugins)]
.add_system(hello_world_system)
.run();
するとまっさらな画面が現れたと思います。こんな感じで

次に背景色を変更してみましょう。Appに.insert_resource(ClearColor(Color::rgb(0.69, 0.77, 0.87)))を追加します。
App::new()
.insert_resource(ClearColor(Color::rgb(0.69, 0.77, 0.87)))
.add_plugins(DefaultPlugins)
.add_system(hello_world_system)
.run();
cargo runしてどう変化したのか確かめてみましょう。
フォントの導入
早速Hello Worldの描画を行いたいところですが、Bevyには標準でフォントが用意されていません。なのでフォントを用意する必要があります。追加するフォントはなんでもよいです。ですが、ここではGoogle FontsでダウンロードできるNoto Sans Japaneseを使用します。
ダウンロードが終わったらダウンロードしたフォルダを解凍してhello_bevy/下にassetsディレクトリを作成してその中にフォントデータを格納してください。フォルダ構造は以下のようになります。
hello_bevy
└─── assets
│ │ NotoSansJP-Medium.otf
│
└─── src
│ │ main.rs
│
...
これでHello Worldの描画に必要な素材は集まりました。
Hello World
最小限のHello World
それではHello Worldを描画してみましょう。hello_world_systemを以下のように変更します。
CommandsはEntity Component(文字や画像などのオブジェクト?)を生成するためのもの
AssetServerは画像や音声、フォントなどを読み込むためのものと思ってください。
その程度の理解でいいのか?って大丈夫です。いずれわかります。
fn hello_world_system(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn_bundle(UiCameraBundle::default());
commands.spawn_bundle(TextBundle {
text: Text::with_section(
"Hello World",
TextStyle {
font: asset_server.load("NotoSansJP-Medium.otf"),
font_size: 100.0,
..Default::default()
},
TextAlignment::default(),
),
..Default::default()
});
}
Hello Worldが左下に表示されていると思います。
それにしてもこれではしっくりきませんね。Hello Worldを中央に寄せてみましょう。
中央寄せ
いろいろ試してみましたがBevyで中央寄せを行うには親要素を追加するのがいいみたいです。むしろこの方法でしか出来なかった。
ということで親要素としてNodeBundleを追加しました。これはHTMLでいう<div>タグみたいなものと思って良いと思います。
with_childrenで子要素を作成します。
fn hello_world_system(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn_bundle(UiCameraBundle::default());
commands
.spawn_bundle(NodeBundle {
style: Style {
size: Size::new(Val::Percent(100.0), Val::Percent(100.0)),
align_items: AlignItems::Center,
justify_content: JustifyContent::Center,
..Default::default()
},
color: Color::ORANGE.into(),
..Default::default()
})
.with_children(|parent| {
parent.spawn_bundle(TextBundle {
text: Text::with_section(
"Hello Bevy",
TextStyle {
font: asset_server.load("NotoSansJP-Medium.otf"),
font_size: 100.0,
color: Color::WHITE,
..Default::default()
},
TextAlignment::default(),
),
..Default::default()
});
});
}
最後に
Bevyはサンプルプログラムが充実しています。気になった方はBevyのGithubからコードをクローンして実行してみてください。
