2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、RigidBody2D の下位の CollisionShape2D を無効化したり、 CollisionObject2D のマスクを変更して当たり判定を他のものと行わない状態で、RigidBody2D の機能で物理運動をさせて、付属するコイン画像を回転させる手順を紹介します。
※この記事の内容は、アプリ タップ The 宝箱 の開発でも使用しています。
※ GodotEngine のバージョンは 4.1.2 です。 .NET 版ではありません。
※「いらすとや」様の画像を使用しています。
※「ふい字」フォントを使用しています。
※記事で紹介するスクリプト / プログラム / コードは自己責任で使用してください。
前回の記事
前回は、以下の構成で、コインを表示して、物理演算も行えるシーンを作成しました。
RigidBody2D +--- Sprite2D +--- CollisionShape2D(shape=CircleShape2D)
それを別のシーンでスクリプトから動的に作成して物理関数で飛ばす処理を実装しました。
詳しくは前回の記事を参照してください。
当たり判定を無効化した理由
宝箱をクリックすると飛び出すコインは、放物線を描いて落下するので、 RigidBody2D をルートノードとして、画像を表示する Sprite2D と、当たり判定領域の CollisionShape2D を持ったシーンとして作成しました。
しかし、衝突判定を有効にすると、他のコインとぶつかり合って、スムーズに飛び出しません。
そこで、CollisionShape2D の Disabled をチェックして、このコインについての全ての衝突判定を無効にしました。
また、RigidBody2D の継承元の CollisionObject2D クラスの Collsion Layer/Mask で当たり判定のグループのどこに属するかと、どこのグループと当たり判定を行うかを設定できるので、特定のグループと当たり判定を行わないように Mask のボタンを設定する方法もあります。
これらの衝突判定の無効化についても、詳細は前回の記事を参照してください。
衝突判定を無効化すると物理関数を使っても回転しない
前述の二つの衝突判定の無効化をそれぞれ行って RigidBody2D の apply_torque, apply_torque_impulse 関数で回転させようとしても、画像は回転しませんでした。
また、以下の記事で紹介した、RigidBody2D の apply_impulse で中心からずれた位置に瞬間的な力を加えることで回転させる方法でも、コインは回転しませんでした。
以下は、コインの衝突判定を無効にした状態で apply_torque で回転させようとしたけどしなかった際の動画です。
apply_impulse で中心からずれた位置に力を加えても回転しませんでした。
※ apply_torque については空中で何とも接触していないからなのかもしれません。また不慣れなため何かを見落としたケアレスミスかもしれません。
角速度を直接設定して回転させる
apply_torque, apply_impulse を使っても、衝突判定が無効な状態のコインを回転させることが出来なかったので、RigidBody2D の angular_velocity メンバ変数を変更することで、直接的に回転する勢いを設定することにしました。
# scene_otakara_coin シーンから、インスタンスを作成します。
var nodeOtakara:RigidBody2D = scene_otakara_coin.instantiate()
#(省略)
# お宝の中心に方向をもった力を加えて飛ばします。
nodeOtakara.apply_impulse(impulse)
# 角速度を直接設定して、剛体を回転させます。回転する勢いは、-5 から 5 の間で左右の回転をランダムに設定します。
nodeOtakara.angular_velocity = randf_range(-5, 5)
テスト
F6 キーでメインのシーンを再生して、宝箱をクリックすると、動的に作成されたコインがapply_impulse で放物線上に飛ばして、angular_velocity で回転する勢いを設定することで、以下のようにコインが衝突判定をしない状態でランダムな勢い -5 ~ +5 の間で左右どちらかに回転しながら飛ぶようになりました。
まとめ
今回は、2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、RigidBody2D の下位の CollisionShape2D を無効化したり、 CollisionObject2D のマスクを変更して当たり判定を他のものと行わない状態で、RigidBody2D の機能で物理運動をさせて、付属するコイン画像を回転させる手順を紹介しました。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- 草コインのイラスト | かわいいフリー素材集 いらすとや
- Get Sprite Dimensions – Archive – Godot Forum
- PackedScene — Godot Engine (4.x)の日本語のドキュメント
- 【Godot】RigidBody2Dの基本的な使い方 | 2dgames.jp
- apply_torque on RigidBody2D does not work if bodys CollisionShape2D is disabled · Issue #68068 · godotengine/godot · GitHub
- 物理の紹介 — Godot Engine (4.x)の日本語のドキュメント
- RigidBody2D — Godot Engine (4.x)の日本語のドキュメント#angular-velocity
- RigidBody2D — Godot Engine (4.x)の日本語のドキュメント#apply-torque
- RigidBody2D — Godot Engine (4.x)の日本語のドキュメント#apply-impulse
記事一覧 → Compota-Soft-Press
コメント