2020/04/01(水) [n年前の日記]
#1 [godot] Godto Engineについてまだまだ勉強中
チュートリアル動画を眺めながら勉強中。
_Godot 3.1: Creating a Simple 3D Game: Part 6 (Menu Screens, Text, Buttons, Signals) #GodotEngine - YouTube
_Godot 3.1: Creating a Simple 3D Game: Part 7 (Enemies, Animation, Collision, Game Over) #GodotEngine - YouTube
_Godot 3.1: Creating a Simple 3D Game: Part 8 (Collecting Coins, HUD, Counter, Timers) #GodotEngine - YouTube
分かったことをメモ。
独自の信号をどういう時に使うのかと言うと…。例えば、プレイヤーとコインが重なった際に、コイン側のスクリプト内で独自信号を出して、その独自信号をコイン数表示用Labelが受け取れば…。「プレイヤーとコインが重なった」ことを、コイン数表示用Labelが知ることができるので、コイン数表示用Labelが持ってるスクリプト内で、コインの獲得数を+1して表示を更新、といった処理が書けたりする。
_Godot 3.1: Creating a Simple 3D Game: Part 6 (Menu Screens, Text, Buttons, Signals) #GodotEngine - YouTube
_Godot 3.1: Creating a Simple 3D Game: Part 7 (Enemies, Animation, Collision, Game Over) #GodotEngine - YouTube
_Godot 3.1: Creating a Simple 3D Game: Part 8 (Collecting Coins, HUD, Counter, Timers) #GodotEngine - YouTube
分かったことをメモ。
- タイトル画面やゲームオーバー画面などの2D画面は、2Dシーンとして作成して .tscn で保存してしまえばいいらしい。
- Label、Button、ColorRect 等を配置すれば、メニュー画面っぽいソレは一応作れる。
- Label や Button は、Custom Fonts を指定してやることで、好きなフォント(.ttf や .otf)を使えるようになる。
- Custom Fonts は、DynamicFont を新規作成後、「DynamicFont」と表示されてる部分をクリックして、Font → Font Data に ttf や otf を指定する。
- Use Filter を有効にすると、フォントの見た目が綺麗になる。
- Custom Colors でフォントの文字色や影色を指定できる。
- Custom Constants で、影のオフセット値を指定できる。
- Button名が「Button」のままだと問題が出てくるらしい。Buttonノードだけは、別名に変更しておくこと。「button-title-play」とか。
- Button を押すと、pressed() という信号が出るので、その信号にスクリプト内の関数を接続してやれば、「ボタンが押されたら○○をせよ」といった処理を書ける。
- スクリプト内に get_tree().change_scene("res://シーン名.tscn") と書けば、そのシーンに移行できる。2Dシーンから3Dシーンへ、3Dシーンから2Dシーンへの移行も可能。
- プレイヤーキャラと重なるであろう、敵だのコインだのそういった種類のモノは、Area タイプにしておく。
- Area は、他の何かしらと重なった状態で表示することができる。
- Area も、アタリ範囲(CollisionShape等)を持たせないといけない。
- Area が他の何かと重なった時、body_entered という信号が出るので、それをスクリプト上の関数と接続しておけば、何かと重なった時にその関数が呼ばれるようになる。
- 関数の中で、if body.name == "ノード名": という感じで書けば、何と当たったのかを名前でチェックして判別できる。
- アニメーションをさせたい時は、AnimationPlayer を持たせてやる。
- AnimationPlayer を使えば、位置(Translation)や角度(Rotation)等を時間によって変化させることができる。
- Translation 等の右のほうに鍵っぽいアイコンがあるので、それをクリックすると、現在時刻?にキーフレームを打てる。
- スクリプト内で、$AnimationPlayer.play("アニメ名") と書けば、そのアニメを再生することができる。
- 3D画面上に、スコア表示等、2D的な情報表示をしたい場合は、Controlノードを追加して、その下に Label等をつけてやればいい。
- 画像を2D表示したい場合は Sprite を使う。Texture に png画像等を指定してやれば、その画像が表示される。
- Timerを持たせれば、指定時間が経過したら何かの処理をする、といったことができる。
- スクリプト内で、$Timer.start() と書けば、Timer がスタートする。
- Timer の指定時間が経過すると、timeout() という信号が出るので、スクリプト内の関数と接続すれば、指定時間経過後にコレをしろ、といった処理が書ける。
- 独自の信号(signal)を作ることもできる。例えばスクリプトの最初のほうで、signal coinCollected と書けば、coinCollected という独自の信号を用意できる。
- emit_signal("coinCollected") と書けば、スクリプト内で、その信号を発生することができる。
独自の信号をどういう時に使うのかと言うと…。例えば、プレイヤーとコインが重なった際に、コイン側のスクリプト内で独自信号を出して、その独自信号をコイン数表示用Labelが受け取れば…。「プレイヤーとコインが重なった」ことを、コイン数表示用Labelが知ることができるので、コイン数表示用Labelが持ってるスクリプト内で、コインの獲得数を+1して表示を更新、といった処理が書けたりする。
- queue_free() で、自分自身を削除することができる。
◎ 課題。 :
あらかじめステージ内に、決まった数の敵だのコインだのを配置しておく系のゲームなら作れそう、とは分かったけれど…。
シューティングゲームのように、次々に弾を撃つ、みたいな処理はどうすればいいのやら。プレイヤーキャラが弾オブジェクトをバンバン発生させて、弾オブジェクトは自分で勝手に飛んでいって、条件を満たしたら自分で勝手に消えていく、みたいなことをしないといかんよな…。
3Dモデルを使ったシーンを表示する際、しばらく待たされるのも気になる。ストップウォッチで測ってみたら、15秒ぐらい待たされていた。ウインドウのタイトルバーに「(応答なし)」が出てくるぐらい無反応になるのは、ちょっと…。コレってどうにかならんのか。
シューティングゲームのように、次々に弾を撃つ、みたいな処理はどうすればいいのやら。プレイヤーキャラが弾オブジェクトをバンバン発生させて、弾オブジェクトは自分で勝手に飛んでいって、条件を満たしたら自分で勝手に消えていく、みたいなことをしないといかんよな…。
3Dモデルを使ったシーンを表示する際、しばらく待たされるのも気になる。ストップウォッチで測ってみたら、15秒ぐらい待たされていた。ウインドウのタイトルバーに「(応答なし)」が出てくるぐらい無反応になるのは、ちょっと…。コレってどうにかならんのか。
◎ 余談。 :
blender 2.8x で blenderゲームエンジンが削除された際、「そういうことをしたかったら Godot Engine でも使いなよ」と blenderのコミュニティ内で言及されてたので、なんとなく触ってみたのだけれど。
たしかに、作業用3D画面のカメラ操作は blender に近かったりするけれど、それ以外は、特に blender との親和性(?)があるようにも見えず。例えば、.blend が直接読める、といった機能があるわけでもないし…。
もっとも、ライセンス面では Unity や UE4 と比べるとかなり自由、てなあたりはメリットなのだろうか。
たしかに、作業用3D画面のカメラ操作は blender に近かったりするけれど、それ以外は、特に blender との親和性(?)があるようにも見えず。例えば、.blend が直接読める、といった機能があるわけでもないし…。
もっとも、ライセンス面では Unity や UE4 と比べるとかなり自由、てなあたりはメリットなのだろうか。
[ ツッコむ ]
以上です。