開発をはじめるにあたって、まずは実行時に内部で何が起こっているかを把握する手段が必要になります。いきなりですが、Bevyで使えるデバッグ用の手段を紹介しておきます。
ロギング用マクロ
いわゆるprintfデバッグをしたいとき、Rust標準のprintln!
だとブラウザ上で出力を表示できません。そこで、Bevyはdebug!
などの独自のロギング用マクロを数種類提供しています。
trace!("very noisy");
debug!("helpful for debugging");
info!("helpful information that is worth printing by default");
warn!("something bad happened that isn't a failure, but thats worth calling out");
error!("something failed");
これだとブラウザで実行したときもちゃんと出力できますし、ログの時刻やログレベル、ソースコード上の位置なども出力してくれるので、デバッグ時にとても便利です。
bevy-inspector-egui
ゲームが起動すると内部では大量のエンティティが作成されてツリー構造が形成されますが、BevyはGUIエディタを持たないので、実行中に内部で何が起こっているのかを把握しづらいです。bevy-inspector-eguiというプラグインを使うと、現在のワールドの中に含まれるエンティティの構造をGUIで表示できます。
また、エンティティの内部のパラメータを手動でいじることもできます。例えば、ゲーム内のライトの明るさというのは実際に実行してみないとどう見えるのかわかりませんが、明るさの定数を変えながら何度も再実行するのは面倒です。そういうときにこのプラグインを使うと、即興でデータを修正して見栄えを確認することができます。
以下は実際に使ってみたときのスクリーンショットですが、左上のウィンドウにエンティティがツリー上に表示されていて、そのなかに含まれるコンポーネントの一覧も表示されています。Transform
コンポーネントのtranslation
は60.268
、-671.202
などという数が表示されていますが、これはプレイヤーキャラクターのX座標とY座標です。GUI上でこの数値を手動でいじることもできて、テキストボックス上をマウスでドラッグして数値を変えると、即座に反映されて本当に画面上のプレイヤーキャラクターの位置が変わります。便利!
エンティティにName
というコンポーネントを追加すると、このGUI上で表示されるときの名前を設定することができます。私のゲームの場合、プレイヤーキャラクターにはName::new("witch")
というコンポーネントを追加してあるので、この画面上でもwitch
という名前で表示されます。コンポーネントの名前でフィルタリングできるので、大量にエンティティがあっても名前で絞り込んでたどり着くことができます。便利!
lldb
Rustではlldbでデバッグできるわけで、もちろんBevyでも使えます。私が試したら動くことは動くのですが激重で、そのまままったく動かなくなることもしばしばでした。そのため常用はせず、どうしても必要な時に補助的に使うに留まっています。Rust初心者すぎてlldbのデバッグに良い方法があるのかわかりませんでした。たすけてください。
参考文献
- Rustプログラムのデバッグ辛すぎ問題 https://qiita.com/k0kubun/items/766dc15773ec73925163