このマニュアルでは、オブジェクトの壁判定(CollisionShape2D)とタイルや他のオブジェクトの壁判定との接触に関する詳細設定について解説します。
壁判定の接触判定の概要とレイキャスト
ACTION GAME MAKERの壁判定は、オブジェクトの壁判定(CollisionShape2D)のサイズに応じた、四角形の判定生成用エリアを生成し、その領域の四辺からRayと呼ばれる判定のための法線を飛ばして判定します。
Rayとは目に見えない判定用の弾を一定間隔で飛ばすようなもので、その弾が他の壁判定やタイルに触れることで当たった、と判定します。これをレイキャスト(RayCast)といいます。
レイキャストの設定について
レイキャストは条件「オブジェクトの壁判定と接触」および「タイルと接触」、「坂属性タイルと接触」にて設定できる項目です。
レイの本数(ray_number):
整数で設定することができます。レイの本数は、判定生成用エリアの1辺あたりのレイの本数を示します。
一辺の長さに応じて、等間隔に配置されます。
仮に一片の長さが24pixelの場合、レイの本数が3であれば12pixelごと、4であれば8pixelごとに判定を生成します。
レイの数が多ければ多いほど判定は確実になりますが、その分処理が重くなることがあることにはご注意ください。
判定方法(detect_method):
Any(いずれか一つ)かAll(すべて)の2種類から選択できます。
Anyの場合は、生成したレイのうち一つでも接触に成功すれば接触したと判定します。
Allの場合はすべてのレイが接触に成功した場合のみ、接触したと判定します。
以下のように角と接触している際、Anyであれば「接触している」Allであれば「接触していない」と判定されます。
レイの長さ(ray_length):
float値で指定することができます。レイを何ドットまで飛ばすかを指定をすることができます。
つまり、何pixel離れている場合まで接触していると判定するか?という指定を行います。
主に、上下に移動するリフト等の判定時に調整が必要です。
下るリフトなどでは、リフトが移動する→移動するリフトに合わせてキャラクターが動く、という処理を順番に行うため一瞬だけ距離が離れてしまう瞬間があります、その際にレイが短いと「接触していない」という判定となる可能性があります。
一方で、あまり長くしすぎると離れているのに判定するということが起きてしまうため、通常は、GameObjectのCharacterBody2D>Floor>Snap Length(吸着距離)プロパティの長さや、利用しているリフトオブジェクトの速度に合わせて調整しましょう。
レイのオフセット(ray_offset):
float値で指定することができます。レイの生成時に、角から何ドットのオフセットを入れるかを設定できます。
前述の通り、判定生成用のエリアは必ず四角形ですが、コリジョンの形状はカプセル型、多角形、複数のコリジョン等、必ずしも四角形ではありません。
オフセットを利用することで、より実態のコリジョンに近いレイキャストが可能になります。
オフセットの値は各辺の両端からのpixel数です。
つまり、一片の長さが24pixelで3本のレイを飛ばす場合、以下の図のようになります。
座標空間(coord_space):
どの座標空間を基準に方向の判定を行うか?という設定です。
主に、オブジェクトが「回転」した状態で接触した際、どのように判定するのか?という指定です。
例えば、180度回転して上下逆になったオブジェクトが床に触れた際、触れたのは「下」でしょうか?「上」でしょうか?したいことによって求める結果が異なるはずです。
頭に当たったと判定をしたいのであれば「上」が必要になりますし、
単純に着地の判定をしたいときは「下」と判定されるほうがよいはずだからです。
さらに、オブジェクトはそのままで「コリジョンだけが回転」するケースなどもあります。
この判定をGlobal、Local is Game Object、Local is Collisionの3つから選ぶことができます。
以下の2つの図を使って説明します。
①ゲームオブジェクト自体が45度回転した状態で地面に接触した時
②ゲームオブジェクトはそのままで、コリジョンだけが90度回転した状態で地面に接触する時
- Global(グローバル座標、ゲームシーン全体の座標で判定)
ゲームオブジェクトの原点と接触対象の原点のグローバル座標で判定を行います。
つまり、回転は全く考慮されませんので、①の図でも②の図でも「下」が接触した、と判定されます。 - Local is Game Object(ゲームオブジェクトのローカル座標で判定)
ゲームオブジェクトのローカル座標で判定を行います。
つまり、ゲームオブジェクトの回転のみが考慮されます。
①の図であれば、「右」と「下」、②の図であれば「下」が接触したと判定されます。 - Local is Collision(壁判定のローカル座標で判定)
コリジョンのローカル座標で判定を行います。
つまり、コリジョンの回転のみが考慮されます。
①の図であれば、「右」と「下」、②の図であれば「右」が接触したと判定されます。
少し難しい概念ですが、使いこなすことであなたの思い通りの判定が作れるようになるはずです。





