超高速移動するオブジェクトが壁を突き抜ける「トンネリングバグ」の修正方法は、実機テストやレンダリングパイプライン拡張において頻発する重度なテクニカルバグです。銃の弾丸や高速で走る車が、当たり判定用の壁(コライダー)をすり抜けて向こう側に消えてしまう不具合の解決策の解説。

不具合の具体的な症状

ゲーム内で弓矢や銃の弾丸、または高速で移動する障害物を射出した際、本来なら頑丈な壁(コライダー)に当たって火花を散らして止まるべきであるのに、壁を何事もなかったかのようにすり抜けて向こう側に突き抜けて消えてしまう。

現実世界での例え:パラパラ漫画のコマの間で、ボールが壁をワープして飛び越えてしまうコマ飛びのすり抜け

物理エンジンは、パラパラ漫画のように1枚ずつ「今ボールはここ、次はここ」と点々(フレーム)で位置をチェックしています。ボールが速すぎて、1枚目のページ(壁の手前)から次のページ(壁の奥)へ瞬間移動してしまったため、壁と「重なった瞬間」が1コマも存在せず、すり抜けてしまいました。軌跡を「線(レーザー光線)」として繋げて、その線が壁の板と交差しているかを過去フレームから連続スキャン(CCD)させることで、どれだけ速くても確実に衝突をキャッチします。

超高速移動するオブジェクトが壁を突き抜ける「トンネリングバグ」の修正方法 troubleshooting diagram

図:超高速移動するオブジェクトが壁を突き抜ける「トンネリングバグ」の修正方法の不具合発生メカニズムと解決アプローチの概要図

想定される原因と詳細な仕組み

Unityの物理演算(PhysX)がデフォルトで「離散的衝突判定(Discrete)」になっており、1フレームの間にオブジェクトが移動する距離が「壁の厚み」を遥かに超えてジャンプしてしまっているため、フレームのコマとコマの間で物理エンジンが衝突を検知できない(トンネリング現象)ためです。

解決アプローチと最適化手順

高速移動するオブジェクトのRigidbodyコンポーネントを開き、衝突検出モード(Collision Detection)を「Discrete」から「Continuous(連続的衝突判定 / CCD)」または「Continuous Dynamic」に切り替えます。これにより、フレーム間を物理的な『線』として繋いで厳密に衝突をスキャンさせます。