4
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 8

【Rustのまほう2】#8 Bevy0.15バージョンアップ

Last updated at Posted at 2024-12-07

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の指定方法も変わったらしく、ZIndexGlobalZIndexが別々に用意されたみたいです。

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に変わったりという微妙な変更もありました。

4
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
4
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?