リソースとは
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個しかないデータであればリソースを使ったほうが簡単です。
参考文献
もっと詳しく知りたければチートブックで!