2024年11月29日に、Bevy 0.15 が正式リリースされました。リリースノートはこちらです。
メジャーアップデートなのでAPIがバリバリと破壊的変更されましたが、コミュニティの反応は素早く、数日のうちに多くのライブラリが最新バージョンへの対応を済ませました。はやい!
私の作っているゲームが依存しているライブラリも大半が 0.15 に対応したので、ゲーム本体も対応を進めています。ビルドエラーは約 450 箇所となかなかの迫力だったのですが、地道に直していたら2日くらいでなんとか対応ができてきました。私が影響を受けた個所について、いくつか簡単にまとめておきます。
今回の記事は、読んでも読者にはほとんど意味伝わらんですよね……。もっと読みやすい記事を書くように頑張ります。
Rquired Components
Bevy本体でRrequired Componentsという機能が追加されたのですが、これが一番影響が大きいかなと思います。Bevyのエンティティはコンポーネントの集合ですが、あのコンポーネントは単独では使えず、別のコンポーネントち常に組にして使わなくてはならない、ということがよくあります。たとえば、Transform
コンポーネントはGlobalTransform
コンポーネントと常に組み合わせて使わなければならないのですが、毎回両方を指定して書くのは面倒です。
Bevy0.14までは、バンドル(Bundle
)というものを使って複数のコンポーネントをまとめて指定できるようになっていました。しかしこのバンドルという機構は、これはこれで扱いづらいものでした。たとえば複数のバンドルに同じ型のコンポーネントが含まれていると、ひとつのエンティティに同じ型のコンポーネントが複数含まれることになってしまい、実行時にエラーになります。また、コードの字面としてもネストが深くなって読みにくいコードになりがちでした。
0.15で導入されたRequired Componentsでは、必要なコンポーネントは自動で追加されます。たとえば、Transform
コンポーネントをエンティティに追加すると、暗黙の裡にGlobalTransform
コンポーネントが追加されます。もし必要であれば、明示的にGlobalTransform
を追加しても問題ありません。これにより、バンドルは不要となりすべて非推奨になりました。これで確かにエンティティの生成部分のコードがフラットで読みやすくなり、追加されるコンポーネントが明示的でわかりやすくなりました。
非推奨のコードを残していても仕方ないので、バンドルを使っていた部分は気合ですべて修正しました。ソースコードのバンドルでネストされていた部分をフラットにするだけなので、変更箇所は多いものの、比較的単純作業で済みました。
Style
コンポーネント
UI部分では、Node
コンポーネントの中のstyle
プロパティで幅や高さなどの外観を設定していましたが、これがNode
コンポーネント自体のプロパティとなってフラットになり、コードが読みやすくなりました。これもNodeBundle
の箇所のネストをフラットに直すだけです。
これに伴い、ZIndexの指定方法も変わったらしく、ZIndex
とGlobalZIndex
が別々に用意されたみたいです。
Gamepad
以前は Res<ButtonInput<GamepadButton>>
、Res<Axis<GamepadButton>>
、Res<Axis<GamepadAxis>>
などの複数のシステムパラメータを指定してゲームパッドの状態を取得していたのですが、それがQuery<&Gamepad>
だけで済むようになりました。私もゲームパッド周りはなんかすげえ面倒で変なAPIだと思っていたのですが、これで凄くすっきりしました。
bevy_rapier
Bevyのバージョンアップのタイミングに合わせて、各ライブラリも破壊的変更をぶっこんできているようです。物理エンジンのbevy_rapierは今まで同時にひとつまでの物理エンジン世界を持てなかったのですが、それが同時に複数の物理世界を持てるようになりました。これに伴い、物理世界の初期化の方法が変わったようです。今までは物理世界はリソースだったのですが、エンティティになりました。重力などの設定も、物理世界ごとに個別に設定する形になっています。
bevy_aseprite_ultra
Asepriteの2D画像を読み込むライブラリのbevy_aseprite_ultraでは、AsepriteSliceBundle
などのバンドルが削除されており、AseSpriteSlice
などのコンポーネントに置き換える必要があります。slice
というプロパティ名がname
に変わったりという微妙な変更もありました。