株式会社エクスブリッジ

bevy_async_system|UniTask風の非同期待機

「bevy_async_system UniTaskライク」で検索してこのページに来た方は、BevyでUniTaskのような非同期待機の書き方を探していることと思います。ここでは、elmさんが2023年10月16日に公開した記事「【bevy_async_system】bevyでUniTaskライクな機能が使えるライブラリを製作しました。」の内容をもとに、このライブラリが解決する課題と仕組みを紹介します。

Bevyで移動完了や再生終了のような「何かを待つ」処理を書くとき、通常はステートやイベントを組み合わせます。記事ではまず、2Dオブジェクトの移動をステートで待機する例を示し、対象が1つなら比較的シンプルに書けることを確認します。続いて待機対象を2つに増やした場合のコードを提示し、状態遷移やイベント処理が絡み合って一気に複雑化してしまう様子を具体的に見せています。

この複雑さを解消するために作られたのがbevy_async_systemです。記事では、同じ2つの物体の移動待機を、このライブラリが提供するトレイトメソッドで非同期タスクとして書き直した例を示しています。各タスクはハンドルとして返され、通常のfutureとして扱えるため、join_allのような関数にまとめて渡すことで複数の待機を簡潔に表現できることを説明しています。

さらに記事は、非同期タスクを組み立てる仕組みについても触れています。システムを一度だけ実行して終わるonce、条件が満たされるまで毎フレーム実行し続けるwait、フレーム数や時間でタスクを遅らせるdelay、指定回数または無限に実行を繰り返すrepeatという4種類のスケジュールコマンドが用意されており、それぞれの役割分担を通してどんな待機処理も組み立てられる考え方を紹介しています。

記事の手順の流れ

  1. Bevyでステートを使った単純な移動待機の例を確認する
  2. 待機対象を2つに増やし、ステート管理が複雑化する様子を見る
  3. bevy_async_systemのトレイトメソッドで非同期タスクを組み立て直す
  4. タスクのハンドルをjoin_allなどでまとめて待機する書き方を知る
  5. once・wait・delay・repeatという4種のスケジュールコマンドの役割を理解する
  6. 用意されているExampleを参照して使い方を確認する

Zennで記事を読む →

記事は著者の方がZennに公開されているものです。当社は内容を転載していません。上のリンクから元記事が開きます。

読む前に知っておきたいこと

記事はBevyのステートやイベントを使った待機処理の書き方を前提に進むため、両者の基本的な使い方を知っておくと理解しやすくなります。またbevy_async_systemのタスクは通常のfutureとして扱われ、join_allのような関数と組み合わせる想定になっているため、Rustのasync/await周りの基礎知識があるとスムーズです。

つまずきやすい点

記事内で説明されているスケジュールラベルは、通常のBevyのスケジュールラベルとは挙動が異なる点に注意が必要です。システムそのものを渡すのではなく、once・wait・delay・repeatといった非同期スケジュールコマンドを通してシステムとタスクが生成される仕組みになっているため、通常のシステム登録と同じ感覚で扱うと混乱しやすい部分です。

公開から時間が経っていること

この記事は2023年10月16日に公開されたもので、bevy_async_systemやBevy本体はその後もバージョンが更新されている可能性があります。実際に導入する際は、crates.ioやGitHubリポジトリのREADMEで対応するBevyのバージョンやAPIの現状を確認してから使うのが安全です。

bevy_async_system とは

■ 概要(1行) Bevyのシステム実行フローに、時間遅延や順次実行(シーケンス)を組み込むためのコルーチンライクな機構を提供する。 ■ 特徴・用途(2〜3行) `Reactor`を中心とした`wait`や`delay`といったアクションにより、アニメーションや複雑なゲームロジックのステップ進行など、時間依存性の高いワークフローを、可読性の高い疑似非同期コードで記述できる。また、`no_std`サポートは、一般的なゲームループ外の環境を含む広範なプラットフォームでの利用を可能にする高いポータビリティを示す。 ■ 結論(1行) 従来のディスパッチ型システムでは複雑になりがちな、状態遷移やタイミング制御を、構造的な変更を最小限に抑えつつ実装できる強力なツールである。

bevy_async_system を実務で使うための情報

よくある質問

bevy_async_systemはUniTaskと同じAPIが使えますか?
記事はUniTaskのような使い心地を目指して作られたライブラリだと説明していますが、UniTaskそのものの移植ではありません。移動やイベント待機などの非同期処理を、ステートやイベントを使わずに簡潔に書けるようにする点が共通する考え方として紹介されています。
既存のステートやイベントによる待機処理を書き換える必要がありますか?
記事では既存のステート管理による移動待機の例を示した上で、同じ処理をbevy_async_systemで書き直すとどう変わるかを比較しています。既存コードをすべて置き換える前提ではなく、待機処理が複雑になった場面で選択肢として使えるという紹介の仕方になっています。
どんな待機処理に使えますか?
記事では移動の完了待ちを例に説明していますが、音楽の再生やアニメーションのように何らかの処理の完了を待つ場面でも使えると触れられています。once・wait・delay・repeatというスケジュールコマンドを組み合わせることで、さまざまな待機条件を表現できる考え方が紹介されています。
自分で導入するのが難しい場合はどうすればよいですか?
当社がOSSの導入・日本語化・サーバー構築を代行しています(税込110,000円〜)。相談は無料で、Zoomでの打ち合わせにも対応しています。「そのOSSは御社には向かない」という結論になることもあり、その場合はそうお伝えします。

読んだうえで、自分でやるか任せるか

OSSは「入れる」より「日本語で運用に乗せる」ほうが手間です。記事のとおりに進めて詰まったら、そこから先は任せてください。

Kurage.AIKurage.AI に相談AIが何でも答えます