Sposób myślenia ECS
Encje, komponenty i systemy.
Sposób myślenia ECS to bezpłatna lekcja Learn Rust Coding na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Learn Rust Coding, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Learn Rust Coding zawiera 4 lekcji w sumie.
Problemy rozwiązywane przez ECS
Bevy opiera się na wzorcu Entity Component System (ECS). Zamiast rozbudowanych hierarchii dziedziczenia komponuje się zachowanie z małych, niezależnych elementów danych.
Taki projekt zorientowany na dane zapewnia układ pamięci przyjazny dla pamięci podręcznej i pozwala silnikowi niemal bez dodatkowego kosztu rozdzielać pracę między rdzenie procesora.
Encje to tylko identyfikatory
Encja jest jedynie lekkim identyfikatorem — indeksem generacyjnym. Nie posiada własnych danych ani zachowania.
Można myśleć o niej jak o kluczu wskazującym wiersz w bazie danych. Komponenty przypisane do tego klucza nadają encji znaczenie, na przykład „Player” lub „Bullet”.
// An Entity is a tiny handle
struct Entity {
index: u32,
generation: u32,
}Komponenty to czyste dane
Komponenty to zwykłe struktury Rust wyprowadzające cechę Component. Przechowują stan, ale nie zawierają logiki.
Powinny być małe i wyspecjalizowane. Pozycja, prędkość i wartość zdrowia powinny być trzema osobnymi komponentami, a nie jedną monolityczną strukturą.
use bevy::prelude::*;
#[derive(Component)]
struct Position { x: f32, y: f32 }
#[derive(Component)]
struct Velocity { x: f32, y: f32 }Systemy zawierają logikę
Systemy to zwykłe funkcje operujące na komponentach. To w nich znajduje się cała logika gry.
Bevy analizuje parametry każdego systemu, aby ustalić, do jakich danych system uzyskuje dostęp, a następnie planuje równoległe uruchamianie systemów, które nie powodują konfliktów.
fn move_system(mut query: Query<(&mut Position, &Velocity)>) {
for (mut pos, vel) in &mut query {
pos.x += vel.x;
pos.y += vel.y;
}
}Zapytania: pobieranie danych
Query deklaratywnie żąda encji posiadających określony zestaw komponentów. Bevy zwraca tylko pasujące encje.
Można żądać współdzielonego dostępu za pomocą &T albo wyłącznego dostępu za pomocą &mut T. Informacje o pożyczaniu sterują planistą równoległości.
// 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);
}
}Filtrowanie zapytań
Drugi parametr typu Query jest filtrem. Użyj With i Without, aby zawęzić wyniki bez pożyczania danych tego komponentu.
Jest to idealne rozwiązanie dla komponentów znacznikowych — pustych struktur oznaczających rolę encji.
#[derive(Component)]
struct Player;
fn player_only(query: Query<&Position, With<Player>>) {
for pos in &query {
info!("player at {},{}", pos.x, pos.y);
}
}Zasoby: stan globalny
Niektóre dane są unikatowe dla całej gry — na przykład wynik, czas, który upłynął, lub ustawienia gry. Są one przechowywane jako zasoby, a nie komponenty.
Uzyskaj do nich dostęp w systemach za pomocą Res<T> w trybie odczytu lub ResMut<T> w trybie zapisu.
#[derive(Resource)]
struct Score(u32);
fn show_score(score: Res<Score>) {
info!("Score: {}", score.0);
}Konstruktor App
Wszystkie elementy łączy się w obiekcie App. Można dodawać wtyczki, wstawiać zasoby i rejestrować systemy w harmonogramie.
DefaultPlugins zapewnia obsługę okien, renderowanie, wejście i czas, dzięki czemu można skupić się na rozgrywce.
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.insert_resource(Score(0))
.add_systems(Update, show_score)
.run();
}Harmonogramy: Startup a Update
Systemy są uruchamiane w ramach harmonogramów. Startup wykonuje się raz po uruchomieniu aplikacji — doskonale nadaje się do tworzenia świata.
Update wykonuje się w każdej klatce i to w nim należy umieścić ruch, obsługę wejścia oraz logikę. Bevy oferuje również FixedUpdate do deterministycznych kroków fizyki.
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.add_systems(Update, move_system)
.run();Dlaczego kompozycja wygrywa
Potrzebujesz latającego przeciwnika, którego można zatruć? Wystarczy dołączyć komponenty Flying i Poisoned. Nie trzeba tworzyć nowej klasy ani łańcucha dziedziczenia.
Zachowanie wynika z tego, które systemy pasują do określonych kombinacji komponentów. Dzięki temu funkcje można dodawać, a refaktoryzacja jest tania.
// Same systems, new combinations
commands.spawn((Position{x:0.0,y:0.0}, Velocity{x:1.0,y:0.0}, Flying, Poisoned));Równoległość bez dodatkowego wysiłku
Ponieważ każdy system deklaruje swój dostęp do danych, planista Bevy wie, które systemy powodują konflikty. Systemy bez konfliktów są automatycznie uruchamiane na różnych wątkach.
Piszesz kod wyglądający na jednowątkowy, a silnik wydobywa z deklaracji pożyczania możliwość równoległego wykonania. Bez blokad i ręcznego zarządzania wątkami.
Szybkie sprawdzenie
Sprawdź swoją wiedzę o rolach ECS.
Podsumowanie: sposób myślenia ECS
Encje to identyfikatory, komponenty to dane, systemy to logika, a zasoby to stan globalny. Obiekt App łączy je za pomocą harmonogramów.
Komponując małe komponenty i pozwalając systemom dopasowywać je do siebie, uzyskuje się elastyczne, równoległe gry przyjazne dla pamięci podręcznej. Następnie utworzymy encje i wprawimy je w ruch.
Ucz się Rust dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 39
- Lekcje
- 144
Często zadawane pytania
Czy lekcja „Sposób myślenia ECS” jest bezpłatna?
Tak — pełny tekst „Sposób myślenia ECS” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Learn Rust Coding, przejdź na CoddyKit PRO. Kurs Learn Rust Coding zawiera 4 lekcji w sumie.
Co nauczysz się w „Sposób myślenia ECS”?
Encje, komponenty i systemy. Ćwiczysz Learn Rust Coding z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Learn Rust Coding?
Nie wymagamy żadnego doświadczenia. Learn Rust Coding w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Sposób myślenia ECS”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Learn Rust Coding?
Tak. Każda lekcja Learn Rust Coding zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Sposób myślenia ECS
- Tworzenie i poruszanie encjami
- Obsługa wejścia i czasu
- Kolizje i stan gry