Behind Coleus

大学生なのに特別大学で楽しいことが一 つもない。虐待と男子校病のせいにしてみる。→日本脱出しました 今ジャカルタにいます。→ジャカルタから帰ってきました。→6月19日から小笠原沖で、インドネシア人とメカジキ漁

筑波大学のPCでbevy engine環境構築に成功した。←結局諦めた。

これでやれる気がスルー

コマンド 'rustc' が見つかりません。次の方法でインストールできます:
snap install rustup  # version 1.27.1, or
apt  install rustc   # version 1.75.0+dfsg0ubuntu1-0ubuntu7.1
apt  install rustup  # version 1.26.0-3
他のバージョンについては 'snap info rustup' を確認してください。
コマンド 'cargo' が見つかりません。次の方法でインストールできます:
snap install rustup  # version 1.27.1, or
apt  install cargo   # version 1.75.0+dfsg0ubuntu1-0ubuntu7.1
apt  install rustup  # version 1.26.0-3
他のバージョンについては 'snap info rustup' を確認してください。
こうなった。どうすればいい?

rustを公式サイトのコピペ文を端末に打ち込んで、問題なくインストールしてたんだけど、cargoが出てこなくて、困ったそれをchatGPTに聞いたら、

② 手動で PATH を設定

Rustは ~/.cargo/bin にインストールされているけど、ターミナルがそのディレクトリを見ていない可能性がある。
なので、以下のコマンドで PATH に追加しよう:

echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
って帰ってきたこれを打ち込まないといけなかったらしくて、そしたら、急にできるようになった。

chatGPTないと無理だよ こんなのわからないよー

あと、コンパイルに一個3分位かかって無理。普段使いは無理かもしれん。
忍者と極道面白過ぎて、全部読んじゃった。



結局、bevy勉強することにしたので、これ終わるまで帰ってきません。探さないでください。

youtu.be

use bevy::prelude::*;

fn main(){
    App::new()
        .add_plugins(MinimalPlugins)
        .add_plugins(PeoplePlugin)
        .run();
}

pub struct PeoplePlugin;


#[derive(Component)]
pub struct Person {
    pub name: String,
}

#[derive(Component)]
pub struct Employed {
    pub job: Job,
}

#[derive(Debug)]
pub enum Job {
    Doctor,
    FireFighter,
    Lawyer,
}

impl Plugin for PeoplePlugin  {
    fn build(&self, app: &mut App){
 app.add_systems(Startup,setup)
            .add_systems(Update, (print_names, people_with_jobs, people_ready_for_hire, person_does_job));


    }    
}

pub fn setup(mut commands: Commands){
    commands.spawn*1;
    commands.spawn*2;

    commands.spawn*3;

    commands.spawn*4;

    commands.spawn*5;
}
pub fn print_names(person_query: Query<&Person>){
    for person in person_query.iter(){
        println!("Name:{}", person.name);
    }
}
pub fn people_with_jobs(person_query: Query<&Person, With<Employed>>){
    for person in person_query.iter(){
        println!("{} has a job", person.name)
    }
}

pub fn people_ready_for_hire(person_query: Query<&Person, Without<Employed>>){
    for person in person_query.iter(){
        println!("{} is ready for hire", person.name);
    }
}

pub fn person_does_job(person_query: Query<(&Person, &Employed)>) {
    for (person, employed) in person_query.iter() {
        let job_name = match employed.job {
            Job::Doctor => "Doctor",
            Job::FireFighter => "Fire Fighter",
            Job::Lawyer => "Lawyer",
        };
        println!("{0} is a {1}.", person.name, job_name);
    }
}

このコード解説していきます。
まず、目的としては、名簿のデータから、全員の名前の羅列、職が無い人、職がある人、職がある人は、その職の名前を表示させるというプログラムを書くことです。
そして、私が取り組んだのは、上に貼り付けた動画の授業内容である

github.com以上のコードを、bevy 15でも、動くように改変したプログラムである。


メイン関数にapp new とMinimalPlugin, People Plugin run
が追加されている。
で、app new、MInimalPlugin runはどれも基本的なbevy付属のもので説明は割愛する、お手本は、Default Pluginを追加しているが、それとの違いは、初期の何もないブラウザが表示されるかされないかという違いである。

今回作成したコードの大半は、People Pluginについてである。
People Pluginは、私が作成した、プラグインであり、関数がまとめて格納されている。
プラグインを作成するには、impl Plugin for PeoplePlugin{} というコードを用いて、上記の目的を達成するためのシステムを全て入れ込んだ。
プラグインは、build関数の中身解決する。
私は、スタートアップという関数をStartupスケジュールで追加し、

            .add_systems(Update, (print_names, people_with_jobs, people_ready_for_hire, person_does_job));

以上の関数をUpdateスケジュールで追加した。bevy10のコードがコンパイルできない原因は大抵ここにあり、

// 0.10
app.add_system(a)
// 0.11
app.add_systems(Update, a)
// 0.10
app.add_startup_systems((a, b))
// 0.11
app.add_systems(Startup, (a, b))

bevyengine.orgこの記事を参考に変更を加えた。UpdateやStartupなどの、スケジュールの記載が必要になった。
で、プラグインに追加した、関数の説明をしていく。もちろん全てpub関数になっている。
setup関数は、人の名前と職業のデータを読み込む関数だ。名前をstringでそのまま入力、職業を、Jobという列挙型から、一つ選ぶ仕組みにしている。

setup関数の引数は謎です。 エンティティを作る、commands.spawnを使うので、これが必要みたいです。

print names関数は、エンティティを設定したので、クエリ機能が使えます。引数に、personのクエリを持ってきます。 そして、for文で、personのクエリ分繰り返します。 つまり、全員分に対して繰り返す動作をしています。

で、繰り返し実行する内容としては、その人の名前を書いています。

people with jobs関数は、personに、Emplaoyedの要素もある人、つまり職業が設定されている人、を対象にpersonのクエリを取得し先ほどと同じように繰り返しをします。つまり、職のないbobだけがハブられる内容となっています。
繰り返す操作は、{name} has a jobと表示する動作をしています

people ready for fire関数は、personに、Employedの要素が無い人、つまり職業が設定されている人、を対象にpersonのクエリを取得し繰り返しをする内容になっています。

つまり、職のないbobだけが対象になります。

繰り返しす動作は、{name} is ready for jobと表示することです。

person does job関数は先ほどとは違います。まず、people with jobsと同様に、職のある人のクエリを取得します。 その後、その分繰り返しますが、jobname という変数をmatch関数で場合分けして与えます。

match value {
    pattern1 => expression1,
    pattern2 => expression2,
    _ => default_expression, // デフォルトのケース
}

match関数は、valueが特定の値だった時に特定の行動を返す関数です。

pub fn person_does_job(person_query: Query<(&Person, &Employed)>) {
    for (person, employed) in person_query.iter() {
        let job_name = match employed.job {
            Job::Doctor => "Doctor",
            Job::FireFighter => "Fire Fighter",
            Job::Lawyer => "Lawyer",
        };
        println!("{0} is a {1}.", person.name, job_name);
    }
}

これは、employed.jobが、job::Doctorだったら、job nameにDoctorを代入するという操作です。なお、letは、ただの変数の宣言です。

プログラミングの検証

実行結果は、ビルド関数において、updateスケジュールにしてまとめて追加したので、順不同で繰り返し表示されているが、当初の目的は達成されている。
まず、4つの表示結果(全員の名前、職がある人の名前、無い人の名前、職がある人の職名)が入力したデータと比べて間違っていないことが挙げられる。
まず、Name:の部分は、しっかり5人分の名前が表示されている。
has a jobの部分は、職のないボブだけがハブられている。

is ready for hireの部分はその逆、
{name} is a {job name}の部分も全て表示されている。
結果、完璧!!!
QED

*1:

        Person{
            name:"Alex".to_string(),
        },
        Employed{
            job: Job::Doctor
        }
   

*2:Person {

        name: "Bob".to_string(),
    },

*3:

        Person {
            name: "Charlie".to_string(),
        },
        Employed {
            job: Job::FireFighter,
        },
   

*4:

        Person {
            name: "David".to_string(),
        },
        Employed { job: Job::Lawyer },
   

*5:

        Person {
            name: "Ellen".to_string(),
        },
        Employed {
            job: Job::FireFighter,
        },