Bevy 게임 엔진

15306 단어 rustgamedevtutorial
주의: 이 글을 다 쓴 후에 Bevy는 아주 좋은 것을 많이 받았지만 유감스럽게도 끊임없이 업데이트되었다.이 안내서의 코드를 더 이상 유지하지 않습니다.
녹슨 게 제일 좋은 언어니까.™, 의심할 여지없이 이것은 매력적인 게임 개발 선택이다.응, 내가 게임 개발을 말했을 때, 나는 게임 엔진 개발을 가리켰다. 왜냐하면rust 게임 엔진이 실제rust 게임보다 많기 때문이다.제 개요에 Rust gamedev가 나올 때마다 저는 새로운 엔진을 시도해서 튜토리얼에 따라 조작을 하고 Godot을 계속 사용합니다.이들 엔진은 대부분 모듈화와 확장성을 위해 단순성을 희생하였으며, 통상적으로 사용하기에는 흥미롭지 않다.

Bevy란 무엇입니까?


자신의 말로 말하자면 Bevy는 "Rust에 내장된 새로운 간단한 데이터 구동의 게임 엔진"이다.그것은 게임을 작성하는 데 필요한 최소한의 샘플일 수도 있다는 약속을 완전히 실현했다.그만해, 우리 직접 제작을 시작합시다!다음을 수행해야 합니다.
  • 녹에 익숙함
  • 최신의 안정적인 녹
  • 으로 화물을 설치하다

    Bevy에서 ECS 애플리케이션 작성


    Bevy는 ECS(실체 구성 요소 시스템) 체계 구조를 바탕으로 새로운 게임 제작 방식으로 다중 스레드에 우호적이며 표준 모델에 비해 성능을 향상시켰다.그것은 매우 유용하다. Unity 그들의 엔진을 위해 하나를 실현하고 있다.너는 비비 사이트에서 더 많은 정보를 알 수 있지만, 여기에 간략한 소개가 하나 있다.

    실체


    실체는 서로 다른 구성 요소의 집합이다.그것들은 bevy 엔진 내의 단일 id로 표시됩니다.

    구성 요소


    구성 요소는 원하는 모든 구성 요소가 될 수 있습니다.그것들은 녹슨 대상(structs 또는enumss)s로 표시되고 실체에 부착된다.

    계통


    시스템은 기능이다.구성 요소 집합에서 실행됩니다.예를 들어, 시스템
    fn my_system(a: &ComponentA, b: &mut ComponentB) {
        //code here
    }
    
    ComponentAComponentB를 연결하는 모든 실체에서 실행됩니다.쓰기 액세스 권한을 얻으려면 &mut 를 사용하십시오.이 시스템은 다음과 같이 쿼리 테이블로 작성할 수도 있습니다.
    fn my_system(query: mut Query<(&ComponentA, &mut ComponentB)>) {
        for (a, b) in &mut query.iter() {
            //code here
        }
    }
    
    이 함수는 한 번만 실행되며, 그 중 Query::iter() 은 교체기를 제공하기 때문에 수동으로 순환할 수 있다.

    리소스


    자원도rust 대상이지만 그 어떠한 실체와도 관련이 없습니다.반대로 그들은 모든 시스템에서 사용할 수 있다.다음과 같이 액세스할 수 있습니다.
    fn my_system(
        resA: Res<ResourceA>, 
        resB: ResMut<ResourceB>, 
        query: mut Query<(&ComponentA, &mut ComponentB)>
    ) {
        for (a, b) in &mut query.iter() {
            //code here
        }
    }
    

    그만해, 우리 시작하자.

    cargo new <project name>를 사용하여 새 항목을 만들고 선택한 편집기에서 엽니다.
    의존 항목에 bevy를 추가하려면 Cargo.toml 를 편집하십시오.작성할 때까지bevy 0.2.1가 최신 버전입니다.

    화물톰


    [dependencies]
    bevy = "0.2"
    
    컨텐트 가져오기 범위부터 시작합니다.bevy 섀시는 대부분의 게임에 필요한 모든 라이브러리를 하나의 섀시로 수집하는 지원 섀시입니다.

    주요했어루피


    use bevy::prelude::*;
    
    bevy를 사용하기 위해서, 그들은 응용 프로그램을 초기화하는 생성기 모드를 제공했다.

    주요했어루피


    fn main() {
        App::build()
            /* setup goes here */
            .run();
    }
    
    만약 우리가 지금 응용 프로그램을 실행하고 있다면, 아무 일도 일어나지 않을 것이다.이것은 App 기본적으로 어떤 내용도 제공하지 않기 때문이다.기본 기능을 추가하려면 add_default_plugins() 을 사용합니다.

    주요했어루피


    fn main() {
        App::build()
            .add_default_plugins()
            .run();
    }
    
    너는 회색 창문이 튀어나오는 것을 볼 수 있을 것이다.현재, 우리는 실체와 구성 요소로 우리의 응용 프로그램을 채워야 한다.이를 위해 우리는 부팅 시스템을 사용한다.

    주요했어루피


    fn main() {
        App::build()
            .add_default_plugins()
            .add_startup_system(setup.system())
            .run();
    }
    
    fn setup() {
        println!("setup!");
    }
    
    일반 시스템과 달리 부팅 시스템은 한 번만 실행되기 때문에 컨트롤러에서 setup! 한 번만 인쇄해야 합니다.
    이제 우리는 사이다를 추가할 수 있다.우리의 ECS 세계에 접근하기 위해서, 우리는 시작 시스템에 파라미터를 추가할 수 있으며, 이 파라미터들은 bevy가 자동으로 전달할 것이다.

    주요했어루피


    fn setup(
        mut commands: Commands, 
        mut materials: ResMut<Assets<ColorMaterial>>
    ) {
        commands
            .spawn(Camera2dComponents::default())
            .spawn(SpriteComponents {
                material: materials.add(Color::rgb(0.2, 0.2, 0.8).into()),
                transform: Transform::from_translation(Vec3::new(0.0, 0.0, 0.0)),
                sprite: Sprite::new(Vec2::new(32.0, 32.0)),
                ..Default::default()
            });
    }
    
    Commands는 ECS 세계로 전달되는 명령을 실행하는 스레드 보안 버퍼입니다.ResMut<Assets<ColorMaterial>>는 리소스Assets<ColorMaterial>의 소프트 핸들이며 리소스는 엘프의 재료 컬렉션을 만드는 데 사용됩니다.
    엘프를 표시하려면 먼저 내장 렌더링 시스템에 사용되는 카메라 솔리드와 렌더링 시스템에 의해 그려진 엘프 솔리드를 추가해야 합니다.
    지금 너는 창문 중간에 파란색의 작은 정사각형이 있는 것을 보아야 한다.
    이 강좌를 끝내기 위해서, 우리는 운동을 "게임"에 추가합시다.우리는 우선 플레이어 표시 구성 요소 (일반적인 빈 구조) 를 만들고 작은 정사각형 실체에 추가해야 한다.

    주요했어루피


    struct Player;
    
    fn setup(
        mut commands: Commands, 
        mut materials: ResMut<Assets<ColorMaterial>>
    ) {
        commands
            /* cut for brevity */
            .spawn(SpriteComponents /* cut for brevity */)
            .with(Player);
    }
    
    다음은 TransformPlayer를 가진 모든 실체에서 실행되는 새 시스템 (일반 함수) 을 만듭니다.이 시스템은 또한 키보드를 사용하여 자원을 입력한다. 이 자원은 하나의 내장 시스템에서 만들어진 것이다. 이 시스템은 add_default_plugins()의 일부분이다.그 밖에 우리는 반드시 건설자에게 시스템을 등록해야 한다.

    주요했어루피


    fn main() {
        App::build()
            .add_default_plugins()
            .add_startup_system(setup.system())
            .add_system(player_movement.system())
            .run();
    }
    
    fn player_movement(
        keyboard_input: Res<Input<KeyCode>>,
        mut query: Query<(&mut Transform, &Player)>,
    ) {
        for (mut transform, _player) in &mut query.iter() {
            let translation = transform.translation_mut();
            if keyboard_input.pressed(KeyCode::Right) {
                *translation.x_mut() += 1.0;
            }
        }
    }
    
    이제 오른쪽 화살표 키를 눌렀을 때, 우리의 제곱은 오른쪽으로 이동합니다.만약 네가 원한다면, 너는 이 동작을 완성할 수 있지만, 나는 여기서 하는 것이 귀찮다.여기에서 전체 코드를 찾을 수 있습니다.

    이산 이동. / 공부



    다음 글에서 우리는 더욱 복잡한 게임을 구축하기 시작할 것이다.당신은 베비에 대해 어떤 견해를 가지고 있습니까?공유하세요!

    좋은 웹페이지 즐겨찾기