マニュアル: コリジョン相性チェックとコリジョンの役割(テンプレート)

このマニュアルについて

このマニュアルでは、コリジョン相性チェックと、オブジェクトを作るときに選ぶコリジョンの役割(コリジョンテンプレート)について解説します。「敵に攻撃が当たらない」「プレイヤーが敵にぶつかって進めない」といった、レイヤーとマスクの噛み合わせが原因のつまずきを、数字を読まずに確かめて直すための機能です。

ACTION GAME MAKER でのレイヤー/マスクの考え方

コリジョンには レイヤー(自分が何者か)と マスク(自分が何を相手にするか)があり、片方のマスクにもう片方のレイヤーが入っているかで成立が決まります。ここが噛み合っていないと、判定の形をどう調整しても当たりません。

何の判定か 成立する条件
壁(ぶつかり・押し合い) 自分の壁マスク ∩ 相手の壁レイヤー
攻撃 攻撃側の攻撃マスク ∩ 受ける側のあたりレイヤー
ビジュアルスクリプトの「〜と接触した」 自分の壁マスク ∩ 相手の壁レイヤー

壁は左右が別々に決まります。 「A は B にぶつかるが、B は A に止められない」という状態が作れて、このとき B は A を一方的に押しのけます。すり抜けさせたいなら両方を外す必要があります。

実行時に使われないフィールドがあります。 攻撃は「マスク」だけ、あたりは「レイヤー」だけが見られます。攻撃判定のレイヤーやあたり判定のマスクを変えても、当たり方は変わりません。


コリジョン相性チェック

2 つのオブジェクトを選ぶと、ぶつかるか・攻撃が当たるか・接触条件が成立するかを文章で表示するウィンドウです。ビットを見比べる代わりに、日本語の結果を読んで確かめられます。

開き方

  • インスペクターの「コリジョン相性チェック」ボタン(ゲームオブジェクト、攻撃判定、あたり判定を選んでいるときに出ます)
  • オブジェクト制作ビューでは、上部の固定ツールバーの同じボタンから開けます

開いたときは、**A に今編集しているオブジェクト、B にタイル(地形)**が入った状態で始まります。

画面の構成

  • 上段左が A、上段右が B です。中央の「⇄」で入れ替えられます。
  • 各パネルの「オブジェクトを選択…」でシーン(.tscn)を選びます。既定の場所は res://objects/gameobjects です。
  • タイル」ボタンでその側をタイル(地形)にできます。タイルはレイヤー 1 として扱われます。
  • 下段に判定結果が出ます。

編集できる 4 つの欄

各パネルには、実行時の判定に使われる 4 つだけが並びます。

意味
壁レイヤー このオブジェクトが何者か(相手のマスクに拾われる側)
壁マスク このオブジェクトがぶつかりたい相手
攻撃マスク 攻撃を当てたい相手のあたりレイヤー
あたりレイヤー このオブジェクトのあたり判定が何者か

数字のボタン(レイヤー 1 〜 8)を押すとその場で切り替わり、下の判定結果がすぐ更新されます。 レイヤー 9 以降を使っている場合、その設定は保持されますがこの画面では編集できません。

この時点ではシーンに書き込まれていません。 押し比べて確かめるだけなら、そのまま閉じても元のオブジェクトは変わりません。ウィンドウ内では Ctrl+Z / Ctrl+Shift+Z で操作を戻せます。

判定結果の読み方

結果は 3 つに分かれて出ます。

壁(ぶつかり・押し合い)

  • 「A と B はぶつかり、互いに押し合います」
  • 「A は B にぶつかって止まりますが、B は A に止められません」→ B が A を一方的に押しのけられます
  • 「A と B は互いにすり抜けます」
  • 相手がタイルのときは、オブジェクト側の壁マスクにレイヤー 1 が入っているかだけで決まります(タイルは動かないため)
  • 軽量オブジェクトや、有効な壁判定シェイプがない場合はその旨が出ます

攻撃 → あたり

  • 「A の攻撃は B に当たります」/「当たりません」を A→B と B→A の両方向で出します
  • 受ける側にあたり判定(HitArea2D)が無い場合は「あたり判定がないため当たりません」と注意が出ます
  • タイルは攻撃判定・あたり判定を持たないため対象外です
  • A と B に同じオブジェクトを選ぶと「同種が複数いる場合の関係」として表示されます(攻撃は自分自身には当たりません)

ビジュアルスクリプトの接触判定

  • 「A の接触条件は B を検出できます」/「できません」を両方向で出します
  • 「〜と接触した」系の条件は、既定でそのオブジェクトの壁マスクを使います。 つまり壁マスクを変えると接触条件の成立も変わります
  • 条件側で「マスク設定を使用」をオンにすれば、その条件だけ独立したマスクを指定できます
  • 相手が軽量オブジェクト(Area2D)の場合は、条件側で「エリアとの判定 (collide_with_areas)」をオンにする必要があります

オブジェクトへ書き込む

  • テンプレートを適用」を押すと、役割ごとのおすすめ設定を作業コピーへ読み込めます(後述)。
  • オブジェクトへ適用」で、変更をオブジェクトへ書き込みます。アンドゥできます。
  • 書き込めるのは今編集しているオブジェクトだけです。 それ以外のシーンを選んでいる側は「お試し変更」のみで、シーンには保存されません。
  • 未適用の変更があるまま閉じようとすると、適用するかどうかの確認が出ます。

コリジョンの役割(テンプレート)

レイヤー番号の意味を決めておき、役割を選ぶだけで壁・攻撃・あたりを一括で設定する仕組みです。

レイヤー番号の割り当て

テンプレートを使うときだけ、次の割り当てで設定されます。

レイヤー 役割
1 タイル(地形)
2 プレイヤー
3 プレイヤーの弾
4 エネミー
5 エネミーの弾
6 味方NPC
7 以降 予約(自由に使えます)

既存のプロジェクトの設定を書き換えるものではありません。 これまで作ってきたオブジェクトはそのままで、テンプレートを適用したオブジェクトだけがこの割り当てになります。混在させると相性が合わなくなるので、途中から使い始める場合は関係するオブジェクトをまとめて揃えてください。

使えるテンプレート

名前 どうなるか 壁レイヤー 壁マスク 攻撃マスク あたりレイヤー
標準プレイヤー タイル・敵と押し合い、攻撃は敵と敵の弾に当たり、敵の攻撃を受けます 2 1, 4 4, 5 2
敵に止められないプレイヤー 敵にぶつからず進めます 2 1 4, 5 2
標準エネミー タイル・プレイヤーと押し合い、敵同士はすり抜けます 4 1, 2 2, 3 4
敵同士も押し合うエネミー 標準エネミーに加えて敵同士でも押し合います 4 1, 2, 4 2, 3 4
プレイヤーに止められないエネミー プレイヤーにぶつからず進めます 4 1 2, 3 4
壁も抜けるエネミー(完全すり抜け) 壁・他オブジェクトと一切ぶつかりません なし なし 2, 3 4
プレイヤーの弾 攻撃は敵と敵の弾(相殺)に当たります 3 1 4, 5 3
エネミーの弾 攻撃はプレイヤーとプレイヤーの弾(相殺)に当たります 5 1 2, 3 5
味方NPC タイル・敵と押し合い、プレイヤーとはすり抜けます 6 1, 4 4, 5 6
アイテム・接触ギミック 物理的な押し合いをせず、自分の接触条件でプレイヤーを検出します なし 2 なし なし
破壊できる足場 タイルと同じ壁レイヤーなので上に乗れて、プレイヤーの攻撃で壊せます 1 1 なし 4

「止められない」系は、片側だけに適用すると一方的に押しのける関係になります。お互いにすり抜けさせたい場合は、両方に「止められない」系を適用してください。

オブジェクトを作るときに選ぶ

オブジェクト作成のダイアログに「コリジョンの役割」のプルダウンがあります。

  • 選択中のオブジェクトグループで候補が絞られます。 Player グループならプレイヤー関連だけ、Enemy グループならエネミー関連だけ、未設定やその他のグループならすべてが並びます。
  • グループごとに既定の役割が最初から選ばれています(プレイヤーなら「標準プレイヤー」など)。そのまま作れば噛み合った設定になります。
  • テンプレート標準」を選ぶと、テンプレートが元々持っている値がそのまま使われます(役割の割り当ては適用されません)。
  • 軽量オブジェクトを選んでいる場合は、壁レイヤーが「なし」になります(物理的な押し合いをしないため)。

既にあるオブジェクトへ適用する

コリジョン相性チェックの「テンプレートを適用」から読み込み、「オブジェクトへ適用」で確定します。読み込んだ直後は作業コピーなので、結果の文章を見てから確定できます。


実用例

プレイヤーの攻撃が味方に当たってしまう

昔からの慣習では、生成時に壁・攻撃・あたりを全部同じ値にしていたため、プレイヤーの攻撃マスクにプレイヤー自身のレイヤーが入っていることがあります。

  1. プレイヤーを選んでコリジョン相性チェックを開きます。
  2. B に味方(またはプレイヤー自身)を選びます。
  3. 「攻撃 → あたり」に「当たります」と出ていれば、それが原因です。
  4. プレイヤー側の攻撃マスクから味方のレイヤーを外し、「オブジェクトへ適用」を押します。

役割テンプレートを両方へ適用すれば、この組み合わせは起きなくなります。

敵をすり抜けて進みたい

  1. プレイヤーと敵を A / B に並べます。
  2. 「壁(ぶつかり・押し合い)」が「互いに押し合います」になっているのを確認します。
  3. プレイヤーへ「敵に止められないプレイヤー」、敵へ「プレイヤーに止められないエネミー」を適用します。
  4. 結果が「互いにすり抜けます」に変われば完成です。

片方だけだと「一方的に押しのける」状態になり、押された側が壁に埋まることがあります。

弾が敵に当たらない

  1. 弾を A、敵を B にします。
  2. 「攻撃 → あたり」で弾側の攻撃マスクに敵のあたりレイヤーが入っているかを見ます。
  3. 入っていなければ、弾へ「プレイヤーの弾」を適用します。

壁に当たったときに弾を消す処理はテンプレートに含まれません。 ビジュアルスクリプトで「接触したら消える」を作ってください。


注意点

  • 壁マスクを変えると、ビジュアルスクリプトの接触条件の結果も変わります。 「〜と接触した」系の条件は既定で壁マスクを使うためです。押し合いだけを変えたいときは、条件側の「マスク設定を使用」で独立させてください。
  • 攻撃はマスクだけ、あたりはレイヤーだけが使われます。 攻撃判定のレイヤーやあたり判定のマスクを変えても当たり方は変わりません(このため相性チェックの画面にも出していません)。
  • 「オブジェクトへ適用」は編集中のオブジェクトにしか書き込めません。 相手側に選んだシーンはお試し変更のみです。相手も直したい場合は、そのオブジェクトを開いてから同じことをしてください。
  • 役割テンプレートの割り当ては、既存プロジェクトの設定とは別の体系です。 混ぜると相性が崩れるので、使うなら関係するオブジェクトをまとめて揃えてください。
  • タイルはレイヤー 1 です。 壁マスクからレイヤー 1 を外すと地形をすり抜けて落ちていきます。
  • 「壁も抜けるエネミー」は壁レイヤーも 0 になります。 他のオブジェクトの接触条件からも検出されなくなるので、接触で反応させたい相手がいる場合は使えません。
  • 軽量オブジェクトは押し合いをしません。 相手の接触条件で拾わせるには、条件側で「エリアとの判定 (collide_with_areas)」をオンにする必要があります。
  • レイヤー 9 以降を使っている設定は、相性チェックの画面では編集できません(保持はされます)。