無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、壁などを通り抜けないように衝突判定をしながら移動できる衝突オブジェクトを作る型について、 Doxygen で作成した衝突オブジェクトのクラスの派生図と合わせて、それぞれのクラスの特徴について引用文と所感を紹介します。
クラスごとの特徴はあまり詳しくは書けませんでした。
衝突判定ができるクラス体系がどのように派生して、どのようなクラスがあるのかを、さらっと確認してもらえると幸いです。
※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
前回の記事
前回は、ドット絵が描画されたマップやキャラクターをぼやけずにくっきりと拡大して表示するプロジェクト設定の例と実行結果を紹介しました。
衝突判定をする型の派生図
衝突判定をする型は、CollisionObject2D を継承しています。
以下の派生図は「GitHub – godotengine/godot」からダウンロードしたソースコードをもとに Doxygen でドキュメント化した CollisionObject2D クラスのリファレンスページです。
ドキュメント化については以下の記事を参照してください。
派生クラスごとの特徴
前述した通り 衝突判定を行える CollisionObject2D 派生のクラスは以下のようになります。
クラスのあとに書かれた文は、後述する引用や要約をかみくだいて短くしたものです。
- CollisionObject2D :衝突オブジェクトのすべてのベース
- Area2D :当たり判定を行える軽量クラス。
- PhysicsBody2D :物理演算を行う衝突オブジェクトのすべてのベース
- StaticBody2D :床や壁など動かない物体向け。ベルトコンベアの表面なども。
- RigidBody2D :2D の物理演算をしっかりと行う物体に用いるクラス。
- PhysicalBone2D :Skelton2D で用いる骨のクラス。
- CharacterBody2D :衝突を検出するけど重力や摩擦などの物理に影響されない。
- AnimatableBody2D :衝突した相手にだけ影響を与えるクラス。
以下は、公式サイトの各クラスの説明文の引用と、それを読んだ筆者の所感 (要約・使用例) です。
便宜上、CollisinObject2D 派生の衝突判定を行えるクラスのオブジェクトを、衝突オブジェクトと呼びます。
※公式では Collision Object と書かれています。
CollisionObject2D
Shape2D( CircleShape2D などの当たり判定の領域を表すリソース)を任意の個数持てる、すべての衝突オブジェクトのベースとなるクラスです。
※抽象基底クラスなのでインスタンス化はできませんが、その未実装のインターフェースを実装した派生クラスをオブジェクトとして使用します。
独自の衝突オブジェクトを作成するときの最もシンプルな派生元として利用できそうです。
Abstract base class for 2D physics objects. CollisionObject2D can hold any number of Shape2Ds for collision. Each shape must be assigned to a shape owner. Shape owners are not nodes and do not appear in the editor, but are accessible through code using the
shape_owner_*
methods.2D 物理オブジェクトの抽象基本クラス。 CollisionObject2D は、衝突のために任意の数の Shape2D を保持できます。各形状は形状所有者に割り当てる必要があります。シェイプ オーナーはノードではないため、エディターには表示されませんが、shape_owner_* メソッドを使用してコードからアクセスできます。CollisionObject2D — Godot Engine (4.x)の日本語のドキュメントと Google 翻訳
Area2D
Area2D オブジェクトは、子ノードに設定した 2D の領域内に、他の衝突オブジェクトが出入りしたことや、重なっていることを検知します。
当たり判定だけを行いたい場合や、軽量な衝突オブジェクトの基底クラスとして使えそうです。
Area2D is a region of 2D space defined by one or multiple CollisionShape2D or CollisionPolygon2D child nodes. It detects when other CollisionObject2Ds enter or exit it, and it also keeps track of which collision objects haven’t exited it yet (i.e. which one are overlapping it).
Area2D は、1 つまたは複数の CollisionShape2D または CollisionPolygon2D 子ノードによって定義される 2D 空間の領域です。他の CollisionObject2D がそこに出入りするときを検出し、どの衝突オブジェクトがまだそこから出ていないのか (つまり、どの衝突オブジェクトが重なっているのか) も追跡します。Area2D — Godot Engine (4.x)の日本語のドキュメントと Google 翻訳
PhysicsBody2D
物理演算で動作するすべての衝突オブジェクトのベースのクラスです。
※抽象基底クラスなので、このクラス自身はインスタンス化できません。
物理演算を用いた独自のクラスを作る際の派生元として使えそうです。
PhysicsBody2D is an abstract base class for 2D game objects affected by physics. All 2D physics bodies inherit from it.
PhysicsBody2D は、物理学の影響を受ける 2D ゲーム オブジェクトの抽象基本クラスです。すべての 2D 物理ボディはそれを継承します。
PhysicsBody2D — Godot Engine (4.x)の日本語のドキュメントと Google 翻訳
StaticBody2D
原則として動かない衝突オブジェクトに用いるクラスです。
引用によると、壁や床のほかに、コンベアベルトの表面などにも使えます。
A static 2D physics body. It can’t be moved by external forces or contacts, but can be moved manually by other means such as code, AnimationMixers (with AnimationMixer.callback_mode_process set to AnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS), and RemoteTransform2D.
When StaticBody2D is moved, it is teleported to its new position without affecting other physics bodies in its path. If this is not desired, use AnimatableBody2D instead.
StaticBody2D is useful for completely static objects like floors and walls, as well as moving surfaces like conveyor belts and circular revolving platforms (by using constant_linear_velocity and constant_angular_velocity).
静的な 2D 物理ボディ。外部の力や接触によって移動することはできませんが、コード、AnimationMixers (AnimationMixer.callback_mode_process をAnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS に設定)、RemoteTransform2D などの他の手段によって手動で移動することができます。 StaticBody2D を移動すると、パス内の他の物理ボディに影響を与えることなく、新しい位置にテレポートされます。これが望ましくない場合は、代わりに AnimatableBody2D を使用してください。 StaticBody2D は、床や壁などの完全に静的なオブジェクトだけでなく、コンベア ベルトや円形の回転プラットフォームなどの移動する表面にも役立ちます (constant_linear_velocity と constant_angular_velocity を使用)。StaticBody2D — Godot Engine (4.x)の日本語のドキュメントと Google 翻訳
RigidBody2D
2D の物理演算をしっかりと行う物体に用いるクラス。
RigidBody2D implements full 2D physics. It cannot be controlled directly, instead, you must apply forces to it (gravity, impulses, etc.), and the physics simulation will calculate the resulting movement, rotation, react to collisions, and affect other physics bodies in its path.
The body’s behavior can be adjusted via lock_rotation, freeze, and freeze_mode. By changing various properties of the object, such as mass, you can control how the physics simulation acts on it.
A rigid body will always maintain its shape and size, even when forces are applied to it. It is useful for objects that can be interacted with in an environment, such as a tree that can be knocked over or a stack of crates that can be pushed around.
RigidBody2D は完全な 2D 物理を実装します。直接制御することはできません。代わりに、力 (重力、衝撃など) を適用する必要があります。物理シミュレーションは、結果として生じる動き、回転を計算し、衝突に反応し、パス内の他の物理ボディに影響を与えます。 ボディの動作は、lock_rotation、freeze、freeze_mode によって調整できます。質量などのオブジェクトのさまざまなプロパティを変更することで、物理シミュレーションがオブジェクトにどのように作用するかを制御できます。 剛体は、力が加えられた場合でも、常にその形状とサイズを維持します。これは、倒される可能性のある木や、押し回される可能性のある木箱の積み重ねなど、環境内で操作できるオブジェクトに役立ちます。RigidBody2D — Godot Engine (4.x)の日本語のドキュメントと Google 翻訳
PhysicalBone2D
Skelton2D で用いる骨のクラス。
詳しくは「2D skeletons — Godot Engine (stable) documentation in English」を参照して下さい。
The PhysicalBone2D node is a RigidBody2D-based node that can be used to make Bone2Ds in a Skeleton2D react to physics.
PhysicalBone2D ノードは、Skeleton2D 内の Bone2D を物理に反応させるために使用できる RigidBody2D ベースのノードです。
CharacterBody2D
厳密な物理演算ではなく、ゲームのキャラクターによくある移動や衝突を実装したクラス。
CharacterBody2D is a specialized class for physics bodies that are meant to be user-controlled. They are not affected by physics at all, but they affect other physics bodies in their path. They are mainly used to provide high-level API to move objects with wall and slope detection (move_and_slide method) in addition to the general collision detection provided by PhysicsBody2D.move_and_collide. This makes it useful for highly configurable physics bodies that must move in specific ways and collide with the world, as is often the case with user-controlled characters.
CharacterBody2D は、ユーザー制御を目的とした物理ボディに特化したクラスです。これらは物理学の影響をまったく受けませんが、パス上の他の物理体に影響を与えます。これらは主に、PhysicsBody2D.move_and_collide によって提供される一般的な衝突検出に加えて、壁と斜面の検出 (move_and_slide メソッド) を使用してオブジェクトを移動するための高レベル API を提供するために使用されます。これは、ユーザーが制御するキャラクターの場合によくあるように、特定の方法で移動してワールドと衝突する必要がある、高度に構成可能な物理ボディに役立ちます。CharacterBody2D — Godot Engine (4.x)の日本語のドキュメントと Google 翻訳
移動時に他の衝突オブジェクトとの衝突を検出しますが、重力や摩擦などの物理特性の影響は受けません。
CharacterBody2D
is for implementing bodies that are controlled via code. Character bodies detect collisions with other bodies when moving, but are not affected by engine physics properties, like gravity or friction. While this means that you have to write some code to create their behavior, it also means you have more precise control over how they move and react.CharacterBody2D は、コードで制御されるボディを実装するためのものです。キャラクター ボディは、移動時に他のボディとの衝突を検出しますが、重力や摩擦などのエンジンの物理特性の影響を受けません。つまり、キャラクターの動作を作成するにはコードを記述する必要がありますが、キャラクターの動きや反応をより正確に制御できることも意味します。
Using CharacterBody2D/3D — Godot Engine (4.x)の日本語のドキュメント
※ KinematicBody2D は、 CharacterBody2D に置き換わりました。
4.0 では、KinematicBody2D ノードは CharacterBody2Dノード に置き換えられました。CharacterBody2Dでは velocity 変数がすでに定義されているので、もし velocity 変数が定義されている場合は velocity変数を削除する必要があります。
v4.0 での move_and_slide() は引数がなくなり、velocity 変数を定義する必要がなくなりました
【Godot】Godot3.5から4.0への移行メモ | 2dgames.jp
AnimatableBody2D
自身は影響を受けず、衝突した相手にだけ物理的な影響を与えたい場合に使うクラス。
#使用例にはドアなどと書かれていますが、よくわかりませんでした。
後日に公開する記事で、動く床を作る際に使ったので、そちらを参照してください。
https://compota-soft.work/wp1/wp-admin/post.php?post=38374&action=edit
An animatable 2D physics body. It can’t be moved by external forces or contacts, but can be moved manually by other means such as code, AnimationMixers (with AnimationMixer.callback_mode_process set to AnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS), and RemoteTransform2D.
When AnimatableBody2D is moved, its linear and angular velocity are estimated and used to affect other physics bodies in its path. This makes it useful for moving platforms, doors, and other moving objects.
アニメート可能な 2D 物理ボディ。外部の力や接触によって移動することはできませんが、コード、AnimationMixers (AnimationMixer.callback_mode_process をAnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS に設定)、RemoteTransform2D などの他の手段によって手動で移動することができます。 AnimatableBody2D が移動されると、その線形速度と角速度が推定され、そのパス内の他の物理ボディに影響を与えるために使用されます。これは、プラットフォーム、ドア、その他の移動物体の移動に役立ちます。AnimatableBody2D — Godot Engine (4.x)の日本語のドキュメントと Google 翻訳
公式による4つの衝突オブジェクトのクラスの説明
この章では公式サイト「「物理の紹介 — Godot Engine (4.x)の日本語のドキュメント」で Area2D, CharacterBody2D, RigidBody2D, StaticBody2D の4つのクラスについて書かれた引用文を紹介します。
物理の紹介 — Godot Engine (4.x)の日本語のドキュメント
- Area2D
Area2D
ノードは 検出 と 影響 を提供します。オブジェクトの重なり合いを検出し、物体が出入りするときにシグナルを発することができます。“ Area2D“ を使用して、定義された領域で重力や減衰などの物理特性をオーバーライドすることもできます。- StaticBody2D 静的ボディとは、物理エンジンによって動かされないものです。コリジョン検出に参加しますが、衝突に応じて移動しません。これらは、環境の一部であるオブジェクトや動的な動作を必要としないオブジェクトに最もよく使用されます。
- RigidBody2D これはシミュレーションされた2D物理を実装するノードです。
RigidBody2D
を直接操作するのではなく、力(重力、衝撃など)を加えて物理エンジンがその結果の動きを計算します。Using RigidBodyを参照してください。- CharacterBody2D コリジョン検出を提供しますが、物理は提供しません。すべての移動および衝突応答はコードで実装する必要があります。
まとめ
今回は、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、壁などを通り抜けないように衝突判定をしながら移動できる衝突オブジェクトを作る型について、 Doxygen で作成した衝突オブジェクトのクラスの派生図と合わせて、それぞれのクラスの特徴について引用文と所感を紹介しました。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- 物理の紹介 — Godot Engine (4.x)の日本語のドキュメント
- CollisionObject2D — Godot Engine (4.x)の日本語のドキュメント
- Area2D — Godot Engine (4.x)の日本語のドキュメント
- PhysicsBody2D — Godot Engine (4.x)の日本語のドキュメント
- StaticBody2D — Godot Engine (4.x)の日本語のドキュメント
- RigidBody2D — Godot Engine (4.x)の日本語のドキュメント
- CharacterBody2D — Godot Engine (4.x)の日本語のドキュメント
- Using CharacterBody2D/3D — Godot Engine (4.x)の日本語のドキュメント
- PhysicalBone2D — Godot Engine (4.x)の日本語のドキュメント
- AnimatableBody2D — Godot Engine (4.x)の日本語のドキュメント
- 2D skeletons — Godot Engine (stable) documentation in English
- 【Godot】Godot3.5から4.0への移行メモ | 2dgames.jp
記事一覧 → Compota-Soft-Press
コメント