La mentalità ECS
Entità, componenti e sistemi.
La mentalità ECS è una lezione Learn Rust Coding gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Learn Rust Coding, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Learn Rust Coding include 4 lezioni in totale.
Cosa risolve ECS
Bevy si basa sul pattern Entity Component System (ECS). Invece di usare gerarchie di ereditarietà profonde, componete il comportamento a partire da piccoli elementi di dati indipendenti.
Questo design orientato ai dati mantiene la disposizione della memoria efficiente per la cache e consente al motore di parallelizzare il lavoro tra i core della CPU quasi senza costi aggiuntivi.
Le entità sono solo ID
Un'entity non è altro che un identificatore leggero, ovvero un indice generazionale. Non possiede dati né comportamento propri.
Pensatela come a una chiave in una riga di database. I componenti associati a quella chiave danno un significato all'entità, come "Player" o "Bullet".
// An Entity is a tiny handle
struct Entity {
index: u32,
generation: u32,
}I componenti sono solo dati
I componenti sono semplici struct Rust che derivano Component. Contengono lo stato, ma non la logica.
Manteneteli piccoli e mirati. Una posizione, una velocità e un valore di salute sono tre componenti distinti, non un'unica struct monolitica.
use bevy::prelude::*;
#[derive(Component)]
struct Position { x: f32, y: f32 }
#[derive(Component)]
struct Velocity { x: f32, y: f32 }I sistemi contengono la logica
I sistemi sono normali funzioni che operano sui componenti. È qui che risiede tutta la logica del gioco.
Bevy analizza i parametri di ogni sistema per determinare quali dati utilizza, quindi pianifica l'esecuzione in parallelo dei sistemi che non entrano in conflitto.
fn move_system(mut query: Query<(&mut Position, &Velocity)>) {
for (mut pos, vel) in &mut query {
pos.x += vel.x;
pos.y += vel.y;
}
}Query: richiedere dati
Una Query richiede in modo dichiarativo le entità che possiedono uno specifico insieme di componenti. Bevy restituisce solo le entità corrispondenti.
Potete richiedere un accesso condiviso con &T oppure un accesso esclusivo con &mut T. Queste informazioni sui prestiti guidano lo scheduler parallelo.
// 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);
}
}Filtrare le query
Il secondo parametro di tipo di una Query è un filtro. Usate With e Without per restringere i risultati senza prendere in prestito i dati di quel componente.
È l'ideale per i componenti tag, ovvero struct vuote che indicano il ruolo di un'entità.
#[derive(Component)]
struct Player;
fn player_only(query: Query<&Position, With<Player>>) {
for pos in &query {
info!("player at {},{}", pos.x, pos.y);
}
}Risorse: stato globale
Alcuni dati sono unici per l'intero gioco, come il punteggio, il tempo trascorso o le impostazioni di gioco. Questi dati vengono gestiti come risorse anziché come componenti.
Accedetevi nei sistemi con Res<T> per la lettura o con ResMut<T> per la scrittura.
#[derive(Resource)]
struct Score(u32);
fn show_score(score: Res<Score>) {
info!("Score: {}", score.0);
}Il builder App
Tutto viene collegato in App. Potete aggiungere plugin, inserire risorse e registrare sistemi in uno schedule.
DefaultPlugins fornisce gestione delle finestre, rendering, input e tempo, permettendovi di concentrarvi sul gameplay.
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.insert_resource(Score(0))
.add_systems(Update, show_score)
.run();
}Schedule: Startup e Update
I sistemi vengono eseguiti all'interno degli schedule. Startup viene eseguito una volta all'avvio dell'applicazione, ed è perfetto per creare il mondo.
Update viene eseguito a ogni frame ed è il posto giusto per movimento, input e logica. Bevy offre anche FixedUpdate per i passaggi di fisica deterministici.
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.add_systems(Update, move_system)
.run();Perché vince la composizione
Volete un nemico volante che possa essere avvelenato? È sufficiente associargli i componenti Flying e Poisoned. Nessuna nuova classe e nessuna catena di ereditarietà.
Il comportamento emerge dai sistemi che corrispondono alle diverse combinazioni di componenti. In questo modo le funzionalità si aggiungono facilmente e i refactoring costano poco.
// Same systems, new combinations
commands.spawn((Position{x:0.0,y:0.0}, Velocity{x:1.0,y:0.0}, Flying, Poisoned));Parallelismo gratuito
Poiché ogni sistema dichiara il proprio accesso ai dati, lo scheduler di Bevy sa quali sistemi entrano in conflitto. I sistemi non in conflitto vengono eseguiti automaticamente su thread diversi.
Scrivete codice che sembra single-threaded e il motore ricava il parallelismo dalle vostre dichiarazioni di prestito. Nessun lock e nessuna gestione manuale dei thread.
Verifica rapida
Verificate la vostra comprensione dei ruoli di ECS.
Riepilogo: la mentalità ECS
Le entità sono ID, i componenti sono dati, i sistemi sono logica e le risorse sono lo stato globale. App li collega tramite gli schedule.
Componendo piccoli componenti e lasciando che i sistemi vi corrispondano, ottenete giochi flessibili, paralleli ed efficienti per la cache. Ora creeremo delle entità e le faremo muovere.
Domande Frequenti
La lezione «La mentalità ECS» è gratuita?
Sì — il testo completo di «La mentalità ECS» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Learn Rust Coding, passa a CoddyKit PRO. Il corso Learn Rust Coding include 4 lezioni in totale.
Cosa imparerò in «La mentalità ECS»?
Entità, componenti e sistemi. Eserciti Learn Rust Coding con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Learn Rust Coding?
Non è richiesta alcuna esperienza precedente. Learn Rust Coding su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «La mentalità ECS»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Learn Rust Coding?
Sì. Ogni lezione Learn Rust Coding include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.