このセクションでは、ACTION GAME MAKER における オブジェクト壁衝突(CollisionShape2D) が タイル壁 や 他のオブジェクト衝突 とどのように相互作用するか、およびそれらを正確に設定する方法を詳しく説明します。
壁衝突とレイキャストの動作概要
ACTION GAME MAKER では、壁衝突検出は、オブジェクトの CollisionShape2D のサイズに基づいて 矩形の衝突領域 を生成することで動作します。
この矩形の4辺から、法線ベースの衝突チェックに使用される レイ(見えない検出線)が外向きに発射されます。
レイ は、一定間隔で発射される見えない弾丸と考えてください。これらのレイのいずれかが他の壁コライダーまたはタイルに触れた場合、システムはそれを 衝突 として検出します。
この検出方法を レイキャスト と呼びます。
レイキャストの設定
レイキャストのパラメータは、以下の条件で調整できます:
- 「オブジェクト壁衝突」
- 「タイル衝突」
- 「スロープタイル衝突」
レイの数(ray_number)
このパラメータは整数で設定され、検出領域の各辺に発射されるレイの数を決定します。
レイは辺の長さに 均等に 分布されます。
たとえば、1辺が 24ピクセル の場合:
- 3本のレイ では、12ピクセル ごとに配置されます。
- 4本のレイ では、8ピクセル ごとに配置されます。
レイの数を増やすと検出精度が向上しますが、処理負荷も増加するため、パフォーマンスに注意してください。
検出方法(detect_method)
Any と All の2つから選択できます:
- Any:少なくとも1本 のレイが接触した場合に衝突を検出します。
- All:すべてのレイ が接触した場合にのみ衝突を検出します。
たとえば、角のみが接触している場合:
- Any → 「衝突を検出」
- All → 「衝突を検出せず」
レイの長さ(ray_length)
これは float 値で、各レイが どれだけ遠くまで 進むか(ピクセル単位)を決定します。
つまり、オブジェクトから どれだけ離れた位置 でも衝突を検出できるかを定義します。
これは、垂直方向に移動するオブジェクト(例:エレベーターやリフト)にとって特に重要です。
たとえば、リフトが下に移動するとき、キャラクターの位置が一時的にプラットフォームから1フレーム分離れることがあります。
レイの長さが短すぎると、システムは一時的に「接触なし」と判断してしまう可能性があります。
一方で、レイの長さが長すぎると、実際には接触していないにもかかわらず衝突を検出してしまうことがあります。
適切な値を設定するための目安として、以下の値を参考にしてください:
GameObject > CharacterBody2D > Floorの Snap Length 値、または- 使用している移動プラットフォームの 速度
レイのオフセット(ray_offset)
これは float 値で、各角からレイが開始する位置までの距離を定義します。
前述の通り、衝突検出領域は 常に矩形 ですが、実際のコライダーは カプセル や ポリゴン、あるいは 複数の形状 である場合があります。
オフセット を使用することで、レイを実際のコライダーの形状に合わせて調整できます。
オフセット値は、辺の各端から ピクセル単位 で測定されます。
たとえば、1辺が 24ピクセル で 3本のレイ を発射する場合、レイの配置は以下のようになります:
座標空間(coord_space)
この設定は、衝突方向の解釈に使用する 座標空間 を決定します。
オブジェクトが 回転している場合 に特に有用で、接触方向の評価方法が変わります。
たとえば:
- 180°回転したオブジェクト が床に触れた場合、それは「下」または「上」の接触とみなすべきでしょうか?
- 「頭部へのヒット」を検出したい場合は「上」、
- 「接地判定」を検出したい場合は「下」を検出するべきです。
また、コライダーのみが回転 し、オブジェクト全体は回転しない場合もあります。
3つの座標モードから選択できます:
Global、Local is Game Object、Local is Collision。
以下に2つの例を示します:
① GameObject全体が45°回転して地面に接触した場合:
② コライダーのみが90°回転し、GameObjectは回転していない場合:
-
Global(グローバル座標空間)
検出は、GameObjectとターゲットコライダーの ワールド座標 に基づいて行われます。
回転は 考慮されない ため、ケース①と②の両方とも「下」に接触したと検出されます。 -
Local is Game Object(GameObjectのローカル座標空間)
検出は、GameObjectのローカル回転 に基づいて行われます。
- ケース①:「右」と「下」に接触したと検出されます。
- ケース②:「下」に接触したと検出されます。
- Local is Collision(コライダー自体のローカル座標空間)
検出は、コライダーの回転 のみに基づいて行われます。
- ケース①:「右」と「下」に接触したと検出されます。
- ケース②:「右」に接触したと検出されます。
一見複雑に思えるかもしれませんが、これらの設定を習得することで、ゲーム独自のメカニクスに合わせた 正確で柔軟な衝突挙動 を構築できるようになります。





