LoginSignup
9
2

More than 1 year has passed since last update.

Bevyで始めるゲーム開発

Posted at

はじめに

この記事は

  • 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()
    });
}

cargo runして確かめてみましょう。

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からコードをクローンして実行してみてください。

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2