2020-09-13

[99] Bevy Game Engine (画像を表示)

Bevy ゲームエンジン

Bevyで画像表示

  順番としてはもっと基本的な部分からやっていく必要があるのかも知れません。前回はHello World!をやりましたが、今回は簡単な画像を表示していきたいと思います。

Aaria.png

  左はアーリア(Aaria)のロゴになりますが、今回はこれをBevyアプリで表示してみたいと思います。もちろん画像ファイルは各自ご用意いただいたものをご自由に使っていただければと思いますが、ファイル名だけは異なると読み込めませんので、ご注意ください。
  前回作成した「games」(あるいは新たに作成した)プロジェクトフォルダのトップに「Aaria.png」という名で画像ファイルをご用意ください。以下のコードをmain.rsに貼り付け、「cargo run」にて実行します。
※以下のコードは今後もGitHubの方で内容が更新されていく可能性があります。大きく内容が変わることはありませんが、解説の修正やコードの改善など、Bevyのバージョンアップに応じても変わっていく可能性があります。その点、どうかご了承ください。
  これは現時点での私の理解の範囲の解説であり、必ずしも開発者の知識と一致するとは限らないことはご了承いただければと思います。実際の所、まだまだドキュメント制作まで十分に手が回っていない状態のため、ほとんど解説がないものもあり、こちらも手探りでやっている状態にあります。また、日々開発は進行しているため、バージョン次第ではコンパイルが通らない事態も生じる可能性はありますが、現時点ではこのままのコードをコピペするだけで動きます。ファイル名だけはお間違えのないようご注意ください。
  「ここまでは土台」とあるのは8行目までは土台コードであり、今回の画像表示とはあまり関係なく、飽くまで動かす際に必要になるものに過ぎません。

.add_default_plugins()

  前回もこれだけはなかったと思うので簡単に解説します。これはBevyアプリに必要十分なプラグインを一度に導入するもので、「おそらくこのコード」が置換えられたものと考えられます。最小のアプリ容量にこだわる場合、不要なプラグインはカットしていくのが最適解と思われますが、現在は全てまとめて導入してしまうほうが効率的に思います。
  1行目の「use bevy::prelude::*;」も同様で、多くのBevyの機能を一度に取り込んでいます。これは「prelude」にあるものが全て取り込まれていると考えられます(明確な解説がないため、曖昧な表現になってしまっていますが)。
  メインのCrate(他の言語でいうlibraryに相当)は「bevy」ですが、私が確認し記録しているbevyを名前に持つCrate(bevy_ecsなど)は加えて38(うち一つは予約の空Crate、bevy_util)あります。それぞれが個別のドキュメントを持つため、メソッドがどのCrateに属するかわからないと、検索してもヒットしないため、少々不便ではあります。もちろんBevyはRustによって作られているため、Rust自体のメソッドも使用していることがあるので、さらにやっかいです。VSCodeを利用しているならrust-analyzerの導入をおすすめします。どのCrateに属しているかを調べるのにも便利です。

  このように今は詳しいドキュメントがほとんどなく、Bevy自体が日々開発により改善されている状態のため、「動くコード」から情報を得ながら研究していくしか方法がないように思います。それをさらに応用して何らかのゲームが作れればよいのですが、ゲームエンジンをいじれるほどに専門知識があるわけではないため、手探り状態です。

  いずれエディタが登場する頃には大分扱いやすくなっていることを期待していますが、ただ待っているわけにもいかないため、しばらくは出来る限りの形で学習していけたらと考えています。

なぜBevyに注目しているのか

  もともとRust自体が、10年以上待ち続けていた理想のプログラミング言語だったりします。待っていたというと嘘になりますが、「これ一つ習得すれば他の言語はいらない」といえる万能言語をずっと探し続けていたのは事実で、どの言語もその理想には遠く及んでいなかったため、結局は「JavaScript」に落ち着いていました。プログラマーではないため、とにかく「一つだけ」にこだわっていました。そんな中、いつの間にか登場していたのがRustでした。多くの部分で私が夢に描いていた機能を実装しており、私にとっては正に理想のプログラミング言語でした。
  話はゲームエンジンに飛びますが、Godotは確かに理想に近いゲームエンジンでした。今でも素晴らしいものであるとの見方は変わっていません。ただ、ゲーム開発効率や開発のしやすさを重視している点は素晴らしいのですが、そのために「出来上がるゲームの性能を犠牲にしている」点、「ゲームエンジンを改良する場合はC++が必要な」点、「GDScriptという独自の言語を使わなければならない」点、「Rustも使えるとは言え、そもそもGodot自体はC++で作られている」点など、いくつか「理想的ではない」点はありました。
  実際Rustは扱いが難しいプログラミング言語であり、若い言語でもあったため、成熟したRust製ゲームエンジンがないのも仕方のないことでした。pistonの勢いがなくなり、Amethystも少し使ってみて(名前はかっこいいのですが)扱いづらさを感じていました。前にも記事で書いたので詳細は省きますが、どのゲームエンジンが良いか迷っていた頃に出会ったのがBevyでした。
  偶然というよりは「Rust製ゲームエンジン一覧」で、ある程度認知されている全Rust製ゲームエンジンを全て見てみて、何もめぼしいものがなかったら諦めてGodotに行こう……と最後の望みをかけ、やけに気になるゲームエンジンとして目についたのがBevyでした。
  以前記事にも書いたような気もしますが、BevyはRustに結構拘っており、100%Rustで書かれています。独自のエディタを作成予定で、そこでも独自のスクリプト言語は使わず、どこまでも「Rustのみで開発」することに執着しています。ゲームエンジンはもちろんゲームを開発するために作られたものではありますが、ゲーム以外のソフトウェアの開発にも使えると考えています。Rust+Bevyを学習することで、ゲーム以外のあらゆるソフトウェア開発にもその技術を応用していけるのではとも期待しています。もちろんある程度は(作ろうとするソフトの種類に)比例して学ぶべきものの量は増えてしまいますが、Rustのみで同様のことをやろうとするよりは、大分効率が上がることを期待できます。

今後どうしていくか

  本当は簡単なゲームでも作っていけたらと考えてはいるのですが、さすがにしばらくはコード解読と学習を続ける必要がありそうです。当記事でもBevyを紹介することも兼ねて簡単なコード解説の記事を書いていけたらと思っています。