0Pricing
Learn Rust Coding · Lección

La mentalidad ECS

Entidades, componentes y sistemas

La mentalidad ECS es una lección gratuita de Learn Rust Coding en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Learn Rust Coding, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Learn Rust Coding incluye 4 lecciones en total.

Partes de esta lección aún no han sido traducidas y se muestran en inglés.

What ECS Solves

Bevy is built on the Entity Component System (ECS) pattern. Instead of deep inheritance hierarchies, you compose behavior from small, independent pieces of data.

This data-oriented design keeps memory layout cache-friendly and lets the engine parallelize work across CPU cores almost for free.

Entities Are Just IDs

An entity is nothing but a lightweight identifier — a generational index. It owns no data and has no behavior on its own.

Think of it as a key in a database row. Components attached to that key give the entity meaning, like "Player" or "Bullet".

// An Entity is a tiny handle
struct Entity {
    index: u32,
    generation: u32,
}

Components Are Pure Data

Components are plain Rust structs that derive Component. They carry state but contain no logic.

Keep them small and focused. A position, a velocity, and a health value are three separate components rather than one monolithic struct.

use bevy::prelude::*;

#[derive(Component)]
struct Position { x: f32, y: f32 }

#[derive(Component)]
struct Velocity { x: f32, y: f32 }

Systems Hold the Logic

Systems are ordinary functions that operate on components. They are where all your game logic lives.

Bevy inspects each system's parameters to figure out what data it touches, then schedules systems that don't conflict to run in parallel.

fn move_system(mut query: Query<(&mut Position, &Velocity)>) {
    for (mut pos, vel) in &mut query {
        pos.x += vel.x;
        pos.y += vel.y;
    }
}

Queries: Asking for Data

A Query declaratively requests entities that have a specific set of components. Bevy returns only matching entities.

You can request shared access with &T or exclusive access with &mut T. This borrow information drives the parallel scheduler.

// Entities with BOTH Position and Velocity
fn report(query: Query<(&Position, &Velocity)>) {
    for (pos, vel) in &query {
        info!("at {},{} moving {},{}", pos.x, pos.y, vel.x, vel.y);
    }
}

Filtering Queries

The second type parameter of a Query is a filter. Use With and Without to narrow results without borrowing that component's data.

This is ideal for tag components — empty structs that mark an entity's role.

#[derive(Component)]
struct Player;

fn player_only(query: Query<&Position, With<Player>>) {
    for pos in &query {
        info!("player at {},{}", pos.x, pos.y);
    }
}

Resources: Global State

Some data is unique to the whole game — a score, the elapsed time, or game settings. These live as resources rather than components.

Access them in systems with Res<T> for read access or ResMut<T> for write access.

#[derive(Resource)]
struct Score(u32);

fn show_score(score: Res<Score>) {
    info!("Score: {}", score.0);
}

The App Builder

Everything is wired together in the App. You add plugins, insert resources, and register systems against a schedule.

DefaultPlugins brings windowing, rendering, input, and time so you can focus on gameplay.

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .insert_resource(Score(0))
        .add_systems(Update, show_score)
        .run();
}

Schedules: Startup vs Update

Systems run inside schedules. Startup runs once when the app launches — perfect for spawning the world.

Update runs every frame and is where movement, input, and logic belong. Bevy also offers FixedUpdate for deterministic physics steps.

App::new()
    .add_plugins(DefaultPlugins)
    .add_systems(Startup, setup)
    .add_systems(Update, move_system)
    .run();

Why Composition Wins

Want a flying enemy that can be poisoned? Just attach Flying and Poisoned components. No new class, no inheritance chain.

Behavior emerges from which systems match which component combinations. This makes features additive and refactors cheap.

// Same systems, new combinations
commands.spawn((Position{x:0.0,y:0.0}, Velocity{x:1.0,y:0.0}, Flying, Poisoned));

Parallelism for Free

Because each system declares its data access, Bevy's scheduler knows which systems conflict. Non-conflicting systems run on different threads automatically.

You write single-threaded-looking code, and the engine extracts parallelism from your borrow declarations. No locks, no manual threading.

Quick Check

Test your understanding of ECS roles.

Recap: The ECS Mindset

Entities are IDs, components are data, systems are logic, and resources are global state. The App ties them together through schedules.

By composing small components and letting systems match them, you get flexible, parallel, cache-friendly games. Next we'll spawn entities and make them move.

Preguntas frecuentes

¿La lección «La mentalidad ECS» es gratis?

Sí — el texto completo de «La mentalidad ECS» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Learn Rust Coding, actualiza a CoddyKit PRO. El curso de Learn Rust Coding incluye 4 lecciones en total.

¿Qué aprenderé en «La mentalidad ECS»?

Entidades, componentes y sistemas Practicas Learn Rust Coding con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Learn Rust Coding?

No se requiere experiencia previa. Learn Rust Coding en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «La mentalidad ECS»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Learn Rust Coding?

Sí. Cada lección de Learn Rust Coding incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. La mentalidad ECS
  2. Crear y mover entidades
  3. Gestionar la entrada y el tiempo
  4. Colisiones y estado del juego
← Volver a Learn Rust Coding