Master Bevy's Entity Component System (ECS) in Rust, covering Systems, Queries, Resources, and parallel scheduling.
5cf4dfeA guide to building high-performance game logic using Bevy's data-oriented ECS architecture. Learn how to structure systems, optimize queries, manage resources, and leverage parallel execution.
Use simple structs for data. Derive Component and Reflect.
#[derive(Component, Reflect, Default)]
#[reflect(Component)]
struct Velocity {
x: f32,
y: f32,
}
#[derive(Component)]
struct Player;
Systems are regular Rust functions that query components.
fn movement_system(
time: Res<Time>,
mut query: Query<(&mut Transform, &Velocity), With<Player>>,
) {
for (mut transform, velocity) in &mut query {
transform.translation.x += velocity.x * time.delta_seconds();
transform.translation.y += velocity.y * time.delta_seconds();
}
}
Use Resource for global data (score, game state).
#[derive(Resource)]
struct GameState {
score: u32,
}
fn score_system(mut game_state: ResMut<GameState>) {
game_state.score += 10;
}
Add systems to the App builder, defining execution order if needed.
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.init_resource::<GameState>()
.add_systems(Update, (movement_system, score_system).chain())
.run();
}
use bevy::prelude::*;
#[derive(Component, Reflect, Default)]
#[require(Velocity, Sprite)]
struct Player;
#[derive(Component, Default)]
struct Velocity {
x: f32,
y: f32,
}
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn((
Player,
Velocity { x: 10.0, y: 0.0 },
Sprite::from_image(asset_server.load("player.png")),
));
}
Use With and Without to filter entities efficiently.
fn enemy_behavior(
query: Query<&Transform, (With<Enemy>, Without<Dead>)>,
) {
for transform in &query {
// Only active enemies processed here
}
}
Query filters (With, Without, Changed) to reduce iteration count.Res over ResMut when read-only access is sufficient to allow parallel execution.Bundle to spawn complex entities atomically.RefCell or interior mutability inside components; let the ECS handle borrowing.Problem: System panic with "Conflict" error.
Solution: You are likely trying to access the same component mutably in two systems running in parallel. Use .chain() to order them or split the logic.
Copy a source-pinned command for your client. You run it yourself.
Destination: .claude/skills/bevy-ecs-expert · pinned to the source commit
# Run from your project root
git clone https://github.com/sickn33/agentic-awesome-skills.git .skillboard-tmp
git -C .skillboard-tmp checkout 5cf4dfeb13ea966daa1e117897689cd7991e3f44
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/plugins/agentic-awesome-skills-claude/skills/bevy-ecs-expert" ".claude/skills/"
rm -rf .skillboard-tmpReview the source before running. This copies files into your project; it is not a one-click install and does not verify runtime safety.
sudo apt update && sudo apt install -y gitnpm install -g @anthropic-ai/claude-code# Run from your project root
git clone https://github.com/sickn33/agentic-awesome-skills.git .skillboard-tmp
git -C .skillboard-tmp checkout 5cf4dfeb13ea966daa1e117897689cd7991e3f44
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/plugins/agentic-awesome-skills-claude/skills/bevy-ecs-expert" ".claude/skills/"
rm -rf .skillboard-tmpDestination: .claude/skills/bevy-ecs-expert
Scanner static-checks@0.1.0 · commit 5cf4dfeb13ea. Static checks cannot prove runtime safety – review the source and the exact diff before installing. How checks work.
No static rules matched. This is not a safety guarantee.