rust bevy ecs getting start

wangki·2025년 7월 18일
0

Rust

목록 보기
39/55

개요

bevyecs에 대해서 관심을 가지게 되어서 Getting Start를 따라하면서 공부한 내용을 정리한다. 링크는 아래와 같다.
https://bevy.org/learn/quick-start/getting-started/apps/

내용

ECS란?

Entity Component System의 약자이다. ECS가 가지는 특성에 대해 간단히 알아보겠다.

  1. Entity (엔티티):
    • 무언가를 나타내는 고유한 ID이다.
    • 엔티티 자체는 데이터나 동작을 가지고 있지 않다. 단순히 데이터(컴포넌트)를 묶는 컨테이너 역할을 한다.
  2. Component (컴포넌트)
    • 엔티티에 부착되는 단순한 데이터 구조이다.
    • 컴포넌트는 특정 속성이나 상태를 정의한다.
    • 각 컴포넌트는 단일 목적을 가지고 있으며, 여러 엔티티가 동일한 타입의 컴포넌트를 가질 수 있다.
  3. System (시스템)
    • 컴포넌트를 쿼리하고 변경하는 로직(함수)이다.
    • 시스템은 특정 타입의 컴포넌트를 가진 모든 엔티티에 대해 작동하도록 정의된다.
    • 시스템은 데이터를 직접 소유하지 않고, 오직 컴포넌트 데이터에 대한 변환 및 업데이트 로직을 담고 있다.

Bevy에서 ECS사용해보기

  • App이란?
    게임 또는 애플리케이션 전체를 나타내는 가장 큰 객체이자 핵심적인 진입점이다.
    1. ECS 시스템의 컨테이너
    2. 플러그인 관리
    3. 실행 루프 제어
    4. 리소스 및 상태 관리
    플러그인과 시스템을 추가하여 애플리케이션을 실행하는 객체라고 생각하면 된다.
// bevy break out
use bevy::prelude::*;

#[derive(Component)]
struct Person;


#[derive(Component)]
struct Name(String);

fn setup(mut command: Commands) {
    command.spawn((Person, Name("kimwoojun".to_string())));
}

fn say_hello(query: Query<(&Name, &Person)>) {
    for person in &query {
        println!("hello {}", person.0.0);    
    }
}

fn change_name(mut query: Query<&mut Name>) {
    for mut name in &mut query {
        name.0 = "홍길동".to_string();
        println!("changed name: {}", name.0);
    }
}

fn main() {
    App::new()
    .add_systems(Startup, setup)
    .add_systems(
        Update, 
            (say_hello, change_name)
        )
    .run();
}

아직은 정확히 이해하지는 못했지만 나름 해석을 해보았다.
1. Person이라는 마커 컴포넌트를 하나 만들어준다. 식별을 위해서 사용한다고 한다.
2. Name이라는 컴포넌트를 생성해주고 튜플 구조체로 만들어서 String값을 가지도록 한다.
3. setup함수를 최초 실행 시 호출하여 entity를 생성한다.
4. add_systems를 통해 정해진 문법으로 등록한다.


실행 시 위와 같은 결괏값이 나온다.
기본적으로 병렬로 실행하기 때문에 업데이트 순서가 보장되지는 않는 것 같다. 순서를 보장하기 위한 방법도 있는데 나중에 더 자세히 공부해 보겠다.

결론

Data-Oriented-Programming 데이터 자체를 최우선으로 생각하고 데이터를 중심으로 프로그램을 구성하는 패러다임이다. 이런 방식으로 사고를 하는 게 꽤 어려운 것 같다. 그러나 새로운 주제라서 흥미롭고 재미있는 것 같다. 조금씩 이해하려고 노력해 보겠다. 다음에는 실제 2d를 만들어보고 싶다

0개의 댓글