mcpField
B
bevy-core-concepts

bevy-core-concepts

github.com/chrisgliddon開発2691 回インストール9 週間前に更新
リポジトリ

bevy-core-concepts について

Bevy 0.19でアプリやプラグインを開発し、システムの実行タイミングを決めるためのスキルです。App、Plugin、World、スケジュール、遅延コマンドの注意点を解説します。

主な機能

  1. 01Appとプラグインの設定
  2. 02スケジュール選択の指針
  3. 03排他的システムの注意点
  4. 04システム順序と循環
  5. 05遅延コマンドの挙動
  6. 06Bevy 0.19の移行時の注意

活用シーン

  1. 01Bevyアプリやプラグインの開始
  2. 02システムのスケジュール配置
  3. 03スケジュール循環の診断
  4. 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フレームごとのゲームロジック。描画レートで実行されます。ゲームシステムのデフォルトです。
PostUpdateUpdate 後のリアクティブな記録処理(トランスフォームの伝播はここで行われます)。
LastPostUpdate の後に実行する必要がある処理(まれ)。
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 — エグゼキューターのインスタンスとリソースのコンポーネント化。

コメント