Unity Rigidbody の Collision Detection モードについて
Unity の Rigidbody.collisionDetectionMode
は、オブジェクトの衝突判定の精度を設定するプロパティです。特に、高速で移動するオブジェクトが壁をすり抜けてしまう問題を防ぐために重要です。
Collision Detection Mode の種類
collisionDetectionMode
には、次の 4種類のモード があります。
モード | 説明 | 適用例 |
---|---|---|
Discrete (デフォルト) |
フレームごとの物理計算で衝突を判定(低負荷) | ゆっくり動くオブジェクト(キャラクター、家具など) |
Continuous |
次のフレームまでの軌道を予測 して衝突判定(高速向け) | 高速で動くプレイヤーや弾丸 |
ContinuousDynamic |
他の Continuous オブジェクトとの衝突も考慮(最も精度が高い) | 高速で動く剛体が「動く壁」に当たる場合 |
ContinuousSpeculative |
負荷を抑えた Continuous(ただし精度は落ちる) | ある程度速いが、そこまで精度が不要なオブジェクト |
各モードの使い分け
1. ゆっくり動くオブジェクト
デフォルト設定で問題なし。
rb.collisionDetectionMode = CollisionDetectionMode.Discrete;
2. 高速で動くプレイヤーや弾丸
壁や障害物をすり抜けないようにする。
rb.collisionDetectionMode = CollisionDetectionMode.Continuous;
3. 高速なオブジェクト同士の衝突を考慮
動く壁に当たる可能性がある場合、より精度の高い衝突判定を行う。
rb.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
4. パフォーマンスを抑えつつ Continuous を使いたい場合
負荷を抑えつつ、ある程度の高速移動をカバーする。
rb.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative;
設定の実装例
弾丸がすり抜けないようにするコード
public class Bullet : MonoBehaviour
{
Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
rb.collisionDetectionMode = CollisionDetectionMode.Continuous;
}
}
注意点
Discrete
だと、高速移動時にすり抜ける可能性がある。ContinuousDynamic
は処理負荷が高いため、必要なオブジェクトだけに適用するのが推奨。-
ContinuousSpeculative
は負荷は軽いが、精度が若干落ちるため慎重に選択する。
まとめ
- デフォルト (
Discrete
) は低負荷だが、高速移動時のすり抜けが発生しやすい。 - すり抜けを防ぐには
Continuous
やContinuousDynamic
を使う。 - パフォーマンスと精度を両立したいなら
ContinuousSpeculative
を試す。
適切な collisionDetectionMode
を選択して、物理演算の安定性を高めましょう!