3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🦀ひとりRustとBevyでゲーム開発🕊️Advent Calendar 2024

Day 13

【Rustのまほう2】#13 リソース

Last updated at Posted at 2024-12-12

リソースとは

Bevyにおけるリソース(Resource)とは、Bevyのアプリケーション全体でひとつしかないデータを保持するのに使うものです。前回紹介したステートと似ていますが、ステートはあくまで画面切り替えなどでシステムを切り替えるのに使うもので、それに対してリソースはもっと汎用的なものです。また、データを保持するという意味ではエンティティとも似ていますが、ワールド全体でひとつしかないのがリソース、ワールドで任意個を持てるのがエンティティだと考えるといいでしょう。

例えば、ゲームのBGMの音量はどの画面でも共通で、画面遷移しても変更されることはありません。このように画面遷移をまたいで保持したいものをリソースにします。他にも、いったん読み込んだ画像ファイルや音声ファイルのようなアセットも、リソースとしてアプリケーション全体を通じて保持しておきます。

リソースの定義

リソースを定義するには、データ型の定義でResourceを導出しておきましょう。

#[derive(Resource)]
pub struct GameConfig {
    pub bgm_volume: f32,
    pub se_volume: f32,
    ...
}

リソースの初期化

リソースは使う前に初期化が必要です。最も簡単には、リソースにDefaultトレイトを実装しておいて、app.init_resourceを呼びます。ここで書いていて気付いたんですが、まだAppについて説明していませんでした!またいずれ説明します。

app.init_resource::<GameConfig>();

または、insert_resourceで値を指定したり上書きすることもできます。

app.insert_resource(GameConfig::default());

リソースの読み取り

リソースはシステムパラメータとしてシステムから読み取ることができます。Resがリソースを表すシステムパラメータで、たとえば先ほどのGameConfigリソースを読み取りたければ、Res<GameConfig>というようにシステムパラメータを書きます。

fn update_bgm_volue(
    config: Res<GameConfig>,
    ...
) {
    if config.is_changed() {
        ...
    }
}

また、上のコードにあるように、config.is_changedを呼びだすと、リソースが変更されているかどうかを調べることができます。無駄な処理を省きたいときにはこれを使うといいでしょう。

また、Resは読み取りだけですが、ResMutを使うとリソースに書きこみもできます。

fn update_bgm_volue(
    mut config: ResMut<GameConfig>,
    ...
) {
    ...
}

リソースでやっていることはデータの保持だけなので、同じ機能をエンティティで実現することもできます。でも、エンティティではデータが無かったり複数個存在する可能性も含めて条件分岐を書くことになるので、全体で1個しかないデータであればリソースを使ったほうが簡単です。

参考文献

もっと詳しく知りたければチートブックで!

3
0
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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?