bevy-core-concepts について
Bevy 0.19でアプリやプラグインを開発し、システムの実行タイミングを決めるためのスキルです。App、Plugin、World、スケジュール、遅延コマンドの注意点を解説します。
主な機能
- 01Appとプラグインの設定
- 02スケジュール選択の指針
- 03排他的システムの注意点
- 04システム順序と循環
- 05遅延コマンドの挙動
- 06Bevy 0.19の移行時の注意
活用シーン
- 01Bevyアプリやプラグインの開始
- 02システムのスケジュール配置
- 03スケジュール循環の診断
- 04後続システムでコマンドを反映
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ chrisgliddon/ bevy-skills --skill bevy-core-conceptsインストール後、Claude Code で/bevy-core-conceptsを入力して読み込まれたか確認します。
詳細
Bevy 0.19 — コアコンセプト(App、Plugin、Schedule、World)
このスキルを使用する場面
- 新しい Bevy アプリやライブラリプラグインをセットアップするとき。
- システムをどのスケジュール(
Startup、Update、FixedUpdate、PostUpdate、...)に配置するか決めるとき。 &mut Worldが必要な排他的システムを書くとき。- スケジュールの循環、曖昧さに関する診断の強化、または遅延コマンドの順序に関する不具合が発生したとき。
- 「X はどこで実行すべきか?」と尋ねるとき。
基本パターン
use bevy::prelude::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugins(GamePlugin)
.run();
}
pub struct GamePlugin;
impl Plugin for GamePlugin {
fn build(&self, app: &mut App) {
app.insert_resource(Score(0))
.add_systems(Startup, spawn_world)
.add_systems(Update, (read_input, apply_gravity).chain())
.add_systems(FixedUpdate, simulate_physics)
.add_systems(PostUpdate, sync_transforms);
}
}
#[derive(Resource)]
struct Score(u32);
fn spawn_world(mut commands: Commands) {
commands.spawn((Camera3d::default(), Transform::from_xyz(0.0, 4.0, 8.0)));
}
fn read_input(_keys: Res<ButtonInput<KeyCode>>) {}
fn apply_gravity(_t: Res<Time>) {}
fn simulate_physics(_t: Res<Time<Fixed>>) {}
fn sync_transforms(_q: Query<&mut Transform>) {}
// Exclusive system — full mutable World access, runs alone.
fn rebuild_index(world: &mut World) {
let count = world.entities().len();
world.insert_resource(EntityCount(count));
}
#[derive(Resource)]
struct EntityCount(u32);
スケジュール早見表
| スケジュール | 用途 |
|---|---|
Startup | 一度だけのセットアップ。Update の前に一度実行されます。 |
PreUpdate | 入力の読み取り、ネットワーク受信、フレーム開始時の記録。 |
Update | フレームごとのゲームロジック。描画レートで実行されます。ゲームシステムのデフォルトです。 |
PostUpdate | Update 後のリアクティブな記録処理(トランスフォームの伝播はここで行われます)。 |
Last | PostUpdate の後に実行する必要がある処理(まれ)。 |
FixedFirst / FixedPreUpdate / FixedUpdate / FixedPostUpdate / FixedLast | 決定論的なティックレートの処理:物理、ネットワークシミュレーション、ゲームプレイ状態。Time<Fixed> に追いつくため、描画フレームごとに 0 回以上実行されます。 |
**目安:**フレームレートにかかわらず、同じ入力に対してシステムが同じ結果を生成する必要がある場合は、FixedUpdate に配置します。それ以外は Update に配置します。
Bevy 0.19 の注意点
- **
SimpleExecutorは削除されました。**以前はすべてのシステムの後に遅延コマンドを適用していました。残りのエグゼキューターは依存関係の情報を使ってApplyDeferredを配置します。同じスケジュール内で後続のシステムにコマンドを認識させる必要がある場合は、.before、.after、または.chain()を追加してください。共有の可変アクセスは直列化されますが、それだけではどのシステムが先に実行されるかは定義されません。 - **
ScheduleBuildErrorのバリアント名が変更されました。**これらをmatchしている場合は更新してください:HierarchyLoop→HierarchySort(DiGraphToposortError::Loop(...))、DependencyCycle→DependencySort(DiGraphToposortError::Cycle(...))。 - 0.19 ではエグゼキューターの設定にエグゼキューター値を指定します。
set_executor_kind(ExecutorKind::SingleThreaded)をset_executor(SingleThreadedExecutor::new())(またはMultiThreadedExecutor::new()/default_executor())に置き換えてください。 - **0.19 ではリソースが
Componentを実装します。**コンポーネントを除外する目的だけでResourceを使っていたジェネリック境界では、もはや除外されません。広範なコンポーネントクエリやジェネリック API を確認してください。 State::set()は常に遷移を引き起こすようになりました — 要求された状態が現在の状態と同じ場合でも同様です。以前の「同じ場合は何もしない」という動作には、next_state.set_if_neq(...)を使用してください。- レンダーワールドのパスを
Updateに配置しないでください。メインワールドのコンポーネントはそこでレンダーデータを準備できますが、GPU パスはレンダースケジュールに属します。bevy-renderingを参照してください。 - 排他的システムはスケジュール内のすべての処理をブロックします。
&mut Worldが本当に必要な場合(シーンの読み込み、一括リフレクション、スキーマの移行など)に限って使用してください。
関連項目
bevy-ecs-systems— パラメーター、セット、条件、順序付け、曖昧さに関する診断。bevy-ecs-components— エンティティデータ。bevy-rendering— レンダースケジュールとシステム。bevy-physics— Rapier のスケジュール配置とPhysicsSetの順序付け。bevy-input-actions— フレーム入力を固定ティックに転送する方法。bevy-testing— 制御されたAppのステップ実行と手動時間設定。bevy-migration-0-18-to-0-19— エグゼキューターのインスタンスとリソースのコンポーネント化。
コメント
Markdown 対応