Unity 2D: 複数のコライダーを 1 つにまとめる方法
以下では、Unity 2D において複数のコライダー(Collider2D)をひとつの合成コライダー(Composite Collider 2D)として扱う方法を、正しい手順と対応できるコライダーの種類を踏まえてまとめます。本記事のポイントは以下のとおりです。
- Composite Collider 2D の概要と用途
- 対応している Collider2D の種類
- 実際の設定手順
- CircleCollider2D/CapsuleCollider2D は直接マージできない理由
- Circle や Capsule を合成したい場合の代替手順
- 動的オブジェクトに Composite Collider を使う際の注意点と代替策
1. Composite Collider 2D の概要と用途
1.1 Composite Collider 2D とは
- Composite Collider 2D は、複数の Polygon Collider 2D や Box Collider 2D、タイルマップコライダー(Tilemap Collider 2D)、Edge Collider 2D(アウトラインとして扱う場合)などの「輪郭を持つ Collider2D」をまとめて、ひとつの大きな Collider2D(合成コライダー)に変換するコンポーネントです。
- 必要なときに「複数コライダーをまとめて最適化し、動的にひとつのアウトラインとして扱える」ように生成してくれます。
1.2 主な用途
- タイルマップや地形の最適化Unity 標準の 2D レベルデザインでは、タイル一枚一枚に Collider2D を持たせるとシーン上に膨大な数のコライダーが存在します。Composite Collider 2D を導入することで、これらをまとめて「一体の大きな静的 Collider」として扱い、物理演算のコストを大幅に軽減できます。
- 複数の Polygon Collider の結合たとえば、手作業で Polygon Collider 2D を複数並べた複雑な地形を、ひとつのアウトラインにまとめたいときに便利です。
- 静的(Static)オブジェクト向けの最適化が主目的Unity 公式ドキュメントでは、「Composite Collider 2D は大量の静的 Collider をまとめて最適化する」用途とされています。動的(Dynamic)な Rigidbody2D に Composite Collider を付けると、衝突挙動が不安定になるケースがあるため、一般には Static や Kinematic なオブジェクト向けの機能と考えられます。
2. Composite Collider 2D が対応する Collider2D の種類
Composite Collider 2D によって 「合成(Merge)可能な Collider2D の種類」 は、以下のとおりです。
- Polygon Collider 2D
- 手動で頂点を打って形状を作れる最も自由度の高いコライダー。
- Box Collider 2D
- 四角形の当たり判定を行うプリミティブコライダー。
- Edge Collider 2D(輪郭用として利用)
- 細い線分をつなげて形を作るコライダー。Polygon Collider のような面ではなくエッジ群を表現できる。
- Tilemap Collider 2D
- タイルマップ(Tilemap)に応じて生成される Collider。一度 Composite にまとめると、タイルマップ全体をひとつの大きな Collider として扱える。
上記以外の Collider2D(Circle Collider 2D, Capsule Collider 2D, Composite Collider 2D 自身など)を「Merge」に設定しても、Composite Collider 2D はジオメトリを取り込みません。
→ したがって、CircleCollider2D や CapsuleCollider2D などのプリミティブ型コライダーは、Composite Operation=Merge を選んでも実際には Composite によって合成されず、無視されます。
Unity 公式マニュアル(抜粋):
“Instead, it merges the shapes of any Box Collider 2D or Polygon Collider 2D that you set it up to use. The Composite Collider 2D uses the vertices (geometry) from any of these Colliders, and merges them together into new geometry controlled by the Composite Collider 2D itself.”
(訳)Composite Collider 2D は、設定された Box Collider 2D または Polygon Collider 2D の形状のみを取り込み、これらの頂点情報をひとつの新しい形状として合成します。それ以外の Collider2D は合成対象外です。
3. 実際の設定手順
ここでは、「Polygon Collider 2D」と「Box Collider 2D」を合成し、Composite Collider 2D でひとつにまとめる基本手順を解説します。これにより、静的オブジェクトを最適化する方法を理解できます。
3.1 親オブジェクトへのコンポーネント追加
- 新規 GameObject を作成
- 例として空の GameObject をシーンに配置し、名前を Ground(地形用)などにします。
- Polygon Collider 2D を追加
- Ground に Polygon Collider 2D コンポーネントを追加し、自在に頂点を打って地形の形を作成します。
- あるいは Tilemap Collider 2D を使う場合は、Tilemap を先に配置しておき、Tilemap Collider 2D を追加すると、自動でタイルごとのコライダーが生成されます。
- Box Collider 2D を追加(必要に応じて)
- たとえば、一部の地形を矩形にしたい場合、Polygon Collider 2D の代わりに Box Collider 2D を設定し、サイズ/オフセットを調整して四角形を作ります。
- Composite Collider 2D を追加
- Ground オブジェクトに Composite Collider 2D を追加します。
- Inspector にある Geometry Type は通常 Outlines(輪郭線)のまま、Generation Type を Synchronous または Manual に設定します。
- Synchronous:常に変更があったコライダーを即時に合成し直す
- Manual:Inspector の “Generate Geometry” ボタンを押したタイミングで合成を作り直す
- Is Trigger や Material(Physics Material 2D)は必要に応じて設定します。
- Rigidbody 2D を追加
- Composite Collider 2D を機能させるには、同じ GameObject に Rigidbody 2D が必要です。
- 地形用であれば通常 Body Type = Static(動かない)、重力や物理挙動を持たせない場合は Static のままにします。
- Rigidbody 2D の “Use Auto Mass” チェックは外しておいても構いません(Static なら質量は不要)。
- 各 Collider2D の “Composite Operation” を設定
- Polygon Collider 2D や Box Collider 2D の Inspector → Composite Operation ドロップダウンから Merge を選びます。
- これにより、この Collider の形状(頂点/四角形)が Composite Collider 2D に取り込まれます。
- Edge Collider 2D がある場合も同様に Merge を選びます。
- 「Generate Geometry」を実行する(手動モードの場合)
- Composite Collider 2D の Inspector に “Generate Geometry” ボタンが表示されていれば、それを押すことで子の Collider2D(Polygon/Box/Edge)がまとめられ、Composite による合成が行われます。
- もし Generation Type = Synchronous を選んでいれば、Polygon や Box の「Merge」が有効な時点で自動的に Composite が生成されます。
3.2 確認と最適化
- Scene ビューで合成結果を確認
- 合成後、Ground にアタッチされた Composite Collider 2D が「1つのアウトラインとして地形全体を覆う形状」になっていることを確認します。
- Gizmo(ギズモ)表示 がオンの状態であれば、Composite 生成後の頂点が緑色の線として見えるはずです。
- 不要なオブジェクト上の個別 Collider を無効化(Destroy)
- 合成後は、Polygon Collider や Box Collider をそのまま残しておくとシミュレーションで重複検知が起こる場合があります。不要ならこれらを削除するか、Used By Composite(旧バージョンの Unity)または Composite Operation = None に戻し、かわりに Composite Collider 2D のみをアクティブにします。
- Physics2D のパフォーマンスをチェック
- Static 地形が大量にある場合、Composite Collider 2D を使うことで Collider 数が激減し、シミュレーションコストが下がります。
- 特にタイルマップ系の地形や、Edge/Polygon を組み合わせた複雑なシーンでは効果が大きいです。
4. CircleCollider2D/CapsuleCollider2D は直接 Merge できない理由
4.1 なぜ Circle/Capsule は合成されないのか
- Circle Collider 2D や Capsule Collider 2D は、「プリミティブ形状」を内部で円やカプセルとして描画する実装になっていますが、Composite Collider 2D は “頂点情報” を使って新しい Collider を生成する仕組みです。
- Polygon 2D や Edge 2D、Box 2D はすべて「頂点リストやエッジの集合」というデータ構造でコライダーを定義していますが、Circle 2D や Capsule 2D は「中心+半径」「中心+方向+サイズ情報」のように数学的に定義されており、頂点を持ちません。
- そのため、Circle 2D・Capsule 2D を Merge に設定しても、Composite Collider 2D は「取り込めるジオメトリ(頂点情報)がない」と判断して無視します。→ Inspector 上には Merge の選択肢が表示されますが、裏側の Physics2D 実装では合成対象外となります。
Unity 公式マニュアル(抄訳)
「Composite Collider 2D は、Polygon Collider 2D または Box Collider 2D の頂点情報のみを取り込みます。他の Collider2D(Circle, Capsule など)は合成できません。」
5. Circle や Capsule を合成したい場合の代替手順
「どうしても Circle Collider 2D や Capsule Collider 2D の滑らかな形を、Composite Collider 2D にまとめて合成したい」というケースはあるかもしれません。その場合は、以下のいずれかの方法で対応します。
5.1 Physics Shape(スプライト輪郭)を Polygon Collider 2D に変換する
- Sprite の Physics Shape 自動生成を利用
- 対象のスプライトを選択 → Inspector → Sprite Editor を開き、左上のモードを「Physics Shape」に切り替えます。
- Unity がスプライトの透明/不透明部分を解析して自動的に輪郭ポリゴンを生成します。
- 自動生成の輪郭を編集し、余計な頂点を削除してシンプルにします。
- 「Apply」で変更を保存。
- Polygon Collider 2D をアタッチして Physics Shape を反映
- GameObject に Polygon Collider 2D を追加すると、自動的に先ほど編集した Physics Shape が Polygon Collider の頂点として取り込まれているはずです。
- 必要に応じて「Edit Collider」モードで頂点を微調整し、足や膝の丸みを再現します。
- Polygon Collider 2D → Composite Operation = Merge に設定する。
- Composite Collider 2D を追加
- Polygon Collider 2D を Merge に設定した GameObject に Composite Collider 2D を追加し、Rigidbody 2D (Static もしくは Kinematic) を同じオブジェクトにアタッチします。
- これで、先ほどの Polygon Collider(丸みを近似した頂点群)が Composite に取り込まれ、滑らかな合成ジオメトリが生成されます。
メリット
- もともとスプライトの形状にあわせた丸みをそのまま Polygon に変換できる。
- 作業はエディター上のみで完結し、Circle や Capsule を直接合成しなくても見た目の近似が可能。
注意点
- 動的キャラクターに Composite Collider 2D を付けると挙動が不安定になることがあるため、Polygon を合成したオブジェクトはなるべく Static(背景)向けにするほうが安全です。
- キャラクター本体で動的に地面を移動する場合は、後述の「動的オブジェクトの Collider 戦略」を検討してください。
5.2 子‐親構造で「親に合成形状、子に物理判定 Collider」を分離する
もし、動的に移動するキャラクター(Rigidbody 2D = Dynamic)が「合成された丸い形状」を物理判定に使いたいという要件がある場合は、親子構造を分けて Collider をそれぞれ割り当てる手法が考えられます。以下は基本イメージです。
Player_Root (親 GameObject)
├ Rigidbody2D (Body Type = Kinematic または Static) ← 合成形状用の剛体(動かない/動かしづらい)
├ Composite Collider 2D ← Polygon/Edge → Merge
│ └ Polygon Collider 2D (複数、足や胴体、腕などを形づくる輪郭を設定)
│ (各 Collider2D → Composite Operation = Merge)
└ Player_Body (子 GameObject)
├ Rigidbody2D (Body Type = Dynamic) ← 実際に移動する Collider/アニメーション用
├ Circle Collider 2D or Capsule Collider 2D ← 丸み用の滑らか判定
└ Box Collider 2D (胴体用の大まか判定など)
ポイントは次のとおりです。
- 親オブジェクト(Player_Root)
- Rigidbody 2D を Static または Kinematic にして、Polygon Collider 2D や Edge Collider 2D(円やカプセルは使わない)を Merge 設定で Composite Collider 2D にまとめる。
- こうすることで「丸く合成されたアウトライン」を親が保持しますが、親は動かない/動きづらい剛体です。
- 子オブジェクト(Player_Body)
- Rigidbody 2D を Dynamic に設定し、動的な移動・ジャンプ・衝突レスポンスを担当する。
- 子には Circle Collider 2D や Capsule Collider 2D、Box Collider 2D など「滑らかな形状判定用」の Collider2D を配置し、親に従属した状態で動かします。
- スクリプトで毎フレーム、親と子の Transform を同期させるなどして、子の実際の移動に合わせて親の合成形状を追尾させる必要があります。
- 利点と欠点
- 利点:
- 親の Composite Collider 2D には Polygon/Edge しか使わないため、「丸みのない領域もきれいに合成して最終的に滑らかなアウトラインが得られる」。
- 子は Dynamic Rigidbody と丸形の Collider で移動するので、一般的な動的衝突が使いやすい。
- 欠点:
- 構成が複雑になり、親‐子の Transform 同期や Rigidbody の扱いが難しくなる。
- 速度や衝突力は子の Rigidbody で処理されるため、親の Composite Collider と子 Collider が干渉すると調整が煩雑になる。
- 基本的に「動的キャラクターの物理挙動を Composite で一括処理する」用途としては非推奨。
- 利点:
6. 動的オブジェクトに Composite Collider 2D を使う際の注意点
6.1 動的(Dynamic)な Rigidbody2D と Composite Collider 2D の相性
- Unity 公式ドキュメントでも推奨されているように、Composite Collider 2D は主に Static(または Kinematic)なオブジェクト同士の最適化を目的としている。
- Dynamic Rigidbody2D に Composite 2D を付けると、衝突判定が不安定になったり、複数 Collider の統合作成がリアルタイムで重くなったりするケースがあります。
- “Used By Composite”(Unity 5 系までは各 Collider2D に対してチェックボックス、Unity 6 以降は Inspector → Composite Operation)の設定自体は可能ですが、内部的には以下のような問題が起こりやすくなります。
- 剛体の分割:Composite 2D のアウトラインは単一の大きなポリゴンとなるため、Dynamic Rigidbody 2D が当たりに行くと複雑な計算が発生し、回転やバウンド挙動が予期せぬ結果を招くことがある。
- リアルタイムの再生成負荷:Generation Type = Synchronous などにすると、動くたびに合成形状を再生成するため、パフォーマンスに影響を与える。
- 衝突判定の抜け:動的キャラと Static Composite の相性によっては、エッジ付近の当たり判定が抜けることがある。
6.2 動的キャラクターで複数 Collider をどう扱うか
動的キャラクター(Player)に関しては、Composite 2D を利用せずに「単純に複数のプリミティブ Collider(Capsule/Circle/Box)を同じ Rigidbody 2D に並べる」方法が最もシンプルかつ安定します。
- 例: 足元に CapsuleCollider、膝下にもうひとつ小さな CapsuleCollider、胴体に BoxCollider などを同じ GameObject(または子に分割しても OK)にアタッチしておき、Composite は使わない。
- Unity Physics2D は「同じ Rigidbody 2D に複数の Collider 2D がついていると、それらを内部的に Compound Collider(合成 Collider)として扱う」ため、自動的に複数の Collider がひとつに見える挙動になります。
- この方法にすると、Composite 2D 経由よりも性能が良く、挙動が安定します。
以下のようにすれば、同じフレーム/同じ衝突で OnCollisionEnter2D が複数回呼ばれても、プレイヤー側としては一回だけ処理されるようになります。ここでは最もシンプルな「フレーム内フラグ方式」を例示します。
1. 原因のおさらい
Unity 2D では、1つの Rigidbody2D に複数の Collider2D(例:Capsule+Capsule+Box など)をアタッチしている場合、それぞれの Collider が相手に触れるたびに OnCollisionEnter2D が呼ばれます。
たとえば、足元の小さな Capsule と、膝下の別の Capsule がほぼ同時に地面に当たると、同じフレーム内に OnCollisionEnter2D が2回飛んできてしまいます。
これを放置すると、「ジャンプをリセットする処理」などが二回走ってしまい、挙動が二重になる可能性があります。
2. 「同じフレーム内は一度だけ処理する」最も簡単な方法
2.1 概要
- bool 型のフラグを用意し、OnCollisionEnter2D を呼んだ直後にフラグを true にする
- OnCollisionEnter2D の先頭でフラグをチェックし、すでに今フレーム「一度処理したなら」すぐ return して中身を抜ける
- LateUpdate(あるいは FixedUpdate の末尾)で毎フレームフラグを false に戻す
こうすると、同じフレーム内に複数の Collider が “別々に” OnCollisionEnter2D を呼んできても、最初の一回しか本番処理が走らないようになります。
2.2 コード例
以下は PlayerController(または衝突処理を行うスクリプト)の一部サンプルです。
「足元 Capsule + 脚の Capsule + 胴体 Box」 などを同一 Rigidbody2D 上に置いていても、OnCollisionEnter2D中の本番処理は必ず一回だけ実行されます。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
//――――――――――――――――――――――――――――――
// フレーム内の重複呼び出しを抑止するためのフラグ
private bool hasProcessedCollisionThisFrame = false;
//――――――――――――――――――――――――――――――
private Rigidbody2D rb;
private bool isJumping = false;
private Vector2 lastSafePosition;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
// (例)ジャンプ入力など(省略)
// …
}
void FixedUpdate()
{
// (例)移動処理など(省略)
// …
}
//――――――――――――――――――――――――――――――
private void OnCollisionEnter2D(Collision2D collision)
{
// (1) 今フレーム中に一度でも衝突処理したなら無視
if (hasProcessedCollisionThisFrame)
return;
// (2) 本番の衝突処理(1回だけ実行される)
// たとえば「地面(タグStage/Scaffold) に当たったらジャンプリセット」
Collider2D other = collision.collider;
if (other.CompareTag("Stage") || other.CompareTag("Scaffold"))
{
isJumping = false;
lastSafePosition = transform.position;
}
// ※他のタグ分岐があればここに追加
Debug.Log($"OnCollisionEnter2D executed for {other.name}");
// (3) 今フレーム中はもう処理したのでフラグを立てる
hasProcessedCollisionThisFrame = true;
}
private void LateUpdate()
{
// (4) 次のフレーム向けにフラグをリセット
hasProcessedCollisionThisFrame = false;
}
//――――――――――――――――――――――――――――――
}
ポイント解説
- hasProcessedCollisionThisFrame (bool) を用意
- フレームの初期状態では false。OnCollisionEnter2D がはじめて呼ばれた瞬間に true にセットされます。
- 同じフレーム内に続けて呼ばれた OnCollisionEnter2D は、先頭で if (hasProcessedCollisionThisFrame)が true となるため return され、中身が実行されません。
- LateUpdate でフラグをリセット
- LateUpdate は Unity の1フレーム内の処理の一番最後に呼ばれるため、
- 「FixedUpdate → OnCollisionEnter2D(物理判定サイクル) → LateUpdate」でフレームが締めくくられ、
- LateUpdate で hasProcessedCollisionThisFrame = false; に戻すと、次のフレームでは再び OnCollisionEnter2D の中身を実行できる状態になります。
- LateUpdate は Unity の1フレーム内の処理の一番最後に呼ばれるため、
- Collider の数や形状は何個あっても OK
- 足元の小さな Capsule、膝下の Capsule、胴体の Box など、複数の Collider2D をまるで 1 つのコンパウンドコライダーのように配置していても、
- Unity の内部ではそれらが「同じ Rigidbody2D にくっついた複数の Collider」として扱われるので、すべてまとめて 1 つの見かけの断面を実現できます。
- ただし複数の Collider が同時に地面に接触すると OnCollisionEnter2D が複数回飛んでくるため、最初に紹介したフラグ方式で重複を抑止する必要があります。
3. もう少しだけバリエーションを知りたい場合
上記の「bool フラグ+LateUpdate リセット」は最も手軽でコード量も少なく済みますが、ほかにもやり方があります。
3.1 HashSet を使って“相手 Collider ごと”に一度だけ処理する
「同じフレーム内でなくても、ある相手オブジェクトに触れ続けている限り1度だけ処理し、離れたらまた処理したい」という要件がある場合は、以下のように HashSet を使います。
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
// “接触済み相手” を管理するセット
private HashSet<Collider2D> processedOpponents = new HashSet<Collider2D>();
private Rigidbody2D rb;
private bool isJumping = false;
private Vector2 lastSafePosition;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
// OnCollisionEnter2D は相手ごとに一度だけ処理
private void OnCollisionEnter2D(Collision2D collision)
{
Collider2D opponent = collision.collider;
// すでにこの相手を処理済みなら無視
if (processedOpponents.Contains(opponent))
return;
// 本番処理
if (opponent.CompareTag("Stage") || opponent.CompareTag("Scaffold"))
{
isJumping = false;
lastSafePosition = transform.position;
}
Debug.Log($"Processed new opponent: {opponent.name}");
// 一度処理した相手として登録
processedOpponents.Add(opponent);
}
private void OnCollisionExit2D(Collision2D collision)
{
Collider2D opponent = collision.collider;
// 離れたら再度当たったときにまた処理させたいならここで削除
if (processedOpponents.Contains(opponent))
processedOpponents.Remove(opponent);
}
}
- HashSet キー = collision.collider(相手側の Collider2D)なので、
- たとえ同じ相手に「脚の ColliderA → 脚の ColliderB → 胴体の ColliderC」と複数回当たってきても、最初に登録された時点で以降はすべて無視され、「相手ごとに一度だけ」の処理が保証されます。
3.2 子オブジェクトと親オブジェクトで衝突を分担する
「足元」や「胴体」などで用途がはっきり別れる場合は、Collider を子オブジェクトにも分散させ、子側で OnCollisionEnter2D を受け取って親に通知する方法もあります。
たとえば……
Player (親)
├ Rigidbody2D (Dynamic)
├ PlayerController (スクリプト)
│
├ FootCollider (子オブジェクト)
│ └ BoxCollider2D (IsTrigger = false)
│ └ FootColliderNotifier.cs (スクリプト)
│
└ BodyCollider (子オブジェクト)
└ CapsuleCollider2D (IsTrigger = false)
└ BodyColliderNotifier.cs (スクリプト)
- FootColliderNotifier.cs(子オブジェクトにアタッチ)
using UnityEngine;
[RequireComponent(typeof(Collider2D))]
public class FootColliderNotifier : MonoBehaviour
{
private PlayerController parentController;
private void Awake()
{
parentController = GetComponentInParent<PlayerController>();
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.collider.CompareTag("Stage") || collision.collider.CompareTag("Scaffold"))
{
// “地面に着地” を親に通知
parentController.OnGrounded();
}
}
}
- PlayerController.cs(親オブジェクトで受け取る側)
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private bool isJumping = false;
private Vector2 lastSafePosition;
// FootCollider から呼ばれるメソッド
public void OnGrounded()
{
// この時点で一度だけ呼べば OK
isJumping = false;
lastSafePosition = transform.position;
Debug.Log("PlayerController: Grounded notification received");
}
// 他の処理……
}
- メリット
- 子オブジェクトごとに「当たった瞬間だけ親に伝える」ので、OnCollisionEnter2D の重複を子が制御できる。
- 親のメソッドは呼ばれたら一度だけ必要最小限の処理を行う。
- デメリット
- 親と子でスクリプトが分かれる分、階層構造と責務が少し複雑になる。
- “同じ相手に子A→子B が同時に当たって親に通知すると二重呼び出しになる”可能性があるので、子→親通知側でもフラグなどで重複を弾く必要がある。
4. まとめ
- 「Rigidbody2D に複数の Collider2D をアタッチすると、同じ相手に触れた時に OnCollisionEnter2D が複数回呼ばれる」という Unity Physics2D の仕様があります。
- この二重呼び出しを防ぎたいときは、
- フレーム内フラグ(bool)+LateUpdate リセット方式
- 最もコード量が少なく、OnCollision を必ず「フレーム内一度だけ」実行できる。
- HashSet で「相手ごとに一度だけ」処理する方式
- 同じ相手への継続衝突中は一度だけ呼んで、相手から離れたら再度呼ぶ……といった細かい制御が可能。
- 子オブジェクト Collider で受け取り → 親に通知
- 「足元」や「胴体」など用途ごとに子に Collider を分け、OnCollisionEnter2D は子→親の通知だけで完結させる分担方式。
- フレーム内フラグ(bool)+LateUpdate リセット方式
いずれの方法を選んでも、Collider を複数並べて「丸みのある足元」や「胴体+足の形」を実現しつつ、OnCollisionEnter2D は常にプレイヤー全体として1回だけ呼ぶという要件を満たせます。
最もシンプルなのは「bool フラグ+LateUpdate リセット方式」ですので、まずはそちらを試してみると良いでしょう。
7. まとめ
- Composite Collider 2D は “Static な複数 Polygon/Box/Edge Collider” を合成するための機能であり、動的キャラクター向けではない。
- Merge に合成される Collider2D の種類は “Box Collider 2D / Polygon Collider 2D / Edge Collider 2D / Tilemap Collider 2D” のみで、CircleCollider2D や CapsuleCollider2D は合成されない。
- Circle や Capsule を合成したい場合は
- Sprite の Physics Shape を使って Polygon Collider 2D に置き換える
- または 親子構造で親に Polygon/Composite、子に動的なプリミティブ Collider を割り当てるなどの対応が必要。
- 動的キャラクターで複数 Collider 2D を使うなら、
- Composite 2D を使わず、単純に複数のプリミティブ Collider(Capsule/Circle/Box)を同じ Rigidbody 2D に並べる方法がもっとも簡単&安定。
- 複数 Collider が同じ地形に触れたときの OnCollisionEnter2D の重複を防ぎたい場合は、bool フラグやフレーム単位のガードロジック(LateUpdate でリセットするなど)を使うとよい。
参考リンク
- Unity マニュアル:Composite Collider 2D
- Unity マニュアル:Collider 2D の種類
- Unity フォーラム:Composite Collider 2D の動的使用に関する注意点 (例)
以上の正しい情報を踏まえ、「複数コライダーをひとつの合成ジオメトリにまとめる/丸みを再現しながら適切に当たり判定を行う」方法を選んで実装してください。
ディスカッション
コメント一覧
まだ、コメントがありません