2020-11-12

[Aaria/bevy] Snake2 - AariaToys

ニュース
 Snake2は前作のSnakeの第2弾です。bevy 3.0とそれに応じたSnakeのチュートリアルを参考にコードをいじっていたら前作とは随分と異なる操作感のものになったため、Snakeをアップデートするよりも別のゲームとして公開することにしました。
 AariaToysシリーズはゲームのルール自体を改変しながらおもちゃのブロックで遊ぶように創造的なプレイを楽しむゲームシリーズとなっています。コードでの配布のため、Rustをコンパイルする環境が必要ですが、機会がありましたらぜひ一度プレイしてみてください。
 ゲームの詳細はSnake2のページをご覧ください。

2020-11-11

[Aaria/bevy] Bevy Games

 この度、Rust製ゲームエンジンbevyに関するコードの情報をまとめたbevy_gamesのページを作成しました。bevyを使って書かれたコードへのリンクや、AariaToysシリーズなどのページも用意しています。今後も多くのbevy関連のコードが公開されていくと思われるので、公開ページとしてまとめていくことにしました。

 bevyは現在も開発段階であり、バージョンアップごとに前のバージョンでは動いていたコードが動かなくなるなど、破壊的な改変が今も続いています。
 また、これは予測/目安としての情報なのですが、半年後にはだいたいの機能が安定、1年後にはかなり完成に近づく・・・ような発言がありました(飽くまで目安であって予定ではないのでご注意ください)。

 個人的にAaria.exeによりバージョン3.0用に大きく変更されたCrate bevyの情報は修正したのですが、今後も大きな改変は続くと予測されるので、bevyを使ってゲーム制作の練習をすると同時に、この機会に丁寧にRust自体を学習しなおそうかとも検討しています。

 少し前にbevyの技術的な記事をいくつか書いてはいたのですが、今後も大きく仕様が変更されることを考えると、ほとんど需要0な情報のように感じたので、しばらくbevyに関する技術的な記事は書かない予定でいます。

 Rustは便利なもので、依存するCrateのバージョンさえ古いままにしておけば、そのCrateのバージョンアップによりコードが破壊される事態が起こっても、依存バージョンを維持すれば従来通りコンパイルが通ります。過去記事でbevyは最新バージョンに維持して使う・・・との記述をしましたが、Hashである程度固定するか、公開バージョンに合わせて使っていくほうが混乱が起こりづらく、よいのかも知れません(この前最新バージョンでコードをテストした際、myfunction.system()の部分でエラーが発生しました)。

 半年以内には登場すると思われるエディターに期待しているところですが、それまでにはある程度(最低限のレベルの色々な)ゲーム制作に慣れているのが理想と考えています。今のところ余裕を見てAariaToysシリーズに属する簡単なゲームを作っていけたらとも考えています。

2020-11-05

[bevy] v0.3 リリース

 ここ一ヶ月以上、bevy以外のことに多く時間をとられており、bevy 2.0の公開もここで通知し逃してしまいましたが、先日(11月3日)bevy 0.3がリリースされましたので、今回は通知させていただきたいと思います。

Bevy 0.3のアップデート内容

・Androidサポート:多くの機能を備えてはいるものの、まだ開発段階であり、機能しないものもあります。(インストールexample)
 Androidの静的ライブラリをサポートするbevy-glsl-to-spirvの更新
 タッチのサポート
 テクスチャーフォーマットの修正
 タッチUIの修正
 Androidオーディオサポート 他
・iOSサポート:まだ機能するものとしないものがある段階です。(インストールexample)
 オーディオはまだ完全には機能していません。
・WASM(WebAssembly)アセットの読み込み:HTTP経由でアセット(画像や音楽ファイルなどゲームの素材のようなもの)を取得可能。
 asset_server.load("sprite.png"); // コード例
 まだ完成段階にはありません。
・タッチサポート:Touchesを実装。
・アセットシステムの改善:アセットに参照カウントを実装し、アセットが自動で解放されるようになりました。アセットの読み込みに関しても柔軟性が増しました。
 let handle = asset_server.load("sprite.png"); // これまではResult<Handle<T>, AssetServerError>で結果を返していましたが、シンプルにHandle<T>を返すようになりました。unwrap()が不要になる分、よりコーディングが快適に。
 let second_handle = handle.clone(); // クローンなどを作成することにより、参照カウントが加算(+1)されます。
他にも多数あります。

 一方で削除された項目なども多数あります。(以下に一例)

「load_asset_folder」「load_sync」「AssetLoader.from_bytes」「load_from_file」「get_version」などのメソッド。
「AssetChannel」「AssetInfo」などの構造体。
「AssetLoadRequestHandler」などのトレイト。

 思っていたよりはるかに多くの追加/削除が確認できました。上記はごく一部を抜粋したものに過ぎません。個人的にbevy関連のドキュメントは全て独自にまとめていたのですが(様々な技術情報も詳細に独自に記録していくためにも)、まだまだ発展途上段階にあるBevyの変わりようは、(想定こそしていましたが実際に直面してみると)思っていたよりも不安定で、現時点での技術を常に最新の状態に(個人的に)まとめていくのはかなり非効率的であると感じました。最終的には自分にとっての理想の技術本に仕上げるためにもこの作業(ドキュメントを独自にまとめる作業)は欠かせないとは考えていますが、今は全体像が簡単に把握できる程度にどどめ、Rust自体の学習や、実践的に色々なゲームを作ってみることに集中したほうが良さそうです。

 エディターは半年後くらいに安定したものが出るかも知れない・・・と「予想」できる発言がありました。もちろんどこまでも予想なのですが、今までは「検討もつかない」状態だったので、少し目安になる情報ではと感じています。
 エディターはゲームをより効率的にわかりやすく開発する上で非常に重要なものです。もちろんbevyの場合、これはRustの学習を不要にするものではないのですが、この部分はbevyに対し最も期待している要素の一つでもあります。

bevy需要

 まだまだ(日本では)bevy需要もないようで、当サイトのbevy記事も検索エンジンからは「Rust ゲームエンジン」経由のものがほとんどだったりします。bevyは開発途上の段階であり、ドキュメントもバージョンアップごとに大きく変更を迫られる可能性が大のため、不安定なドキュメントの充実はさけられている状態です。私個人はGoogleでヒットする限りの全てのbevy(GameEngine)の情報にあたり、一通りドキュメントをまとめ、今はDiscordの会話全てに目を通そうとしている段階にありますが、しばらくbevy中心の学習を離れ、一旦Rust自体の学習、あるいは簡単なbevyを使ったゲーム制作練習に取り掛かろうか検討中です(思っていたよりバージョンアップによるbevy自体の仕様変更が大きかったため)。
 今までbevyは関連するbevy_xxxxクレートの検索をbevyから行えなかったため、独自のdbに情報をまとめる効果は大きかったのですが、今回のアップデートでbevyから全要素に対し検索がかけられるようになりました。わりと大掛かりなドキュメント構造の変更のため(今後はここまで大きな変更はあまりないと予測していますが)、この期に再度bevy情報を整理しておこうかとも考えています。
 当サイトでもbevy情報は扱っていこうとは考えていますが、丁寧なドキュメントはbevyのバージョンアップごとに価値がなくなってしまう可能性もあるため、ほどほどにしておきたいとも思っています。恐らく今の段階でbevyをいじってみようと考えている方は英語で直接情報を仕入れようと考えている方が全てだと思うので、当サイトで中途半端な解説情報を載せてもあまり意味もないような気もしてきました。実はこの前に公開したSnakeも公開した後、既に「最新バージョンではコンパイルできない」ことに気づき、コードを修正しようか迷っていました。最新情報を追いながら、安定版に入る頃にはある程度bevyを使いこなせるようになっていたい・・・というのが当面の目標です。

2020-10-29

[Aaria/Bevy] Snake - AariaToys

ニュース
 前回の記事でご紹介したSnakeですが、コードからではなく、config.txtから設定を変更できるよう、仕様を変更しました。これで設定変更のたびにコンパイルする手間が省けます。ただし、設定の反映にはEnterではなく、ゲーム自体の再起動が必要になります。

 AariaToysシリーズは、シンプルながらも自由にゲーム自体を改変し、様々な遊び方を追求できるおもちゃのようなゲームソフトです。
 bevyでは将来的には3DやVRなどのゲームの制作も視野に入れていますが、bevy自体が開発段階にある今は、2Dから慣れていくことも含め、シンプルなものを色々と制作/公開していくことを予定しています。
 全てオープンソースにて公開していく予定であり、テキストファイルからの設定変更も含め、コード自体の改変も自由ですので、ぜひ一度いじってみてください。

[Aaria/bevy] Bevy製ゲーム

ニュース

シンプルでハマるパズルゲーム

 既に色々なコードが公開されていますが、いくつかのbevy製ゲームをご紹介します。1つ目は「謎解きパズル」のジャンルからbevy_squaresです。
 上下左右で画面上のブロックを動かし、同じ色同士を重ねていくことでスコアを稼いでいくというシンプルなゲームです。重ね続けて行くと最後には左画面のように白のブロックになります。恐らく実際は裏で色が設定されており、それまでと同様に同じ種類のブロック同士は重ねられる仕様なのでしょうが、視覚的に見えないため、どのブロックがどの種類か(何回重ねられたか)を確認しながら進めていかないと、すぐにゲームオーバーになってしまうでしょう。
 時間制限はないのでじっくり考えて進めることもできますが、最初のうちは右下を適当に連打すると効率よく進めていくことができます。また、画面上の重ね数が最も少ないブロックを全消しすると、その色のブロックは登場しなくなり、最終的には白ブロックのみでプレイすることになります。つまりコツは最下位ブロックを全消ししていくことで、画面上に現れるブロックの種類数を少なく抑えながら進めていくことです。
 シンプルながらもなかなかハマるタイプの良作だと思います。上記リンク(GitHubページ)からgit cloneし、Rust環境を整えた上で「cargo run --release」でコンパイルすることで遊ぶことができます。また、exeから直接起動する場合は「assets」フォルダが配下にないと起動に失敗してしまうため、ご注意ください。
 今後もこの手(bevy製)のゲームを多数紹介していくことになるかと思いますが、恐らくほとんどはGitHubで公開されているケースだと思います。GitHubアカウントの取得の必要はないでしょうが、実行(exe)ファイルは各自がRustでコンパイルすることで作成することになるかと思います(今回のように)。
 bevyは100%Rustで作られたゲームエンジンであり、bevyエディターこそ作成予定はあるものの、Rustのみでゲームを作ることを前提としたツールでもあります(bevyエディター自体、bevyを使って作る予定だそうです)。ご興味がある方はRustインストールを参考に環境を整えることをお勧めします。

昔ながらのヘビゲーム

 コードのチュートリアル付のヘビゲームです。餌を食べるごとに尾が長くなり、自分の尾か画面枠に当たるとゲームオーバーになります。ヘビは常時移動するため、上下左右のキーを使って方向だけ指示していきます。スコアはなく、ランダムで出現する餌をひたすら取っていくゲームになります。ヘビゲームは古い時代のものが多く、1976年のBarricadeBigfoot BonkersBlockadeCoMOTION、1977年のCheckmate(同機種にて1978年版のsnake gameも)、1988年のファミコンディスクシステムのレプリカート、ゲームボーイのかこむん蛇などがあります。もちろんプログラミング言語や手段によりコードの書き方はそれぞれ変わってきますが、bevyでは上記チュートリアルのようになります。私自身、この部分においてはまだ勉強中の身です。

AariaToys第1作 - Snake

 AariaToysシリーズの最初の作品として、Snakeを公開しました。上記ヘビゲームから派生したシンプルなゲームです。現在はGitHubのみでの公開のため、各自がRust環境にてコンパイルする必要がありますが、いずれはテキストファイルで設定を変更し、コンパイル環境のない人でも遊べるように改良しようという予定はあります。
 従来のヘビゲームと比較し、いくつかの変更があり、子供が遊ぶブロックのおもちゃのように、ゲーム自体を色々いじり、独自の楽しみ方を追求できるような仕組みになっています。Rustコンパイル環境のある方は、ぜひ一度試してみてください。

2020-09-22

[bevy] テキスト表示

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

[bevy] ボタン設置

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

[bevy] シェーダー定義

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

[bevy] カスタムマテリアルとシェーダー

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

2020-09-20

[bevy] プロパティを扱う

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

2020-09-19

[bevy] シーンの読み込みと保存

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

2020-09-18

[bevy] キーボード操作

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

[bevy] キーボード操作(Aキー)

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

[bevy] マウス操作(全般)

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

[bevy] マウス操作(左クリック)

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

[bevy] ブロックくずし

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

[bevy] 並列処理

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

2020-09-17

[bevy] ECS基本構造

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

[bevy] イベントの送受信

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

[bevy] カスタム診断

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

[bevy] 音楽ファイルの再生

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

[bevy] アセットのホットリロード

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

[bevy] アセットのロード方法

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


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

2020-09-16

[bevy] プラグイン基本構造

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

[bevy] シンプルなアプリ

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

[bevy] 3D立方体の回転

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

[bevy] 3D空間でのテクスチャ表示

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

[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

[bevy] 3Dシーン描画

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

[bevy] 親Nodeと子Nodeの配置

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

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

[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となっていますが、シンプルな立方体なのでほとんどマシンパワーなしでいけると思います。

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

[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など、直接英単語のまま使うようにしています。どうせ日本語で書くにしてもそのままカタカナに翻訳しただけのもののため、なじまない方もおられるかも知れませんが、その点だけ、ご了承いただければと思います。

|追記) 後にAaria.dbにて上記の「英語spell重視型」から「日本語カナ優先型」に路線変更を行いました。Rustやbevyとは全く関係がない話なのですが、英語に関するイギリスの英文学者の書いた専門本を読み、英語についてそれまで知らなかった様々なことを知った結果、相対的に日本語の利点や特性に気づき、2020年11月半ば当たりから行ったAaria.dbの全情報移植作業において、英語優先型から日本語優先型に趣旨を切り替えた次第です。よって2021年2月28日現在以降の記事においては、programmingはプログラミングと記載するスタンスで行く予定です。

2020-09-14

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

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製ゲームエンジン(旧情報一覧)

bevy
bevyRust製ゲームエンジンです。
古いバージョン時の記事一覧です。

基礎事項

2020-09-13

[bevy] 画像を表示

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

[bevy] hello world (導入編)

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

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

bevy

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

bevyとの出会いのきっかけ

 過去に随分と迷いましたが、Rust製のゲームエンジンこそ私にとっての理想のゲームエンジンであり、その一方でGodotも十分に優れたゲームエンジンであり、特に扱い安さにおいてRust製ゲームエンジンがGodotに勝てる日は来ないであろうという予想から、やはりGodotしかない・・・というところに落ち着いていました。

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

 Amethystの問題点に関しては過去記事(削除済)でも軽く触れましたが、やはり扱いづらそうな点とコンパイル時間の長さなどで、その上将来性に関してもいまいち確信が持てなかった故、気持ちはほぼ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との出会いに感謝したいと思っています。