2020-09-22

[131] Bevy (ゲームエンジン) - テキスト表示

  今回はテキストを表示するコードです。ほとんどのゲームで使用する重要な部分でしょう。以下ではフレーム毎にFPSの値を表示させています。
※このコードを実行するには前に記事でご紹介したように、assetsフォルダのコピーが必要になります。

[130] Bevy (ゲームエンジン) - ボタン設置

  今回はボタンを設置するコードです。オンマウス、クリックなどでボタンの色やテキスト表示が変更されます。ゲームにおいてもわりと重要な部分でしょう。
※このコードを実行するには前に記事でご紹介したように、assetsフォルダのコピーが必要になります。

[129] Bevy (ゲームエンジン) - シェーダー定義

  今回も解説量は控えめです。前回と同様にシェーダーとカスタムマテリアルに関するコードです。

[128] Bevy (ゲームエンジン) - カスタムマテリアルとシェーダー

  今回は解説量が少ないです。3Dに関してはこれから学ばなくてはならないことが沢山です。特に3D関連の操作部分に関してはBevyエディタに色々頼りたいところです。

2020-09-20

[127] Bevy (ゲームエンジン) - プロパティを扱う

  今回は解説が少なくて申し訳ないところですが、一応コードを公開いたします。詳細な分析は今後していく予定でいます。今回は飽くまでメモ程度に。

[126] Bevy (ゲームエンジン) - バージョン0.2.0公開

  私がBevyに関わってから初のバージョンアップになります。少しexamplesの解析にもたもたしている間に、バージョン0.2.0の公開となりました。
  BevyのドキュメントもURLが代わっており、個人的にリンクしていたページを全て入れ替える必要が出てきました。どうもマスター版がないような感じなので、今後もバージョンアップの度にリンクを更新するのも少し面倒に感じるので何か手はないものかと思っています。
  まだ読んではいませんが、新しい記事も公開されました。今後も良いペースでBevyが更新されることを願っています。当ページではまずはexamplesの解析を一通り済ませてしまいたいと考えています。

2020-09-19

[125] Bevy (ゲームエンジン) - シーンの読込みと保存

Bevy ゲームエンジン
  シーンの読込みを行うコードです。このコードでは保存の代わりにコンソールに内容を表示します。
  .instanceの部分は、元々.spawnとあり、エラーで起動しなかった部分を書き直したものです。他に置換えできるメソッドには.loadがありましたが、(このメソッドが影響しているかは分かりませんが)どちらも起動時、print_systemにてシーンファイル書き換えに反応しません。Bevy自体がまだ開発段階にあるため、この部分の問題は現在のところあまり深くは追求しないことにしたいと思います。
※このコードを実行するには前に記事でご紹介したように、assetsフォルダのコピーが必要になります。

2020-09-18

[124] Bevy (ゲームエンジン) - キーボード操作

Bevy ゲームエンジン
  今回も簡単なキーボード操作のコードです。様々なキー操作に反応します。

[123] Bevy (ゲームエンジン) - キーボード操作

  今回はキーボード操作に関連するコードのご紹介です。KeyCode一覧より様々なキー操作に対応できます。以下のコードでは「A」キーに対しての処理を行っています。

[122] Bevy (ゲームエンジン) - マウス操作

Bevy ゲームエンジン
  今回もマウス操作に関するコードになります。シンプルなコードですが、ゲームにおいては重要なものです。

[121] Bevy (ゲームエンジン) - マウス操作

  今回は簡単なマウス操作に反応してメッセージを表示させるコードです。フレームごとに処理を実行します。

[120] Bevy (ゲームエンジン) - ブロックくずし

Bevy ゲームエンジン
  今回は初のゲームの試作版のようなプログラムになります。コード自体もそれなりのボリュームになります。慣れてしまえばこのくらいのコードはスラスラと書けてしまうのでしょうが、慣れないうちは見様見真似で書いていくしかないでしょう。
  正直なところ、当たり判定においてバグのような現象が出ることがあります。Bevy自体の修正を待つところでしょうか。
  Bevyエディタがこれらのコードの生成効率をどのくらい高めてくれるかは想像くらいしかできないところですが、これに関しては期待して待つのみでしょう。

[119] Bevy (ゲームエンジン) - 並列処理

  詳細に解説しきれていない部分もありますが、画像ファイルを読込み、並列で移動処理を行うコードです。並列処理にはイテレータを使用しています。
※このコードを実行するには前に記事でご紹介したように、assetsフォルダのコピーが必要になります。

2020-09-17

[118] Bevy (ゲームエンジン) - ECS基本構造

  今回は少し長めのコードですが、ちょっとしたゲームのようなプログラムになっています。元のコードではBevyのECSに関する詳細な解説もついていますが、以下のコードでは各コード行に関する解説に留めています。rand crateを使用しているため、実行毎に異なる結果が得られます(Cargo.tomlの[dependencies]以下にrand = "0.7.3"の追加が必要)。
  小さなゲームとは言え、プログラムの基本的な骨格が見えてくるように思いますが、ある程度の規模のものになれば、とても1ファイルでは扱えない量になっていくでしょう。その意味でもBevyエディタの早めの実装に期待したいところです。

[117] Bevy (ゲームエンジン) - イベントの送受信

  ゲームで多用するイベントの送受信に関するコードです。イベントを作成し送信する一方で、受信待機させるコードも必要です。

[116] Bevy (ゲームエンジン) - カスタム診断

  今回のコードは具体的な活用事例に関連付けて解説しづらい部分のため、コード解説のみに留めさせていただきたいと思います。 
  加えて診断プラグインを追加するコードです。

[115] サイトデザインの(多少の)変更

ちょっとしたデザイン変更

  以前、Bloggerの方のバグで、一部リンク機能が壊れていましたが、最近その修正が確認できたので、それに合わせてサイトのデザインに少々変更を加えました。
  左側のサイト内検索を上部に移し、AdSenseも下に移動させました。気が向いたらサイトをさらにシンプル、あるいは使いやすく改造できないか検討してみたいと思っています。基本的にはただただ記事を追加していくだけのサイトになっていますが、もう少しブログ的ではなく、サイト的にしていけたらなとも考えていたりします。

Aaria.exeと今後の話

  Aaria.exeのプロジェクトが、ある意味想定外にも完了してしまい、Aaria.dbも非公開扱いにしてしまったため、当サイトの役割はAaria.exeの紹介からゲーム関連の情報提供の場へと移行しつつあります。もちろん特にテーマを絞っているわけではないため、上記とは関係のないネタでの記事も色々書いていくことにはなるかとは思いますが。
  昔と比べると最近は「ホームページ」というよりは「ニュース記事的」な情報が多く生まれては消えるようになっており、当サイト(ブログ)もその流れの中にいるような気がしています。Aaria.dbがあまりに情報量が増えてきた関係で、共に配布するには負担が増すと考え、公開はAaria.exeのみに絞っていますが、断片的な情報が流れては消えていく今の時代、価値ある情報を各自が永久に保存し伝えていくのに理想的なソフトウェアとしてAaria.exeを開発しました。各自が自分にとっての理想のデジタル情報環境を構築していってもらえればと考えています。ほぼ改良の余地なしと判断できる段階にきたため、今後バージョンアップはほぼありませんが、現在、Firefoxにてローカル動画再生が上手くいかないため、(将来の)Bevyにて独自の動画再生ソフトを作成し、それをメディア再生用として組み込むということは視野には入れています。同じローカルとは言え、ブラウザよりさらに高速再生が期待できるように思いますし、完全対応ブラウザとしてFirefoxも加わることになりそうです。
  先程Firefoxを久々にインストールして使ってみたところ、速度は十分なものがありました。最近のバージョンで「はてなブックマーク拡張」が調子悪く、必ずしもBraveやChromeに万能感を感じているわけでもないため、常に視野は広げておきたいと考えています。ただ、ブラウザによる動画再生のメリットとして、タブ化して同じwindowとして一緒にしたり切り離したりできる点で、配置などにおいて扱い安いため、一長一短がないとも言えません。

アーリアの今後

  アーリアでの活動のメインはしばらくはBevyを中心としたゲーム関連の話題になりそうです。加えて他にもちらほらゲームとは関係のないネタも記事にしていけたらと考えています。

[114] Bevy (ゲームエンジン) - 音楽ファイルの再生

  今回はゲームにおいては実用的なコード、音楽ファイルの再生です。ただ、今現在は1度再生するだけでリピート機能は実装されていません。コード側で同様の効果を持たせることは可能ですが、リピート機能はいずれ必ず実装される機能ですので、おとなしく待った方がよいように思います。コード自体に新しい部分はほとんどありません。
※このコードを実行するには前に記事でご紹介したように、assetsフォルダのコピーが必要になります。

[113] Bevy (ゲームエンジン) - アセットのホットリロード

  今回はホットリロード、つまりゲーム実行中にディスク上のアセットを変更した場合、その変更がすぐにゲームに反映される機能のご紹介です。
※このコードを実行するには前に記事でご紹介したように、assetsフォルダのコピーが必要になります。
 ポイントは.watch_for_changes()によるアセットの管理です。ここではMonkey.gltfを変更するとゲーム実行中でもその変更が反映されます。

[112] Bevy (ゲームエンジン) - アセットのロード方法

  今回はアセットの読込み方法をコードでご紹介。それらを表示するまでの手順です。アセットは並行して同時に、バックグラウンドでロードされますが、直後のコードで使用したい場合などは.load_syncを使い同期でロードします。


  このコードを実行するには前に記事でご紹介したように、assetsフォルダのコピーが必要になります。

2020-09-16

[111] Bevy (ゲームエンジン) - プラグイン基本構造

  プラグインの構造がよく分かるコードです。Bevyの独特なプログラムスタイルが見えてくるような気がします。

[110] Bevy (ゲームエンジン) - シンプルなアプリ

  今回はカウントを表示するだけのシンプルなコードです。Bevyでは不要なpluginを省くことで軽いアプリを生成することもできます。

[109] Bevy (ゲームエンジン) - 3D立方体の回転

  前にご紹介したコードと似ていますが、色変更処理も入っています。一部詳細解説が抜けている部分もありますが、ご了承ください(以前に説明したコードに関しては説明を省略していることがあります)。
  3Dに関しては特に、コードだけでゲームを制作していくには限界を感じてしまいます。3Dゲーム制作に適したエディタの登場を期待したいところです。

[108] Bevy (ゲームエンジン) - 3D空間でのテクスチャ表示

  今回は3D空間に画像をテクスチャとして貼り付けていくコードです。z座標で前後にずらし、透明度を利用することで、重ねて表示させています。
  ちなみに左図の左の鳥(3匹セット)がBevyのロゴになります。Rustのロゴのカニが何故か非公式のように、公式認定されているかまでは(現時点で)はっきりしていませんが、語源というかBevy自体が「鳥の群れ(活気に満ちた開発者communityを望んでつけられた)」という意味を持ち、それに由来するため、今後新たなロゴ案が出てこない限りは自然と公式ロゴとして扱われていくように感じています。
※実行には前にご紹介した方法でassetsフォルダをコピーしておく必要があります。

[107] Bevy (ゲームエンジン) - 3D画像によるストレステスト

Bevy ゲームエンジン
  今回はストレステスト用のプログラムで、1000の立方体をランダムで表示させ、それを位置、色共に変化させます。
  例のごとく以下のコードをmain.rsに貼り付けますが、「Cargo.toml」ファイルの[dependencies]の下に「rand = "0.7.3"」という行を加えます。これはランダム数を発生させるCrate(Library)です。
  また、実行のときは「cargo run」で表示が遅いと感じたら「cargo run --release」も実行します。リリース版はコンパイル時間がかかる分、高性能なバイナリを吐き出すため、最終製品をコンパイルする際には「--release」を追加します。両者の速度差を比較してみるのもよいかも知れません。
  まだBevyにはより最適化する予知が残っているらしく、今後パフォーマンスがより良くなることを期待できるそうです。

2020-09-15

[106] Bevy (ゲームエンジン) - 3Dシーン描画

Bevy ゲームエンジン
  今回はあまり新しいコードはありません。平面、立方体、球体を配置し、ライトとカメラで表示を完了します。
  球体は正二十面体をより細かく表現することで生成します。
  ウィンドウを縦サイズ0になるまで縮小するとクラッシュ(panic)するバグは、どのコードでもあるようです。

[105] Bevy (ゲームエンジン) - 親Nodeと子Nodeの配置

Bevy ゲームエンジン
  今回は親Nodeと子Nodeの配置を行うコードです。子Nodeは親Nodeに応じて回転します。

  追加で解説することは特にありません。

[104] Bevy (ゲームエンジン) - 3D画像を描く

Bevy ゲームエンジン
  今回はコードで立方体を描きます。辺の長さと色を指定するだけの簡単なプログラムです。

  最初、from_translationの部分でエラーが出たので、一旦「Cargo.lock」を削除し、再度最新版のBevyをダウンロードしコンパイルをし直しました。"v0.1.3"では動いていたので、途中で何らかの変更がバグを作り出し、その後の修正でデバッグされたと考えられます。
  少し具体的にはTransformがドキュメントではMat4所属になっていたので、その部分に関係するものと予想されます。「Mat4::from_translation」に修正しても上手くいかなかったので、上記のように最新版のBevyを再コンパイルしました。

  コード自体はシンプルです。まだface_towardの各値の部分など、細かく調査はしていませんが、将来エディタが実装されればマウスドラッグなどで簡易に調整できるようになるはずです。3Dゲームをコードのみで作成していくのはさすがに無理そうなので、アーリアではしばらくは2Dゲーム中心でいく予定でいます。もちろん学習は3Dも含めてやっていきます。

  Msaa{ samples: 8 }は1~8で設定でき、最も高画質は8となっていますが、シンプルな立方体なのでほとんどマシンパワーなしでいけると思います。

[103] Bevy(ゲームエンジン) - 3D画像簡易表示

Bevy ゲームエンジン
  今回は簡単な3D画像の表示です。前回のようにGitのインストールと「git clone https://github.com/bevyengine/bevy」によってassetsフォルダのコピーが必要になります。
  準備ができたら以下のコードをmain.rsに貼り付け、cargo runを実行します。


  add_resourceによってMsaa{ samples: 4 }を取得しています。数値は1~8で、多いほどマシンパワーを要する分、高画質で表示します。

  PbrComponentsにより2度、3DCGのファイルを読み込んでいます。加えてライトとカメラも追加しています。ライトがないと画像は真っ黒になり、カメラがないと何も表示されないため、どちらも必須の要素となります。
  Bevyは2Dにも3Dにも対応したゲームエンジンです。色々な情報を読んだ限りでは、Bevyは特に3Dに力を入れていくような雰囲気を感じました。もちろんこれは2Dは手抜きにという意味は含んでいません。
  まだしばらくはコード解析の記事を続けたいと思っています。また、詳細なプロパティ設定の仕様などの調査は、まだ後の段階として保留中です。細部を知る前にまずは全体を知っておきたいためです。
  ちなみにこれらのコードは全てexampleにあります。今の時点では、開発版の一番最近のアップデートは「5分前」となっており、現在進行系で開発が続けられています。最新版ではこれらのコードが動かなくなる可能性もあるかと思いますし、部分部分ではまだ試行錯誤中のものもあるかと思うので、まずは全体像を把握してから実践的な部分の学習に入ろうかと思っています。
  バージョンアップの過程を追いながらも、遊べる(形になる)ゲームの作成も並行してやっていけたらそれが理想なのですが……。

※GitHubのコード解説においては、前回までの記事で一度解説している部分についてはその解説を省略しています。もちろん例外的に再度解説している部分もあるかとは思いますが、基本的には「初出」のコードを対象に解説させてもらっています。

  以下はBevyの土台となるコードです。今後も新たなコード知識が加わるに応じて更新されていく可能性があります。小さな知識のブロックを組み合わせるだけで、加えて細部の調整できる箇所を調整していくだけで、ゲームを制作していく……今の段階での試行錯誤の初回目標でもあります。

[102] Bevy (ゲームエンジン) - TextureAtlas

Bevy ゲームエンジン
  今回は複数の画像を1枚の画像として表現するコードの解析です。
  実際に多くの画像ファイルを使用するため、まずはbevyのコードを落とすことにします。Gitが必要になるのでインストールしておきましょう。Bevyの開発にも通常必要になります。コンソールを開き、作業したいフォルダにて

$ git clone https://github.com/bevyengine/bevy

を実行します。bevyフォルダに移動し、そこからassetsフォルダを前回のプロジェクトのメインフォルダにコピーします。前準備は以上で完了です。以下のコードをmain.rsにコピペしてcargo runを実行します。

.init_resource

  resourceを初期化して追加します。RpgSpriteHandlesにはDefault traitを実装します。

不具合部分

  起動時、上記のような画像が表示されない場合があります。その際はウィンドウサイズを変更することで表示されます。また、表示サイズをどこまでも小さくすると、縦幅が0になった時点でBevyアプリはクラッシュ(panic)し強制終了します。

コード解説について

  ドキュメントがない分、どの行で具体的にどのような処理がされているかを詳細に示せていない部分もあります。将来的にはこれらをエディタで視覚的にわかりやすく扱えるようになっていることを期待しますが、まだまだ開発途上の段階故、今はこの程度の解説にとどめておくこと、ご了承いただければと思います。

英語(スペル)の扱いについて

  IT系の専門用語には、英語のスペルをそのまま日本語読みにしただけのカタカナ語が数多く存在しています。コンピュータ(computer)やプログラミング(programming)他、様々ありますが、当記事や(特にGitHubのコメント)では、そのような単語は直接spellで示すことがあります。カタカナの方が全角で容量も文字幅も入力手間もかかることが多く、コンピューターとコンピュータ、エディターとエディタなど、統一できていないものも多いため、Aaria.exeなどで扱う場合にも不便が生じることがあるためです。現時点ではBevyに関連した日本語情報は当ブログ記事を除いて皆無のため、用語などは全て英語にて把握している関係もあり、「関数」「変数」「借用」「継承」など、ある程度明確に日本語に翻訳されている場合を除いては、classやgame engine、save/loadなど、直接英単語のまま使うようにしています。どうせ日本語で書くにしてもそのままカタカナに翻訳しただけのもののため、なじまない方もおられるかも知れませんが、その点だけ、ご了承いただければと思います。

2020-09-14

[101] 一枚絵をスクロール - アニメーション

Bevy ゲームエンジン

  ちょうど100回目の記事……と思ったのですが、今後はBevy関連の記事が増えていくように思ったので、100回目に当たる記事はBevyのページにしました。
  今回は簡単なアニメーションコードの解説をしたいと思います。

add_system

  指定した関数を.system()でSystem型に変更し、stageに追加します。stageはScheduleによって順に関数を実行していく仕組みであり、Scheduleとはstageの集合で、Bevyアプリにてframe毎に1回ずつ実行されます。簡単に言ってしまえばadd_systemにて追加された関数は、フレームごとに1回ずつ処理されることになります。ゲームやアニメの「1コマ」ごとにさせたい処理を追加するということです。前の記事でも書きましたが「ここまでは土台」とありますが、これは今回の記事でのメインのコードではなく、コード自体を動かすのに必要なコードのため、詳細には触れていません。

TextureAtlas

  複数の画像を結合し効率化する仕組み。Bevyのドキュメントにはまだこの解説は書かれていませんが、恐らく実際も近い解説になると予測されます。

add_startup_systemとadd_system

  全体の構造を見ると、このコードは「setup関数」を定義しadd_startup_systemにてstartup system(アプリ起動時に1度だけ実行される)に追加、「animate_sprite_system関数」を定義しadd_systemにてstage(フレーム毎に1回ずつ処理を行う)に追加しています。
  不思議なのはsetup関数もanimate_sprite_system関数も定義こそされていますが、引数を受け取っていません。.system()によってSystem型に変更され引数として渡されているだけで、なぜか動いています。Rustの基礎を終えたばかりでこのコードを目にした方は(あるいはこの手のコードを始めて見られる方も含め)面食らうかと思います。
  これはBevyがECSであることと深く関わりのあることで、恐らく結構大掛かりな解説になり(加えて私自身も丁寧に説明できるほどには十分に理解しているわけではないため)、適切な解説ページを見つけたらご紹介したいと考えています。
  登録された関数は、それが使われる際に適切な引数が与えられ、適切な対象に対し、適切なタイミングで実行されます。最初に実行されるsetup関数にて各設定処理が行われ、その後フレームごとにanimate_sprite_systemが実行されます。animate_sprite_systemは毎回forにてtimer.finishedでfrom_secondsで設定した秒数が経過しているかをチェックし、その都度、indexをずらすことでfrom_gridで分割した画像を順にずらしながら表示しています。

sprite.index = ((sprite.index as usize + 1) % texture_atlas.textures.len()) as u32;

は、分割数で割った余り(%)を返すことでリピート表示を実現しています。7分割であるなら、7で割った余りである0~6のindex値が返ることになります。

コード解説記事は今後も

  私自身、現在は手探りでやっています。本当はもう少し深く解説できるところまで分析するのも手なのでしょうが、今は一通り全体像を把握しておきたいので、ドキュメントのない今は、分かる範囲で進めていきたいと考えています。チリも積もればで、細かい技術情報を少しずつ理解しながら近々簡単なゲームでも作れるところまで行ければと期待しています。Godotレベルのわかりやすいドキュメントの充実まではまだまだ時間がかかるかと思いますし、そもそもRustがGodotより簡単に扱える日は来ないようにも思うので、わからないままにコードの分析を続けていくのもいい勉強になるのではとも思っています。

Bevy - Rust製ゲームエンジン

BevyRust製ゲームエンジンです。

基礎事項

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を紹介することも兼ねて簡単なコード解説の記事を書いていけたらと思っています。

[98] Bevy (game engine) 導入編

Bevy ゲームエンジン

当記事の対象者

  元々技術系のサイトと言うわけではないのですが、今回はRust製ゲームエンジン「Bevy」の導入編として「Hello World!」レベルの基本的な部分に触れてみようと思います。前提としてRustのインストールと実行環境の準備が必要になります。できれば初心者レベルのRustの知識が欲しいところですが、Bevy自体がRustを使って書くものであり、今回触れるのは入門部分だけですので、全く知識がなくても何とかなるレベルだと思います。

最初のHello World!

  Rustインストール後、開発用のフォルダを作りたい場所でコンソール(PowerShellなど/Visual Studio Codeなどのエディタからでも可能)から

$ cargo new games

  と入力します($は入力行であることを意味します/$自体を入力する必要はありません/以下同様)。するとそのフォルダに「games」フォルダが作成されます。

$ cd games

  と入力し、そのフォルダに移動します。そのフォルダにある「Cargo.toml」をエディタなどで開きます。これには今作った「games」プロジェクトの基本データが書かれています。一番下に

[dependencies]

とあるはずなので、その下行に

$ bevy = { git = "https://github.com/bevyengine/bevy" }

と記載します。配布元であるcrates.ioでは(執筆時)

bevy = "0.1.3"

とありますが、これは公開用の最新バージョンです。Bevyは現在も活発に開発が行われており、このバージョン(0.1.3)以降の修正は適用されていません。まだまだ不安定であるが故、開発最新版を手に入れるため、上記のように直接URLを指定します。バージョン1.0.0である程度安定するまでは、開発進行を最新版で追うために、アーリアではしばらくはURL(開発)版を使っていこうかと思っています。

  現在Bevyでは主にRustのnightly版を使用しています。nightly版とはRustの最新開発バージョンで、通常のstable版と比べ、最新の(そして不安定な)機能を使えるようになっています。いずれBevyもstable版で十分に使えるように仕上げてくるとは思いますが、現在は高速コンパイルなど、nightly版でしか使えない機能も使用するため、以下のようにしてnightly版を導入します。

$ rustup default nightly

  ちなみに現在の(games)プロジェクトのみでnightly版を使いたい場合は上行の代わりに

$ rustup override set nightly

  とします。nightly版がインストールされていない場合、適用前にダウンロードとインストールの作業が入るため、少々(数分程度?)時間がかかります。

  高速コンパイルを行うため、現在の(games)フォルダに新たに「.cargo」フォルダを作成し、その中に「config」ファイルを作成、config_fast_buldsにある内容をコピペします。
  全てのコードが必要なわけでなはく、Windows 10を使っているのであれば、

[target.x86_64-pc-windows-msvc]

  から下のコードだけで十分です。#の行はコメントなので削除してしまっても問題はありません。
  一番下の2行

[profile.dev]
debug = 1

  は、マクロなどを沢山使用していてコンパイル時間が遅い場合に特に効果があるようです。デバッグ情報が削減されることによる高速化のため、お好みで。

  以上で前準備は整いました。とりあえずは「Bevy」をコンパイルしてしまいましょう。

$ cargo run

  コンパイル時間は環境にもよりますが、5分ほどです。上手くいけばコンソール画面に「Hello Wolrd!」と表示されるはずです。ただしこれは通常のRustのコードであり、Bevyプログラムではありません。

BevyのHello World!

  ここではBevyアプリとして「Hello World!」を表示してみます。
  src/main.rsファイルを以下のように書き換えます。
  最も簡単なBevyアプリです。「cargo run」を実行すると同様に「Hello World!」が表示されます。
  これはfnで定義した「hello_world」関数を「.system()」でSystem型に変更し、それを「.add_startup_system()」に渡すことで、名前のとおり「startup system」に加えています。startup systemとは、アプリ起動直後、最初に一度だけ実行されるものです。最後の「.run()」でApp(Bevyアプリ)を実行しています。
  あまりにシンプル故にこれはECS(エンティティ・コンポーネント・システム)を説明するには情報不足なコードではあるのですが、これがBevyの「Hello World!」です。

現在の進展具合

  思っていたよりもBevy The Bookの内容は短く、逆に最初のNews記事(Introducing Bevy)は分量のあるものでした。現在はDiscordで活発に様々な機能ごとに議論が行われており、日々Bevyは進化している状態にあります。英語とRustに慣れている方なら「Bevyの公式サイト」全てに目を通すのにさほど時間はかからないように思います。逆にCrateの解説に細かい情報がないため、また、現在も恐らく大きな改変が度々起こっている故、ライトユーザーにとってはできることは少ないかも知れません。exampleAwesome Bevyなどで実際のコードを読みながら研究していけば、Bevyと同時にRustの勉強にもなりそうに思います。もちろん、技術のある方なら積極的に開発に関わっていくという選択肢もあるでしょう。
  将来的にはエディタを実装し、Godotのようなゲームエンジンに近づくものと予想されます。もちろんRustのみで開発していくゲームエンジンということで、Godotよりは高いプログラミング技術が要求されることには代わりはないでしょうが、「ゲームの開発効率」も重視しているそうなので、Rustが使えるゲーム開発志望者の方は、プロジェクト参加してみてはいかがでしょうか。

2020-09-09

[97] bevy - Rust製ゲームエンジン

  日本語での情報は(今現在において)皆無だったので、日本においてはこれがbevyに関する初記事になるかと思います。


bevyとの出会いのきっかけ

  過去の記事([94] [82])でも何度か迷いを見せているところですが、Rust製のゲームエンジンこそ私にとっての理想のゲームエンジンであり、その一方でGodotも十分に優れたゲームエンジンであり、特に扱い安さにおいてRust製ゲームエンジンがGodotに勝てる日は来ないであろうという予想から、やはりGodotしかない……というところに落ち着いていました。

  一方、今後長く使っていく技術を選ぶ以上、後悔のない「これこそ」というものを求めていたのも事実で、これがGodotとRustの間で揺れていた理由であったりもします。Rust自体はものすごく気に入っているプログラミング言語(Aaria.exeもRust製)であり、それで作られたAmethystというゲームエンジンは、Rust製というだけで魅力的に映りました。

  Amethystの問題点に関しては[94]でも軽く触れましたが、やはり扱いづらそうな点とコンパイル時間の長さなどで、その上将来性に関してもいまいち確信が持てなかった故、気持ちはほぼGodotに向いていました。

  それでもモヤモヤが消えなかったため、Rustのゲーム開発用のページの、ゲームエンジンのページ(現在31個)にて、全てのゲームエンジンをチェックしてみることにしました。

  30以上の登録があったので、一つ一つ細かく見るのは大変かと思っていたのですが、基準として2Dと3Dの両方を扱えるもの、何年も開発が放置されているものは避け……とちょっとした条件でさえ、クリアしているものは意外に少ないことがわかりました。Rust自体が若いため、ゲームエンジンにおいて長年の開発を経たものがないのは当然のことです。そして(ほんとうに)一つだけ、やけに気になるものが残りました。それがbevyです。


bevyはどんなゲームエンジンか

  初commitを調べてみると「2019年11月」とあり、最初のバージョン(0.0.1)の記録では2020年1月19日とあります。将来性どうこうを予想するにはあまりに新しいゲームエンジンです。ただ、勢いがあり、登場して間もないわりにやけに形になっている……というのが第一印象でした。ものすごく興味が湧いてきたので、まずはインターネットにあるできるだけ全ての情報にあたってみようと考えました。

  日本語情報は皆無……海外の記事もかなり少なかったため、(100%ではないにしろ)Googleでヒットした一通りの情報はチェックできたように思います。今は公式サイトのLearnを途中まで読み進めており、休憩にこの記事を書いています。その後はサンプルゲームなどのコードを読みながら学習を進めたいと考えています。

  bevyと比べればAmethystをご存知の方(かた)の方(ほう)が多いように思います。過去にも当サイトで少し触れているRust製のゲームエンジンです。実はbevyもAmethystに似たゲームエンジンであり、Rust製というだけでなく、ECSスタイルでゲームをプログラムしていくという点でも同じだったりします。

  bevyの生みの親であるCarter Andersonさんは、元Microsoftのプログラマーで、その仕事をやめてbevyのプロジェクトに専念するようになり、過去にはGodotに関わっていたり、Amethystに関しては結構(参考として)研究を重ねていたようです。Amethystと比べてより短いコンパイル時間、より開発効率が上がるように注力し、ゲーム開発者にとって実用的なゲームエンジンを目指す……という思想が伺えます。

  現在はまだ達成できていない要素も含みますが、bevyは全て「Rustのみで開発」できることを目指しているようで、Godotでいうスクリプト言語(GDScript)の実装はしないそうです。技術的にもその方がコンパイル効率は高く、私としてもRustのみで開発できるというのは嬉しい利点に思います。コンパイル時間をどこまでも短くすることで、スクリプト言語の利点をRustのままで得ようという試みもされています。

  加えていずれ専用のエディタも実装するようなことを言っていました。今はまだVisual Studio Codeでの開発ですし、コードの点だけを見るならVSCodeは非常に優れた開発環境のように思います。ただ、ゲーム開発は加えてグラフィカルな表示機能も求められており、それを様々なIDEで使えるプラグインとして開発するよりは、独自のエディタとして開発するほうが、より理想的なものになる……との考えでしょうか……私はもちろん専用エディタを望む派です。

  ECSのメリットに関しては少し昔のものですが、データ指向設計について解説した記事がわかりやすいように思います。ザックリ言ってしまえば並列処理性能が高い、メモリを効率的に扱える、プログラミングの複雑さを回避できる、そしてRustとの相性が良い……といったところです。

  まだ開発初期段階のゲームエンジンのため、逆に資料全てに目を通すのが楽、サンプルを細かく見ていく余裕もあり、じっくり研究していける……など利点もあります。まだbevyを知ってやっと3日目に入った……くらいの超超初心者なので、このゲームエンジンがどの段階まで開発されているのか確認はとれていません。ただ、簡単なブロック崩しゲームをコンパイルしてプレイできるところまでは確認しているため、シンプルなゲームであれば作れる段階にはあるようです。当サイトでも、練習で作ったゲームなどを公開していければとも思っています。


bevyに期待すること

  Rustのみで作られたゲームエンジンであり、Rustのみで開発でき、いずれ専用エディタを使っての開発……と期待は色々あるのですが、やはり性能重視のゲームが作れるという点が一番の期待所です。シムシティのようなゲームで、自分の作った街で多くの人が生活している姿をよりリアルに表現できたら……などと思うことがよくあります。そういったマシンパワーを贅沢に使いそうなゲームは、性能重視のゲームエンジンでないと思うようには作れないように思います。

  正直ゲームエンジン選びに迷いに迷い、まだbevyにも出会ったばかり……今後どうなるか私にも予想はつきませんが、今はこのbevyとの出会いに感謝したいと思っています。

2020-09-06

[96] 2D&3Dの間取り図を作成

無料で2D&3Dの間取り図を作成できる「Floor Plan Creator」

  ミニマリズムの究極の形として「トレーラーハウス」をこの手のソフトで設計してcm単位で間取り図を書いた経験があるのですが、同じことがGodotなどのゲームエンジンでも出来るなぁ……と考えてしまいました。Godotではキャラクター他、ゲームに登場する各パーツを1ファイルに保存する機能もあり、一度作成したパーツは様々なゲームに使い回すことも簡単にできます。パーツさえ沢山用意すれば、あとはそれを配置するだけで色々な表現ができるようになります。
  作成した部屋はそのまま3D表示するだけでなく、その中をキャラクター視点で歩き回ったり、直接キャラクターの手で物を移動することもできます。ライトなど3DCG関連の機能により、部屋の光の届き具合などをチェックすることもできるかも知れません(明るさの調整などは難しそうですが……lmなど上手く対応できるのだろうか)。

  ゲームエンジンが特定のジャンルに特化したゲーム制作ツールと大きく違うところは、ゲーム以外のソフト制作にも色々応用が効きそうな部分です。Godotのエディタ自体がGodotによって作られたゲームと言われており、つまりGodotではゲームエンジンのような制作ツールを作成することも可能なようなので(RPG in a BoxというRPG制作ツールもGodotによって作られているゲームです)、期待は広がります。

  一時期RustやAmethystに浮気しかけたため、再びGodotに戻った今は一から情報を丁寧にまとめようとネット中を色々探っている最中です。早いうちに学習から制作の段階に移行したいところですが、もう少し期間がかかりそうです。

[95] 意外と高評価なGodot

  Slantは様々な製品のランキングを、質問とその応答にて作り出していくサービスですが、意外とGodotが高評価だったのでリンクしておきたいと思います。

  ユーザー数は結構多いみたいですが、似たような質問もあり、割と自由な感じで営まれてる印象もあります。ゲームエンジンに関する評価では、Godotは割と多くの部門で1位を獲得しており、思っていたよりも"良さが認知されている?"感じでした。

  Slantのユーザー自体がFreeなものをより高評価する傾向があるのかも知れませんし、一方で最近のGodotのバージョンアップによる性能向上は大きく、v4.0ではVulkan実装と、性能アップに応じた反応(評価)が早いということの現れと見ることもできるかも知れません。

  英語版なので少々とっつきづらい部分もありますが、IT関連の製品情報(もちろんゲームも)が多く対象になっているようなので、様々なランキングに目を通してみるのも面白いかも知れません。

2020-09-05

[94] 再びGodot vs Amethyst

  最近紙の書籍でRust入門の本を読み、Rustやっぱりいいなぁ……となりまして、その流れで再びAmethystに興味が出て少し基本的な部分を勉強していました。以下は個人的なメモのような意味合いが強かったりはしますが、結局Godotを選んだ理由になります。


Amethystについて

  前の記事に書いた通りではあるのですが、やはりAmethystは使いこなすには少々専門的なことを割と多く学ばなければならない感じでした。以下が結局のところGodotがいい……となった理由です。

1. 習得がやはり大変。多くのCrate(Libraryのようなもの)を集めたもので、ゲームエンジンというよりはフレームワークに近い部分もあり、構成要素を自由にいじれる点では好きなようにできる反面、やはりそれぞれについて深く学ぶ必要がある点、負担が大きい。

2. かなりプログラマ寄り。Rustでゲーム開発……ということで、スクリプト言語や開発用エディタなどの支援があるわけでもなく、Rustのコードで直接書く分、やはりどうしても開発効率の点で難がある。ゲームのちょっとしたことに対し、多くの新たな知識/技術が要求される可能性が高く、それなりのゲームが作れるようになるまでには結構なレベルのゲームプログラマに成長していそう……くらいに要求される情報量が多そうに感じた。

3. Amethystはゲームエンジンとしての枠組みを持ち、全て自分でプログラムするよりは大分開発効率は上がるとは言え、やはり"ゲーム制作に集中"できるほど楽にプログラムを組めるわけではなく、ゲームクリエイターというよりはゲームプログラマーという位置づけになりそうなゲームエンジンであった。恐らく習得後も純粋な開発効率はGodotと比べると大分落ちることが予測される。

4. コンパイル時間が長い。ちょっとしたソフトに15分以上、GB単位のファイルが生成される(完成exe自体はGodotより抑えられているくらいには小さいが)。Crate(Library)を多く組み合わせる性質上、プログラムパーツの管理が色々と大変なことになりそう……Crateのバージョンアップや過去のゲームコードの管理など、ファイル数や容量がかなりのものになりそう……それに素材の存在も考えると、結構大掛かりなコード管理が予想される。シンプルでコンパクトなGodotとは対照的。


Amethystのメリットは

  悩むのは、やはりAmethyst自体にもRust製という大きなメリットがあるため。出来上がるゲーム(exeファイル)の容量は少なく、メモリ安全(かつ省メモリ)で実行速度も速い……Amethystを使いこなす段階にもなればゲームエンジン自体へ手をつけることもそこまで無理ではなくなっているのでは……つまりかなり細部までいじることができる。

  C++やC#を学ぶ予定はないため、Godotでは同様のことができるようになることはないだろうし(ゲーム性能面はRustで対処が可能だが、Godot自体はC++で作られているのでいじれない)、恐らくより高性能な処理(多くの並列処理)が要求されるゲームはAmethystでないと作れない……というケースもあるように思う。

  恐らく(一人ではという条件を除けば)作れないゲームはなくなるように思う。技術習得さえ乗り切れば、Amethyst(Rust)には、どこまでも自由にゲームを作れる……という期待が持てる。


Godotのデメリット

  Godotにもデメリットはある。同じ内容のものならGodot製のゲームはAmethyst製のゲームより性能(特に並列高速処理)は落ちるように思う。非常に大きなデメリットではあるが、突き詰めればそれ一つだけかも知れない。

  Amethystのメリットに自由さを挙げたが、これは決してGodotで作れるゲームデザインに制限がかかるといった類のものではなく、"Godot流が強要される"程度のもの。性能面の制限範囲内での制作というのは、ゲーム開発の常であるし、ゲームプログラマー的な細部の拘りができない分、ゲームデザイナー的な拘りをすればよい、くらいに思っている。


ちなみにUnity/UEは?

  この期に再びUnityやUnreal Engineのことも考えてみた。どちらも3D寄りで、Unityはやはり無難な選択肢かも知れない……と思う一方、無料/有料ユーザーの差、結局は無料とは違うサービスなのだということが強く実感させられたので、以前にも何度か書いた記事の通り、完全無料のGodotがやはり……となった。


Godotに期待するもの

  将来性の面はやはり大きい。AmethystもRustの将来性を考えると、今後本格的なゲームプログラマーの選ぶゲームエンジンという分野で、強力な選択肢にのし上がってくるように思うけども、Godotは非プログラマーも対象にできる点で、ユーザー数がAmethystに抜かれる未来はないように思う。

  何よりも大きなポイントが、非常にシンプルな構成(エディタ)で、ゲームデザインとの相性のよい開発スタイル(シーンやノードのシステム)、(エディタ支援による)開発効率もよく、コンパイルも速く、(Amethystと比べれば)習得も楽な点で(より自信を持って)極めていこう……という気になれる。まだまだ発展途上で、今後もよりよくなっていくことが期待できる点もよく、まだ開発中らしいがブラウザでの開発もそろそろ実現しそうな段階にある。

  総合的に見るとGodotはかなりゲームの開発効率を高めてくれるという点においてはAmethystを大きくリードしているように思う。

  色々遠回りしてしまった感はあるけども、再び1から英語版(情報量の多さより、専門用語も英語で統一したい)でGodotの学習を開始したいと思っています。