bevy-ecs-patterns について
Bevy を使うゲーム開発者向けの ECS 高度パターンを扱うスキルです。クエリ、スケジューリング、変更検出、パフォーマンス改善を取り上げます。
主な機能
- 01複雑なクエリとフィルター
- 02クエリ状態とキャッシュ
- 03エンティティの関係と階層
- 04システムのスケジューリングと依存関係
- 05変更検出とリアクティブシステム
- 06並列イテレーションと ParamSet
活用シーン
- 01ECS クエリ性能の最適化
- 02複雑なエンティティ階層の設計
- 03システム順序と実行条件の設定
- 04アーキタイプの断片化の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ laurigates/ claude-plugins --skill bevy-ecs-patternsインストール後、Claude Code で/bevy-ecs-patternsを入力して読み込まれたか確認します。
同梱ファイルREFERENCE.md
詳細
Bevy ECS のパターン
Bevy の Entity Component System における高度なパターンとテクニックを紹介します。パフォーマンス、保守性、複雑なゲームアーキテクチャに重点を置いています。
このスキルを使用する場面
| 次のような場合はこのスキルを使用します… | 次のような場合は bevy-game-engine を使用します… |
|---|---|
| ECS クエリのパフォーマンスを最適化するとき | Bevy の新しいプロジェクトを一からセットアップするとき |
| 複雑なエンティティの関係や階層を実装するとき | 基本的な ECS の概念(コンポーネント、システム、リソース)を学ぶとき |
| システムのスケジューリングと順序を設計するとき | 入力、アセット、ゲームの状態を扱うとき |
変更検出(Changed<T>、Added<T>)を使用するとき | 基本的なゲームロジックやアプリケーション構造を記述するとき |
ParamSet、並列イテレーション、バッチ処理を使用するとき | レンダリング、UI、オーディオを設定するとき |
| アーキタイプの断片化やストレージ戦略をデバッグするとき | プラグインや一般的な Bevy 依存関係を追加するとき |
主な専門分野
高度なクエリ
- 複雑なクエリフィルターと組み合わせ
- クエリの状態とキャッシュ
- エンティティの関係と階層
- 並列イテレーション戦略
システムのスケジューリング
- システムの順序と依存関係
- 実行条件とゲーティング
- システムセットとスケジューリング
- 固定タイムステップのシステム
変更検出
Changed<T>とAdded<T>のフィルター- 変更追跡のための
Ref<T> - 効率的なリアクティブシステム
高度なクエリパターン
クエリフィルター
use bevy::prelude::*;
// Multiple filters
fn targeting_system(
query: Query<
(&Transform, &mut Target),
(With<Enemy>, Without<Dead>, Changed<Health>)
>,
) {
for (transform, mut target) in &query {
// Only enemies that are alive and recently damaged
}
}
// Optional components
fn flexible_system(
query: Query<(&Transform, Option<&Velocity>, Option<&Acceleration>)>,
) {
for (transform, velocity, acceleration) in &query {
if let Some(vel) = velocity {
// Has velocity
}
}
}
// Or filters
fn pickup_system(
query: Query<Entity, Or<(With<HealthPickup>, With<AmmoPickup>)>>,
) {
for entity in &query {
// Process any pickup type
}
}
競合する複数のクエリ
// Use ParamSet when queries have conflicting access
fn combat_system(
mut param_set: ParamSet<(
Query<&mut Health, With<Player>>,
Query<&mut Health, With<Enemy>>,
)>,
) {
// Access one query at a time
for mut health in param_set.p0().iter_mut() {
health.0 += 1.0; // Heal player
}
for mut health in param_set.p1().iter_mut() {
health.0 -= 10.0; // Damage enemies
}
}
// Query transmutation for flexible access
fn dynamic_query(
all_entities: Query<(Entity, &Transform)>,
players: Query<&Player>,
) {
for (entity, transform) in &all_entities {
if players.get(entity).is_ok() {
// This is a player
}
}
}
エンティティの関係
// Parent-child hierarchies
#[derive(Component)]
struct Inventory;
#[derive(Component)]
struct InventorySlot(usize);
fn spawn_inventory(mut commands: Commands) {
commands.spawn((Inventory, SpatialBundle::default()))
.with_children(|parent| {
for i in 0..10 {
parent.spawn((InventorySlot(i), SpriteBundle::default()));
}
});
}
// Query parent from child
fn child_system(
children: Query<(&InventorySlot, &Parent)>,
parents: Query<&Inventory>,
) {
for (slot, parent) in &children {
if let Ok(inventory) = parents.get(parent.get()) {
// Access parent inventory
}
}
}
// Query children from parent
fn parent_system(
parents: Query<&Children, With<Inventory>>,
slots: Query<&InventorySlot>,
) {
for children in &parents {
for &child in children.iter() {
if let Ok(slot) = slots.get(child) {
// Access child slot
}
}
}
}
エージェント向けの最適化
| コンテキスト | コマンド |
|---|---|
| 手早くコンパイルを確認 | cargo check 2>&1 | head -30 |
| テストを素早く実行 | cargo test --lib -- --test-threads=1 -q |
| ECS の使用に関するエラーを確認 | cargo clippy -- -W clippy::all 2>&1 | head -50 |
| プロジェクト内のコンポーネントを一覧表示 | grep -rn "derive(Component)" src/ --include="*.rs" |
| プロジェクト内のシステムを一覧表示 | grep -rn "fn.*Query<" src/ --include="*.rs" |
| システムの順序を確認 | grep -rn "\.add_systems|\.chain()|\.after(|\.before(" src/ --include="*.rs" |
| ParamSet の使用箇所を確認 | grep -rn "ParamSet" src/ --include="*.rs" |
システムのスケジューリング、変更検出、パフォーマンスパターン、カスタムエンティティコマンド、設計のベストプラクティスについては、REFERENCE.md を参照してください。
コメント
Markdown 対応