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

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

Godot 玉転がし 06 「リジッドぼでー de プレイヤー作成」 ...と Static Kinematic Rigid とか

ステージは動かさないから「StaticBody(スタティックボディー)」で作ったが、プレイヤーとなる「玉」は動かすので、これ以外で作る事となる。候補は2つ。「KinematicBody(キネマチックボディー)」と「RigidBody(リジッドボディー)」だ。で、どっちにする? f:id:ore2wakaru:20180302191031p:plain


「KinematicBody」 と 「RigidBody」

まずは違いをまとめておこう。簡潔に表にすると、こうなる。

_ ボディ 外部への力の影響 外部からの力の影響
[1] KinematicBody 与える 受けない
[2] RigidBody 与える 受ける

ま、外部からの力の影響受ける受けないかって事。たまに、重力の影響を受けるか受けないかだけで分けちゃう人がいるけど、それは間違い。重力外部からの力の影響だけれども、それだけで分けるのは、後々混乱を招くことになるから注意だ。

[1] 「KinematicBody」
今の所、デモやYoutubeで解説してくれる人は、プレイヤーにこれを使っている。そんで、ついさっきも書いたけど、重力ってのも外部からの力の影響のひとつ。で、「KinematicBody」はこの重力の影響を受けないから、重力の影響を受けてるっぽく見せるために、彼らはスクリプトでわざわざ下に動く(落ちる)ように書いているんだ。ご苦労さん。
で、この「KinematicBody」、俺にとって分かりやすい様に例えて言うと、ずばりジャイアン。「俺はジャイアン、ガキ大将~♪」ってアレね。なんでかって言うと、「他に影響を及ぼすが、他からの影響は受けない」ってことは、「俺はお前をぶっ飛ばせるが、お前は俺を1ミリだって動かせない。」って事だろ。
ゲーム内にはいろんな物体を置くじゃん。そんな中、自分は他の物体をグイグイ押しのけられるけど、他の物体からの力は完全無視でござるってんだ、やりたい放題じゃないか。まじ、ジャイアンっぽいだろ。こんな感じなので、「キネマティックぼでー」じゃなくて、「ジャイアンぼでー」って言ってもいいぐらいだぜ。俺的にはな。

KinematicBodyはカプセル、RigidBodyは球とした。
f:id:ore2wakaru:20180302202454g:plain
↑↑↑ KinematicBody(左)は他者に力を加えることが出来る。「押しのけるぜー、どけどけ、ぱーんち。」
f:id:ore2wakaru:20180302201044g:plain
↑↑↑ だが、他者に力を加えることが出来るKinematicBody(左)に押されても、その力には動じない(右)。「左から押されても無視無視、無駄無駄。ドッシリ。」

[2] 「RigidBody」
じゃあ、こっちの例えは何だ? のび太君か? スネオ? しずかちゃん? いやいや、全然ナイない。普通に「リジッドぼでー」だ。外界との関係が五分五分なんだから、別に何かに無理やり例える必要はないだろ。な。それでも無理に言うなら、まー、「ビリヤードの球ぼでー」とでも言えばいいか。押すし、押されるしな。カンカンカーーーンって。そんなことより大事なのは、こっちはデフォで重力感じちゃうってところかもな。

両球ともRigidBody。
f:id:ore2wakaru:20180302205504g:plain
力を伝えることも出来るし、受けることも出来ることが分かる。


ちな、Kinematic(発:キネティック)は「運動学的な」って意味だけど、キネマって映画のことじゃん。映画って中の人の動きって決まってるじゃん、アニメみたいに。たぶん、そんな風に外界からの影響を受けないで一方的にアニメするって事で、この名前にしたんだろなキット。
Rigid(発:ジッド)は「堅くて曲がらない」。だから、こっちはビリヤードの球を想像すればいいよね。簡単。だけど、なんとなんとGodot3.1になると、「SoftBody(ソフトボディー)」が使えるようになるみたいだぞ。やわらかやわらかぷよぷよするぞ! ロマンを感じるな。期待大だ。


「RigidBody」 魔法の組み合わせ

今回の「玉転がし」ゲームで、プレーヤーとして採用するのは「RigidBody」。動かし方にちょっと特徴があって面白かったから、こっちにしたぜ。で、これも基本となる「カタマリ」なんだけど、「StaticBody」の時と同じ考え方でOKだ。「StaticBody」の所が「RigidBody」に変わるだけ。楽勝。

  • RigidBody: 物体の性質。(動かす + 力を与え・与えられ)
    • MeshInstance: 見た目のカタチ。
    • CollisionShape: 当たり判定。

今回は使わないけど、この「カタマリ」の考え方は、「KinematicBody」でも一緒な。定型って感じか。3つとも覚えてしまおう。
f:id:ore2wakaru:20180302211408p:plain


さっそく落として見ようじゃないの

球形のリジッドボディーのカタマリを用意して、さっそくステージに落として見よう。重力感じちゃうぞ。ってことで、

f:id:ore2wakaru:20180302213124p:plain

  1. 球形「RigidBody」の「カタマリ」をシーンに追加して、
    • MeshInstance」「CollisionShape」共にスフィア("SphereShape")を選択。
  2. ちょっと上に持ち上げて、、、

よーし、シーン再生だ。

むむ、エラーっぽい。。。...

そっか、メインシーンの設定をしてなかったか。では、メインシーンの設定をして、

f:id:ore2wakaru:20180302214150p:plain
(コレ、[ゲーム再生]ボタンを押せば、すばやく設定画面になる。あと、どっちにしても作ったシーンのSAVEは事前にしておく必要がある。じゃないと選べないしな。気を付けてな。)

再度、シーン再生

「えっ? 何も映らないゾッ!」

これは、カメラがないから。(おやくそく)

どや。

まー、どうでもいいんだけど、これは、なにも起きていないのではなく、ただ見えていないだけな。


2Dのエアホッケーのところでやったけど、実際のゲーム画面というのは、Godotが既に用意してある「シーンツリー」の「Viewport」ノードに、自分で作ったシーンのノード達がくっつく事で、目に見えるようになる。下のページの「シーンツリー」の項目を参照。 ore2wakaru2.hatenablog.com でも、これは2Dとか、またはUI関係のことに限るようだ。3Dでは明示的にカメラ(カメラノード)を設置することで、ゲーム画面が見えるようになっている。まー、こっちの方が自然だよな。

というわけで、次回はカメラ・ライト関係の予定だ。今度こそ、重力、感じちゃおうゼ!