コリジョン形状(2D)

このガイドでは以下の事を説明します:

  • Godotで使用可能な2Dの衝突形状の種類。

  • ポリゴンに変換された画像をコリジョン形状として使用。

  • 2Dコリジョンに関するパフォーマンス上の考慮事項。

Godotはさまざまな種類の衝突形状を提供しており、それぞれにパフォーマンスと精度のトレードオフがあります。

You can define the shape of a PhysicsBody2D by adding one or more CollisionShape2Ds or CollisionPolygon2Ds as direct child nodes. Indirect child nodes (i.e. children of child nodes) will be ignored and won't be used as collision shapes. Also, note that you must add a Shape2D resource to collision shape nodes in the Inspector dock.

注釈

1つの PhysicsBody2D 複数のコリジョン形状を追加すると、それらが重なることを心配せずに済みます。それらは互いに "衝突" しません。

プリミティブコリジョン形状

Godotは、以下のプリミティブコリジョン形状を提供します:

ほとんどの小さなオブジェクトの衝突は、1つまたは複数の基本的な形状を使用して表現できます。しかし、大型の船やレベル全体のような複雑なオブジェクトの場合は、代わりに凸形状や凹形状を使用する必要があるかもしれません。詳細は以下で説明します。

動的オブジェクト、たとえばRigidBody や CharacterBodyの場合は、基本的な形状を使用することをお勧めします。これは挙動が最も安定しているためです。これらの形状はパフォーマンスが優れている場合が多いです。

凸形状コリジョン形状

警告

Godot は現在、2Dの凸形状コリジョン形状を作成するビルトインの方法を提供していません。このセクションは主に参考情報として記載されています。

凸形状コリジョン形状 は、プリミティブコリジョン形状と凹型コリジョン形状の折衷的な選択肢です。これらはどんな複雑な形状でも表現できますが、重要な制約があります。その名前が示すように、個々の形状は 凸型 の形状しか表現できません。例えば、ピラミッドは 凸型 ですが、中が空洞の箱は 凹型 です。1つのコリジョン形状で凹型オブジェクトを定義するには、凹型コリジョン形状を使用する必要があります。

オブジェクトの複雑さによっては、凹型コリジョン形状を使用する代わりに、複数の凸型形状を使用することでパフォーマンスが向上する場合があります。Godotでは、 凸形状分解 を使用して、中が空洞のオブジェクトに大まかに一致する凸型形状を生成できます。ただし、凸型形状の数が一定量を超えると、このパフォーマンスの利点は失われます。レベル全体のような大きく複雑なオブジェクトの場合は、凹型形状を使用することを推奨します。

凹形状または三角形メッシュのコリジョン形状

凹形状コリジョン形状 、または三角メッシュコリジョン形状は、少数の三角形から数千の三角形まで、あらゆる形状を表現できます。凹形状は、Godotにおいて最も正確で、最も処理速度が遅いオプションです。 凹形状は StaticBody 内でのみ使用可能です 。CharacterBodyやRigidBodyでは動作しません。ただし、RigidBodyが Static モードに設定されている場合は例外的に動作します。

注釈

凹形状は最も正確な 衝突 を提供しますが、接触報告の精度はプリミティブ形状よりも低い場合があります。

レベルデザインにTileMapを使用しない場合、凹形状がレベルの衝突判定に最適なアプローチです。

CollisionPolygon2D ノードの build mode はインスペクタで設定できます。 Solids (デフォルト)に設定されている場合、衝突判定にはポリゴンとその内側の領域が含まれます。一方、 Segments に設定されている場合、衝突判定にはポリゴンの辺のみが含まれます。

エディタから Sprite2D を選択し、2D ビューポート上部の Sprite2D メニューを使用することで、凹型のコリジョン形状を生成できます。Sprite2Dメニューのドロップダウンには、CollisionPolygon2Dの兄弟を作成 というオプションがあります。これをクリックすると、3つの設定が表示されます。

  • 簡略化: 値を大きくすると形状の詳細が少なくなり、精度を犠牲にする代わりにパフォーマンスが向上します。

  • 縮小(ピクセル): 値を大きくすると、生成されるコリジョンポリゴンがスプライトのエッジに対して縮小されます。

  • 拡大(ピクセル): 値を大きくすると、生成される衝突ポリゴンがスプライトのエッジに対して拡大されます。なお、拡大と縮小を同じ値に設定すると、両方を0にした場合とは異なる結果になることがあります。

注釈

画像に細かいディテールが多い場合は、簡略化されたバージョンを作成し、それを使ってコリジョンポリゴンを生成することをおすすめします。これにより、パフォーマンスやゲームプレイの感やが向上します。これはプレイヤーが小さく装飾的なディテールに邪魔されることを防ぐためです。

コリジョンポリゴンの生成に別の画像を使用する場合、別のSprite2Dを作成し、それから衝突ポリゴンの兄弟ノードを生成して、Sprite2Dノードを削除します。この方法で、生成された衝突から小さなディテールを除外することができます。

パフォーマンス注意点

PhysicsBody につき衝突形状は1つに限定されません。それでも形状の数をできるだけ少なく保つことをお勧めします。これはパフォーマンス向上のためで、特にRigidBodyやCharacterBodyのような動的オブジェクトでは重要です。さらに、物理エンジンの内部最適化を活用するために、CollisionShape の移動、回転、スケーリングを避けるべきです。

単一の非変形コリジョン形状を StaticBody で使用する場合、エンジンの broad phase アルゴリズムは非アクティブな PhysicsBody を除外できます。その結果、 narrow phase ではアクティブなボディの形状のみを考慮すればよくなります。しかし、StaticBody に多くの衝突形状がある場合、broad phaseは失敗します。より遅いnarrow phaseがそれぞれの形状に対して衝突チェックを行うことになります。

パフォーマンスの問題に直面した場合、精度に関して妥協を行う必要があるかもしれません。ほとんどのゲームでは、衝突判定が100%正確であることはありません。代わりにクリエイティブな方法でそれを隠したり、通常のゲームプレイ中に目立たなくさせたりしています。