俺に解るように説明する "Godot Engine 3.x" 入門+

ゲームエンジン Godot Engine に関すること。入門とか使い方とかチュートリアルとか、あれとかこれとか。日本語解説。

Godot 玉転がし 08 「RigidBody Player Controller 1/2」

と、なんかカッコいいタイトルを付けてみたが、「玉転がし」ゲーの玉を動かすだけです。別に人型のキャラクタが歩いたり走ったり、それをカメラが追跡したりはしません。念のため。がしかし、今後キャラクタ操作キネマティックボディーではなくリジッドボディーで行うのが主流になると予想するぞ。俺の予言だ。今のうちに使い方に慣れておこうze。 f:id:ore2wakaru:20180305215759g:plain 前回までのことが上手くいってれば、シーン再生で、上のGIFのようになるハズ。


ちょっと整理整頓

前ちらっと書いたけど、シーンパネルがややとっ散らかってきた感じがある。ちょっと整理しよう。と言ってもすることはフォルダの役割をするノードを作って、そこにステージを構成しているノード群をしまうだけだけどね。 f:id:ore2wakaru:20180305222959p:plain

  1. Spatial」ノードを追加。"Spatial_Stage"とリネーム。これをフォルダとして使用する。ステージを構成している5つのカタマリを移動させ、閉じちゃえば、まー、なんてスッキリする事でしょう!
  2. こっちは、単にリネーム("RigidBody_Player")して、閉じただけ。

カメラやライトも、シーンパネルの中で確認しやすい様にD&Dして適当に移動させればいい。格段にスッキリする。今後、クルクル回る回収物(コレクタブル)を12個置く予定なので、もっとゴチャゴチャして来るその時にやってもよかったんだけどね。まーいいじゃん気になったんだよ。気になった時が、実行の時だ。


WASD キー設定

今回は、キーボードのWASDで玉を動かす。いや、1こずらしてESDFで動かしたいって人もまれにいるだろう。そんな時のためのキー設定だ。めんどくさがらず、[Project Settings]に入って行こう。メニューの[Project] > [Project Settings][Input Map]タブから行う。 f:id:ore2wakaru:20180306144520p:plain

デフォで"ui_left"や"ui_right"などが設定されているので、これを利用してもいいんだが、せっかくなので、自分用の設定を追加していく。まずば、キーボードのAを押したときの設定をしよう。左に動かそうとする時の場合だ。 f:id:ore2wakaru:20180306151031p:plain

  1. Action:の欄に"my_left"と入力。そして、右の[Add]ボタンを押す。(別に"my_left"じゃなくてもいいが、分かりやすい文字列で)
  2. 一番下に、"my_left"の項目が追加される。
  3. 右の[+]ボタンを押す。キーボードの入力と関連付けるので、出てきたリストの中の[Key]を選択。
  4. 具体的にキーを押せという窓が開くので、Aキーを押す。(何だったら、ここで、A以外の自分の好きなキーを設定してもいい。)窓に自分の設定したい文字が出たら、[OK]ボタンで確定。
  5. Aキーと"my_left"という文字列が関連付けられた。これで、完成。

また、[+]ボタンで他のキー(又はボタンなど)も追加できるし。[鉛筆]アイコンの所で修正もできる。なんだったら、[ごみ箱]アイコンでバッサリ削除も可能だ。恐れずに行え。

同様に、

  • "my_right": D
  • "my_up": W
  • "my_down": S

も設定する。下図のように4つの項目が追加されればいい。 f:id:ore2wakaru:20180306153813p:plain

なんで、こんなことをするか簡単に言うと、キャラクターを動かす時、「キーボードのAが押されたら左に動け」という指示をだすのではなく、「"my_left"という文字列が発生していたら左に動け」という指示をだすからだ。だから、Sキーで"my_left" という文字列を発生させるようにしておけば、Sキーで左に行くようになる。この方式を採れば、1つの決まったキーに固定されずに、比較的自由に自分の好きなキーとキャラの動きを関連付けられるということだ。自由って良いよな。

WASD上左下右でイイと思うけど、なかには、IJKLにしたいって人もいるって事。

それから、ここで引っかかるのは、インゲームでのリマップが出来るかって事だと思うけど、ちょっと工夫すれば、99.9%出来ると思う(実際にはやってないけど)。一回設定してしまったら変更不可能ってことはない。また、Godotが3.1になった時には、スッゲー簡単に出来るようになるらしい。ということで、今の段階では、あんまり心配しないでいい感じだ。


リジッドボディーを動かすタイミング

リジッドボディーを動かすコードってどこに書けばいいんだろう。結論からいこう。結論から言っちゃうのが俺のスタイルだ。

func _integrate_forces(state):
    #この中に書く~
    pass

だ。

関数には、Godotが既に決めたタイミングで呼び出される「バーチャル関数」というのがある。呼び出すタイミングだけ決まっていて、中身は自分で書かないといけないってやつだ。以前、ここでやったやつ。 ore2wakaru2.hatenablog.com

この記事はちと古いので、_fixed_process(delta)ってなってるけど、今は_physics_process(delta)ね。Docs > Godot API > Nodeを確認じゃ。
ココ:Node — Godot Engine latest documentation

今回使用するのバーチャル関数_physics_process(delta)も例にもれずアンダースコアで始まっているな。分かりやすい。で、これはDocsを見ると、リジッドボディーが動いてる時に呼ばれ、力の変化を加える時、安全にやってくれるものらしい。
ココ:RigidBody — Godot Engine latest documentation
f:id:ore2wakaru:20180306165538p:plain

ということで、1回の描画が終わったタイミングで呼ばれる_process(delta)でも、固定(デフォでは、1秒間に60回)タイミングで呼ばれる_physics_process(delta)でもなく、この_integrate_forces(state)を使うのがもっとも理想的という事になる。

「えー、これ_physics_process(delta)で呼んでもいいんじゃない? ”physics”って物理ってことでしょ、リジッドボディーって物理じゃん。」って思うかもしれないが、そこには安全性がないんだよ。残念。


func _integrate_forces(state): 使い方と注意点

では、具体的に使い方と注意点だが、、、次回にまわすことにしあす。残念。


なんか最近、花粉、飛び過ぎじゃね? 雨上がり後がやばいってマジ? 目はしばしば、鼻はずるずる。。。