Rust製ゲームエンジン「Bevy」入門:シンプルなレシピで始めるゲーム開発
Bevyは、Rustという銘柄の最高級スピリッツを使って作られた、とびきりシンプルで爽やかなゲームエンジンです。普通のゲームエンジンは、いろいろな素材が混ざり合って、ちょっと複雑で重たいカクテルになりがちですが、Bevyはまるでジンとトニックのように、シンプルだけど奥深い味わいが特徴です。
一番のこだわりは、その製法。「データ駆動型」というレシピを使っているんです。これは、ゲームの世界にあるすべてのものを「データ」として扱い、そのデータを「システム」と呼ばれる機能で処理するという考え方です。 例えば、キャラクターの「位置」というデータと、「移動」という機能が別々に存在し、機能がデータを動かす、といったイメージですね。これにより、ゲームの要素を柔軟に組み合わせたり、変更したりするのがとても簡単になります。
なぜ多くのエンジニアがBevyに惹かれるのか、その魅力を3つのポイントでご紹介します。
余計な機能や複雑な概念がそぎ落とされているため、学習コストが非常に低いのが魅力です。初めてゲーム開発に触れる人でも、すぐにゲームの核心部分に入り込むことができます。まるで、シンプルなレシピを覚えれば、誰でも美味しいカクテルが作れるように。
Bevyは、Rustで書かれています。Rustの魅力は、安全性とパフォーマンスの両立。メモリの安全性をコンパイル時に保証してくれるので、うっかりバグでクラッシュしてしまうリスクがほとんどありません。また、驚くほど高速に動作します。これは、カクテルをシェイクする速さにも似ています。素早く、正確に、最高の状態でお客様に提供できるんです。
Bevyはオープンソースのプロジェクトです。つまり、世界中の優秀なバーテンダー(エンジニア)たちが、日夜新しいレシピ(機能)やグラス(ツール)を開発し、共有しています。困ったときにはすぐに助けてくれる仲間が見つかる、そんな温かい雰囲気も大きな魅力の一つです。
さあ、実際にBevyカクテルを作ってみましょう。まずは材料を揃えることから。
BevyはRustで動きます。Rustをまだインストールしていないなら、公式サイトからrustupというツールをインストールしましょう。コマンドラインで以下のコマンドを実行するだけです。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
これで、Rustコンパイラやパッケージマネージャーのcargoが使えるようになります。
準備ができたら、cargoを使って新しいプロジェクトを始めましょう。
cargo new --bin my_bevy_game
cd my_bevy_game
これで、新しいグラス(プロジェクト)ができました。
次に、レシピ(Cargo.tomlファイル)にBevyの材料を追加します。[dependencies]セクションに以下の1行を書き加えてください。
[dependencies]
bevy = "0.14" # バージョンは最新のものに合わせましょう
それでは、実際に一杯作ってみましょう。ここでは、画面にただ色を表示するだけの、一番シンプルなカクテルを作ります。
use bevy::prelude::*;
fn main() {
App::new()
// Bevyのデフォルトプラグインを追加
// カクテルに基本的な風味を加えるイメージです
.add_plugins(DefaultPlugins)
// 背景色を設定するシステムを追加
// このシステムがグラスの底に敷く色を決めます
.add_systems(Startup, set_background_color)
.run();
}
// 背景色を設定する関数(システム)
fn set_background_color(mut clear_color: ResMut<ClearColor>) {
// グラスの色をコーラル色に設定
// ResMutは、Bevyが提供するリソース(材料)にアクセスするための特別な引数です
clear_color.0 = Color::rgb(0.9, 0.4, 0.3); // RGB値で色を指定
}
このコードを実行すると、コーラル色の画面が表示されます。まるで、夕焼けのような美しいカクテルができたようです。
App::new().add_plugins(DefaultPlugins).run();が、Bevyの基本的なカクテルレシピです。
add_systemsは、カクテルに特定の機能(風味)を追加する命令です。ここでは、Startupというタイミング(グラスに最初に注ぐタイミング)で、set_background_colorという処理(システム)を実行するように指示しています。