このマニュアルでは、オブジェクトの壁判定(CollisionShape2D)とタイル、および他のオブジェクトとの壁判定における接触関連の詳細設定について詳しく説明します。
壁判定の接触判定の概要とレイキャスト(RayCast)
ACTION GAME MAKERの壁判定は、オブジェクトの壁判定(CollisionShape2D)の大きさに基づいて矩形の判定生成領域を作成し、その領域の4つの辺から外側に判定用の法線(Rayと呼ばれる)を発射して検出を行います。
Rayは、固定間隔で発射される見えない判定「弾丸」と理解できます。これらの「弾丸」が他の壁判定やタイルに接触すると、「命中」と判定されます。このプロセスを**レイキャスト(RayCast)**と呼びます。
レイキャストの設定について
レイキャストは、条件「オブジェクトの壁判定と接触」、「タイルと接触」、「傾斜属性タイルと接触」のいずれかで設定可能なパラメータです。
射線数(ray_number):
整数で設定可能です。射線数は判定生成領域の各辺に発射される射線の数を表します。
射線は辺の長さに応じて等間隔に配置されます。
たとえば、辺の長さが24ピクセルの場合:
- 射線数が3の場合、12ピクセルごとに1本の判定が生成される。
- 射線数が4の場合、8ピクセルごとに1本の判定が生成される。
射線が多いほど判定は信頼性が高くなりますが、処理負荷も増えるため、パフォーマンスへの影響に注意してください。
判定方法(detect_method):
**Any(任意)またはAll(すべて)**の2種類から選択可能です。
- Any: 生成された射線のうち少なくとも1本が接触成功すれば、「接触中」と判定されます。
- All: すべての射線が接触成功した場合にのみ、「接触中」と判定されます。
以下の図のように、角部のみに接触している場合: - Anyでは「接触中」と判定される。
- Allでは「接触していない」と判定される。
射線長(ray_length):
float値で指定可能で、射線が発射される**距離(ピクセル単位)**を表します。
言い換えると、何ピクセル以内であれば接触と判定するかを指定するものです。
主に上下に移動する昇降台などのオブジェクトで調整が必要です。
たとえば、下に移動する昇降台は「昇降台の移動 → プレイヤーの追随移動」という順序で処理されるため、一瞬だけプレイヤーと台がわずかに離れる状態が発生します。このとき、射線が短すぎると「接触していない」と判定されてしまうことがあります。
一方で、射線を長くしすぎると、すでに離れているにもかかわらず、まだ接触していると判定される問題が発生します。
したがって、通常はGameObject > CharacterBody2D > Floor > Snap Length(吸着距離)の長さと、使用する昇降台の速度を考慮して調整することが適切です。
射線オフセット(ray_offset):
float値で指定可能で、射線生成時に角から内側にどれだけのピクセル分オフセットするかを設定します。
前述の通り、判定生成領域は常に矩形ですが、衝突形状はカプセル、多角形、または複数の衝突の組み合わせなど、必ずしも矩形ではないことがあります。
オフセットを設定することで、レイキャストが実際の衝突形状に近づけることができます。
オフセット値は、各辺の両端から内側のピクセル数を表します。
たとえば、辺の長さが24ピクセルで3本の射線を発射する場合、以下の図のように配置されます。
座標空間(coord_space):
これは、どの座標空間を基準として接触方向を判定するかを設定するオプションです。
主に、オブジェクトが回転状態で接触した場合に、方向の判定をどのように行うかを決定するために使用されます。
たとえば、180°回転し、上下逆さまになったオブジェクトが地面に接触した場合、
接触方向は「下」か「上」か?
用途によって答えは異なります。
「頭にぶつかった」と判定したい場合は「上」、
「着地した」と判定したい場合は「下」が適切です。
また、「オブジェクト自体は回転していないが、衝突体だけが回転している」ケースもあります。
この設定はGlobal、Local is Game Object、Local is Collisionの3つのモードから選択可能です。
以下に2つの図で説明します。
① ゲームオブジェクト自体が45°回転し、地面に接触した場合
② ゲームオブジェクトは動かず、衝突体だけが90°回転し、地面に接触した場合
-
Global(グローバル座標:ゲーム全体のシーン座標を基準)
ゲームオブジェクトの原点と接触オブジェクトの原点のグローバル座標に基づいて方向を判定します。
回転は一切考慮されないため、図①と図②の両方で「下」に接触と判定されます。 -
Local is Game Object(ゲームオブジェクトのローカル座標を基準)
ゲームオブジェクトのローカル座標に基づいて方向を判定します。
つまり、ゲームオブジェクト自身の回転のみを考慮します。- 図①では「右」と「下」に接触と判定される。
- 図②では「下」に接触と判定される。
-
Local is Collision(壁判定/衝突体のローカル座標を基準)
衝突体のローカル座標に基づいて方向を判定します。
つまり、衝突体自身の回転のみを考慮します。- 図①では「右」と「下」に接触と判定される。
- 図②では「右」に接触と判定される。
これは少し理解しにくい概念ですが、習得すれば、自分の期待に合った正確な判定を実現できるようになります。





