ビービーゲームエンジン


注:これは書かれているので、Bevyは多くの素晴らしいが、悲しく、壊れて更新を受けています.このガイドのコードは維持されません.
さびは最高の言語だから™, それはゲーム開発のための魅力的な選択肢であったことは驚きではない.さて、私がゲーム開発を言うとき、私はゲームエンジン開発を意味します.さびたgamedevがいつも私のフィードでポップアップするたびに、私は新しいエンジンを試して、チュートリアルに従って、Godotを使用して戻ってください.これらのエンジンのほとんどは、モジュール性と拡張性のためのシンプルさを犠牲にし、一般的には動作するように楽しくはなかった.

どのような利益ですか?


Bevyは、それ自身の言葉で、「錆で造られた、爽快で単純なデータ駆動型ゲームエンジン」です.それは完全にゲームを書くために必要な少なくともボイラー板と、この約束を提供します.しかし、それについては、実際に作るためにまっすぐにジャンプしよう!次のようにします.
  • 錆がよくわかる
  • 最新の安定したさびでインストールされる貨物を持ってください
  • EVYアプリをbevyに書く


    BevyはECS(Entity Component System)アーキテクチャに基づいており、マルチスレッドフレンドリーなゲームを作る新しい方法であり、パフォーマンスと標準モデルの向上をもたらす.とても便利です.Unity はエンジンの一つを実装している.あなたはBevyのウェブサイトでより多くを学ぶことができますが、ここでは迅速なランダウンです.

    実体


    エンティティは、個別のコンポーネントのコレクションです.それらはbevyエンジン内の単一のIDで表されます.

    コンポーネント


    コンポーネントは何でも好きです.これらは錆オブジェクトで表されるstruct Senums となります.

    システム


    系は関数である.彼らはコンポーネントのコレクションを実行します.例えば、システム
    fn my_system(a: &ComponentA, b: &mut ComponentB) {
        //code here
    }
    
    両方のComponentA and ComponentB 添付.お使いください&mut 書き込みアクセスを得る.このシステムは、“クエリフォーム”でも書くことができます
    fn my_system(query: mut Query<(&ComponentA, &mut ComponentB)>) {
        for (a, b) in &mut query.iter() {
            //code here
        }
    }
    
    この関数は、Query::iter() イテレータを与えるので、手動でループすることができます.

    資源


    リソースはまた、錆オブジェクトですが、それらはエンティティに関連付けられません.代わりに、使用するすべてのシステムで利用可能です.このようにしてアクセスできます:
    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> , と選択のあなたのエディタで開きます.
    編集しましょうCargo.toml そして、依存を我々の依存に加えてください.執筆中bevy 0.2.1 最新版です.

    カーゴ.トムール


    [dependencies]
    bevy = "0.2"
    
    スコープに物をインポートして起動します.The bevy クレートは、実際には、ほとんどのゲームを1つに必要なすべてのライブラリを収集するヘルパー枠です.

    メイン.RS


    use bevy::prelude::*;
    
    Bevyを使用して起動するには、アプリケーションを初期化するためのビルダーパターンを提供します.

    メイン.RS


    fn main() {
        App::build()
            /* setup goes here */
            .run();
    }
    
    我々のアプリを実行する場合は、何も起こりません.それでApp デフォルトでは何も提供しません.使用するadd_default_plugins() 基本的な機能を追加します.

    メイン.RS


    fn main() {
        App::build()
            .add_default_plugins()
            .run();
    }
    
    あなたは灰色のウィンドウがポップアップ表示されます.今、我々は、エンティティやコンポーネントを使用してアプリケーションを設定する必要があります.このため、起動システムを使用します.

    メイン.RS


    fn main() {
        App::build()
            .add_default_plugins()
            .add_startup_system(setup.system())
            .run();
    }
    
    fn setup() {
        println!("setup!");
    }
    
    通常のシステムと異なり、起動システムは一度だけ実行されるので、setup! あなたのコンソールに一度だけ印刷されます.
    今、我々はスプライトを追加することができます.ECSの世界にアクセスするには、スタートアップシステムに引数を追加することができます.

    メイン.RS


    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 Worldに渡されたコマンドを実行するスレッドセーフバッファです.ResMut<Assets<ColorMaterial>> リソースへの変更可能なハンドルですAssets<ColorMaterial> , これは、スプライトを作成するために使用する材料のコレクションです.
    スプライトを表示するには、まずレンダリングシステムによって使用されるカメラエンティティと、レンダリングシステムによって描画されるスプライトエンティティを追加する必要があります.
    今、あなたは窓の真ん中に小さな青い正方形を見るべきです.
    このチュートリアルをラップするには、私たちの“ゲーム”に移動を追加しましょう.まず最初に、プレイヤーマーカーコンポーネント(規則的な空の構造体)を作成し、小さな四角形エンティティに追加しなければなりません.

    メイン.RS


    struct Player;
    
    fn setup(
        mut commands: Commands, 
        mut materials: ResMut<Assets<ColorMaterial>>
    ) {
        commands
            /* cut for brevity */
            .spawn(SpriteComponents /* cut for brevity */)
            .with(Player);
    }
    
    次に、すべてのエンティティで動作する新しいシステム(通常の関数)を作成しますTransform and Player . このシステムはまた、キーボード入力リソースを使用しますadd_default_plugins() . さらに、我々はシステムをビルダーに登録しなければなりません.

    メイン.RS


    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;
            }
        }
    }
    
    今、右矢印キーを押すと、我々の正方形の右側にシフトします.この動画はお気に入りから削除されています.ここで完成コードを見つけることができます.

    エタニョン / 見習いする



    次の記事では、より複雑なゲームの構築を開始します.あなたの考えは何ですか?共有してください!