8-1. 基本的なコリジョン検出手法

基本的なコリジョン検出方法

物体同士が触れているか、衝突するか、などを検出するコリジョン検出処理はゲームロジックの実装等において非常によく使う機能であり重要です。以下ではRobloxで可能な主要なコリジョン検出方法を挙げていきます。

接触判定(Touchedイベント)

最も単純かつ一般的な検出方法は、パーツのTouchedイベントによるタッチ検出です。対象のパーツにほかのパーツが触れるたびにイベントが発生します。Touchedイベントは多重に呼ばれることもありそれを考慮したイベントハンドリングが必要です。
また、接触終了を取得する「TouchEnded」イベントもあります。ただしTouchedとTouchEndedは必ずしも対になってコールされるわけではないことには注意が必要です。そのため、TouchEndedで「触れていない状態になったこと」を管理するのは難しく、触れているかどうかの管理は以下のオーバーラップ判定で行うほうが確実です。
使用例: プレイヤーがトラップに触れた際にダメージを与える、オブジェクトが地面に触れた際に音を鳴らすなど。
実装例:

オーバーラップ判定

特定の空間内にあるオブジェクトを検出するオーバーラップ判定には、workspaceクラスなどから利用できるを利用します。これにより指定した空間内にあるパーツの配列を取得することができます。またによる詳細な検出対象フィルター指定も可能です。
メソッド名が示す通り、では、含まれるパーツのバウンディングボリュームに対する検出となるため検出負荷が軽く済ませられます。ではパーツの正確な形状に対して検出を行うため前者より負荷が高くなります。また、形状に完全に合わせるため、中が空洞のものなどが内部分しかオーバーラップしてない場合検出されないなどが起きます。
明確な必要性がない限りはの利用を検討するのが無難です。また同様のメソッドでによる球形状での検出も可能となっています。検出エリア形状を3D空間上のパーツで生成する場合もBoxや球で生成することが多いためこれらメソッドの利用に置き換えることができます。
使用例: 特定エリア内にプレイヤーが入ったかどうかを検出する、特定エリアにいる人数を把握する、など。
実装例:

レイキャスト

Raycastingは、指定した方向に「レイ」(線)を発射し、そのレイが衝突するオブジェクトを検出する方法です。より精密なコリジョン検出や、接地面の検出、視線の追跡、射撃メカニクスなどに適しています。
使用例: 弾丸や視線がオブジェクトに当たったかを確認する、障害物の有無を検出するなど。
実装例:

コリジョン検出の注意点

コリジョン検出は基本的に負荷が高めな処理となっており、使いすぎるとゲームのパフォーマンスに影響を与える可能性があります。特に明示的に検出をかけにいく、オーバーラップ判定、Raycastingは毎フレーム実行することなどを避け、必要な場所でのみ使用し、最適化することが重要です。

参照すべき情報