Godot4 衝突判定なしでRigidBody2Dの下位の画像を回転させる

2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、RigidBody2D の下位の CollisionShape2D を無効化したり、 CollisionObject2D のマスクを変更して当たり判定を他のものと行わない状態で、RigidBody2D の機能で物理運動をさせて、付属するコイン画像を回転させる手順を紹介します。

※この記事の内容は、アプリ タップ The 宝箱 の開発でも使用しています。
※ GodotEngine のバージョンは 4.1.2 です。 .NET 版ではありません

※「いらすとや」様の画像を使用しています。
※「ふい字」フォントを使用しています。

※記事で紹介するスクリプト / プログラム / コードは自己責任で使用してください。

前回の記事

前回は、以下の構成で、コインを表示して、物理演算も行えるシーンを作成しました。

RigidBody2D
  +--- Sprite2D
  +--- CollisionShape2D(shape=CircleShape2D)

それを別のシーンでスクリプトから動的に作成して物理関数で飛ばす処理を実装しました。
詳しくは前回の記事を参照してください。

当たり判定を無効化した理由

宝箱をクリックすると飛び出すコインは、放物線を描いて落下するので、 RigidBody2D をルートノードとして、画像を表示する Sprite2D と、当たり判定領域の CollisionShape2D を持ったシーンとして作成しました。

しかし、衝突判定を有効にすると、他のコインとぶつかり合ってスムーズに飛び出しません

そこで、CollisionShape2DDisabled をチェックして、このコインについての全ての衝突判定を無効にしました。

Godot4 TapTheTakarabako 当たり判定は Disalbed をオンにすることで無効にできます...

また、RigidBody2D の継承元の CollisionObject2D クラスの Collsion Layer/Mask で当たり判定のグループのどこに属するかと、どこのグループと当たり判定を行うかを設定できるので、特定のグループと当たり判定を行わないように Mask のボタンを設定する方法もあります。

Godot4 Collsion のレイヤーとマスクで自身と同じグループのものと当たり判定をしない設定もできます.

これらの衝突判定の無効化についても、詳細は前回の記事を参照してください。

衝突判定を無効化すると物理関数を使っても回転しない

前述の二つの衝突判定の無効化をそれぞれ行って RigidBody2D の apply_torque, apply_torque_impulse 関数で回転させようとしても、画像は回転しませんでした。

また、以下の記事で紹介した、RigidBody2D の apply_impulse で中心からずれた位置瞬間的な力を加えることで回転させる方法でも、コインは回転しませんでした。

以下は、コインの衝突判定を無効にした状態で apply_torque で回転させようとしたけどしなかった際の動画です。
apply_impulse で中心からずれた位置に力を加えても回転しませんでした。
※ apply_torque については空中で何とも接触していないからなのかもしれません。また不慣れなため何かを見落としたケアレスミスかもしれません。

角速度を直接設定して回転させる

apply_torque, apply_impulse を使っても、衝突判定が無効な状態のコインを回転させることが出来なかったので、RigidBody2Dangular_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!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました