Learn Rust Coding · 강의

ECS 사고방식

엔터티, 컴포넌트, 시스템을 배워 보세요.

레슨 1/413개 단계

ECS 사고방식은(는) CoddyKit의 무료 Learn Rust Coding 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn Rust Coding 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.

ECS가 해결하는 문제

Bevy는 엔터티 컴포넌트 시스템(ECS) 패턴을 기반으로 만들어졌습니다. 깊은 상속 계층을 사용하는 대신, 작고 독립적인 데이터 조각을 조합하여 동작을 구성합니다.

이 데이터 중심 설계는 메모리 배치를 캐시에 친화적으로 유지하고, 엔진이 CPU 코어 전체에 작업을 거의 추가 비용 없이 병렬화할 수 있게 합니다.

엔터티는 그저 ID입니다

엔터티는 가벼운 식별자, 즉 세대가 있는 인덱스에 불과합니다. 엔터티는 데이터를 소유하지 않으며 자체적인 동작도 없습니다.

데이터베이스 행의 키라고 생각하면 됩니다. 그 키에 연결된 컴포넌트가 엔터티에 의미를 부여합니다. 예를 들어 "Player"나 "Bullet" 같은 역할을 나타낼 수 있습니다.

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

컴포넌트는 순수한 데이터입니다

컴포넌트는 Component를 파생시키는 일반적인 Rust 구조체입니다. 상태를 담지만 로직은 포함하지 않습니다.

컴포넌트는 작고 한 가지 역할에 집중하도록 유지하십시오. 위치, 속도, 체력 값은 하나의 거대한 구조체가 아니라 서로 분리된 세 컴포넌트입니다.

use bevy::prelude::*;

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

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

시스템이 로직을 담당합니다

시스템은 컴포넌트에 대해 작업하는 일반 함수입니다. 모든 게임 로직은 시스템에 작성됩니다.

Bevy는 각 시스템의 매개변수를 검사하여 어떤 데이터에 접근하는지 파악한 다음, 충돌하지 않는 시스템을 병렬로 실행하도록 예약합니다.

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는 특정 컴포넌트 집합을 가진 엔터티를 선언적으로 요청합니다. Bevy는 일치하는 엔터티만 반환합니다.

&T로 공유 접근을 요청하거나 &mut T로 배타적 접근을 요청할 수 있습니다. 이 대여 정보가 병렬 스케줄러를 작동시킵니다.

// 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);
    }
}

쿼리 필터링하기

Query의 두 번째 형식 매개변수는 필터입니다. With와 Without을 사용하면 해당 컴포넌트의 데이터를 대여하지 않고 결과를 좁힐 수 있습니다.

이는 태그 컴포넌트에 적합합니다. 태그 컴포넌트는 엔터티의 역할을 표시하는 빈 구조체입니다.

#[derive(Component)]
struct Player;

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

리소스: 전역 상태

일부 데이터는 게임 전체에서 하나만 존재합니다. 예를 들면 점수, 경과 시간, 게임 설정 등이 있습니다. 이러한 데이터는 컴포넌트가 아니라 리소스로 존재합니다.

시스템에서 읽기 접근이 필요하면 Res<T>를, 쓰기 접근이 필요하면 ResMut<T>를 사용하십시오.

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

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

App 빌더

모든 요소는 App에서 연결합니다. 플러그인을 추가하고, 리소스를 삽입하고, 일정에 시스템을 등록합니다.

DefaultPlugins는 창 관리, 렌더링, 입력, 시간을 제공하므로 게임플레이에 집중할 수 있습니다.

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

일정: 시작과 업데이트

시스템은 일정 안에서 실행됩니다. Startup은 앱이 시작될 때 한 번 실행되므로 월드를 생성하기에 적합합니다.

Update는 매 프레임 실행되며 이동, 입력, 로직을 처리합니다. Bevy는 결정론적인 물리 단계를 위한 FixedUpdate도 제공합니다.

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

조합이 강력한 이유

독에 중독될 수 있는 비행 적을 만들고 싶으신가요? Flying과 Poisoned 컴포넌트를 연결하기만 하면 됩니다. 새 클래스나 상속 계층이 필요하지 않습니다.

동작은 어떤 시스템이 어떤 컴포넌트 조합과 일치하는지에 따라 만들어집니다. 따라서 기능을 쉽게 추가할 수 있고 리팩터링 비용도 적습니다.

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

추가 비용 없는 병렬 실행

각 시스템이 데이터 접근 방식을 선언하므로 Bevy의 스케줄러는 어떤 시스템끼리 충돌하는지 알 수 있습니다. 충돌하지 않는 시스템은 자동으로 서로 다른 스레드에서 실행됩니다.

여러분은 단일 스레드 코드처럼 작성하지만, 엔진은 대여 선언에서 병렬 실행을 추출합니다. 잠금도 수동 스레드 관리도 필요하지 않습니다.

빠른 확인

ECS의 역할에 대한 이해도를 확인해 보십시오.

복습: ECS 사고방식

엔터티는 ID이고, 컴포넌트는 데이터이며, 시스템은 로직이고, 리소스는 전역 상태입니다. App이 일정을 통해 이들을 연결합니다.

작은 컴포넌트를 조합하고 시스템이 이에 맞춰 작동하도록 하면 유연하고 병렬 실행이 가능하며 캐시에 친화적인 게임을 만들 수 있습니다. 다음에는 엔터티를 생성하고 움직여 보겠습니다.

무료로 시작

AI 튜터와 함께 Rust을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
39
레슨
144

자주 묻는 질문

“ECS 사고방식” 강의는 무료인가요?

네 — “ECS 사고방식” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn Rust Coding 강의 전체를 잠금 해제할 수 있습니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.

“ECS 사고방식”에서 뭘 배우나요?

엔터티, 컴포넌트, 시스템을 배워 보세요. 브라우저에서 직접 실행하는 실습 코드로 Learn Rust Coding을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Learn Rust Coding을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Learn Rust Coding은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“ECS 사고방식” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Learn Rust Coding 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Learn Rust Coding 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. ECS 사고방식
  2. 엔터티 생성하고 이동하기
  3. 입력과 시간 처리하기
  4. 충돌과 게임 상태
← Learn Rust Coding(으)로 돌아가기