強火で進め

このブログではプログラム関連の記事を中心に書いてます。

【Unity】Collider 2D の Layer Overrides

動作検証環境

  • Unity 2022.2.0f1

はじめに

Rigidbody2D と Box Collider 2D など、 XXX Collider 2D の Inspector に有る Layer Overrides について解説します。

プロパティ

プロパティの説明はこの様になりますがここだけ見てもイマイチ分かりづらいと思いますので次の項目の「解説」と合わせて確認して下さい。

プロパティ名 説明
Layer Override Priority 競合発生時の設定の優先度。
Include Layers 接触が発生するレイヤーを設定。
Exclude Layers 接触が発生しないレイヤーを設定。
Force Send Layers 接触時に力を送るレイヤーを設定。
Force Receive Layers 接触時に力を受けるレイヤーを設定。
Contract Capture Layers キャプチャされるレイヤーを設定。
Callback Layers 他の Collider 2D との衝突時にコールバックを発生されるレイヤーを設定。

解説

A という GameObject に付けられている XXX Collider 2D の Include Layers や Exclude Layers 、それが B という GameObject に付けられている XXX Collider 2D の設定と競合した時の処理のルールはこちら。

  1. A と B の両方が同じルールの場合はそのルールが採用される。
  2. A または B が include (包含) か exclude (除外) を選択している場合はそのルールが採用される。
  3. A と B の両方が include と exclude と異なるルールを選択した場合には Layer Override Priority (プログラムで使う場合は Collider2D.layerOverridePriority )の値が高い方のルールが採用される。
  4. A と B の両方が include と exclude と異なるルールを選択した場合に Layer Override Priority の値が同一の場合には接触は発生しない。

説明用として、以下の様なオブジェクトが配置されているプロジェクトを準備しました。

準備したオブジェクトの色と同じ Layer を準備し、それぞれの色に合わせた Layar を設定しています。

オブジェクト Layer
A Red
B Green
C Blue

Exclude Layers

A の Exclude Layers で Green だけにチェックし、他の Box はデフォルトのままにした場合。

Exclude (除外) に設定した Geen の Layer に属する B には接触しなくなり、存在しないものとして扱われている事が確認できます。床は除外対象では無いので床を透過する事は有りません。

Exclude Layers と Include Layers の組み合わせ

A の Exclude Layers で Green と Blue 、 B の Include (含める) Layers で Red をチェックした場合。

B Include Layers の設定をしているので A と接触しそうに思えますが実際にはルール 4. の「 A と B の両方が include と exclude と異なるルールを選択した場合に Layer Override Priority の値が同一の場合には接触は発生しない。」が適用される為、 B 、 C 共に存在しないものとして扱われます。

追加で B の Layer Override Priority を 1 に変更したい場合。

B との接触が発生する様になりました。これはルール 3. の「 A と B の両方が include と exclude と異なるルールを選択した場合には Layer Override Priority (プログラムで使う場合は Collider2D.layerOverridePriority )の値が高い方のルールが採用される。」が適用された為です。

Force Send Layers

A の Force Send Layers で Green だけにチェックし、他の Box はデフォルトのままにした場合。

A の力( Force )は B だけに送られる( Send) ので移動しますが、 C には力が送られないので移動しない事が確認できます。

Force Receive Layers

A の Force Receive Layers で Green と「床」のレイヤーで有る Defualt だけにチェックし、他の Box はデフォルトのままにした場合。

A は先に落ちた C からの力は受けない(移動しない)。しかし、その後の B の力は受ける為、移動する事が確認できます。

Contract Capture Layers

Contract Capture (キャプチャ契約) Layers は以下の様な API の動作に影響を与えます。チェックが付いてないレイヤーはキャプチャの対象外となり、「接触している」と判定されなくなったり、 OnCollisionEnter2D などのコールバックが呼ばれなくなります。

  • Physics2D.IsTouching
  • Rigidbody2D.IsTouching
  • Collider2D.IsTouching,
  • Physics2D.IsTouchingLayers
  • Rigidbody2D.IsTouchingLayers
  • Collider2D.IsTouchingLayers
  • Physics2D.GetContacts
  • Rigidbody2D.GetContacts
  • Collider2D.GetContacts
  • OnCollisionEnter2D
  • OnCollisionStay2D
  • OnCollisionExit2D
  • OnTriggerEnter2D
  • OnTriggerStay2D
  • OnTriggerExit2D

docs.unity3d.com

Callback Layers

Callback Layers でチェックが付いているレイヤーに属する GameObject の Collider 2D との衝突時にはコールバックを発生させます。 ここの設定に影響を受けるものは以下のものです。

  • OnCollisionEnter2D
  • OnCollisionStay2D
  • OnCollisionExit2D
  • OnTriggerEnter2D
  • OnTriggerStay2D
  • OnTriggerExit2D

docs.unity3d.com