はじめに
「プレイヤーが壁をすり抜ける」「弾が床を貫通する」——Unityで物理を使い始めると、ほぼ確実に一度はぶつかる問題です。
特にやっかいなのが、毎回ではなく“たまに起きる”こと。動いたり動かなかったりするので、原因が分かりづらいんですよね。
よくある症状としてはこんな感じです👇
- 高速で動かすとだけすり抜ける
- 弾や落下オブジェクトが貫通する
- 当たっているはずなのに止まらない
- 環境やフレームレートによって挙動が変わる
この現象は、単なる設定ミスだけでなく、Unityの物理エンジンの仕組みそのものが関係しています。
ただし安心してください🙂
原因は大きく分けると、次の3つに整理できます。
- 設定の問題(Rigidbody / Collider)
- 使い方の問題(Transform移動など)
- 仕組みの問題(トンネル現象)
この3つを順番に見ていけば、ほぼ確実に原因は特定できます。
ここから先は、すぐ確認すべきポイント → 原因ごとの解決 → 再発防止という流れで整理しています。
途中で「あ、これだ」と思ったら、その時点で直せる構成になっています。
結論:まず最初に確認すべき5つのポイント
すり抜けの原因は細かく見ると色々ありますが、まずは次の5つを確認してください。
この段階で解決するケースがかなり多いです。
- Rigidbodyが付いているか
- Transformで直接移動していないか
- Collision DetectionがDiscreteのままになっていないか
- Colliderのサイズ(特に厚み)が十分か
- 移動速度が速すぎないか
特に重要なのが「移動速度」と「Colliderの厚み」の関係です。
目安としては👇
- 1フレームで移動する距離 > Colliderの厚み → すり抜けが発生しやすい
たとえば、壁の厚みが「0.1」しかないのに、1フレームで「0.2」移動していたら、
壁の手前と奥にワープしてしまい、衝突が検知されません。
また、次のようなケースは特に注意が必要です。
- 弾や落下物などの高速オブジェクト
- Transformで直接座標を変更している
- デフォルト設定(Discrete)のまま使っている

「なんとなく動いているからOK」と思っていると、あとで必ず問題になります。
まずはこの5つをチェックして、明らかなミスがないか確認してみてください。
Unityですり抜けが起きる仕組み
トンネル現象とは何か?
Unityの物理挙動は「連続的に動いているように見えて、実はそうではない」というのがポイントです。
実際には、一定時間ごと(FixedUpdateごと)に位置を更新する「離散計算」で動いています。
イメージとしてはこんな感じです👇
- フレーム1:壁の手前にいる
- フレーム2:すでに壁の向こう側にいる
このとき、「壁の中を通過した」という情報が存在しないため、衝突が検知されません。
これがいわゆるトンネル現象(Tunnelling)です。
つまり、Unityでは「間を通ったかどうか」ではなく、
「そのフレーム時点で重なっているか」だけで判定されているんですね。
どのくらいで発生するのか?
すり抜けが起きるかどうかは、次の関係で決まります。
- 移動速度
- 1フレームの時間(Fixed Timestep)
- Colliderの厚み
判断基準としてシンプルに考えるなら👇
- 1フレームの移動距離 > Colliderの厚み → 危険
たとえば、
- 壁の厚み:0.2
- 1フレームの移動距離:0.3
この場合、壁を飛び越えてしまう可能性が高くなります。
逆に言うと、
- 移動距離が十分に小さい
- Colliderにしっかり厚みがある
この2つが満たされていれば、基本的にすり抜けは起きにくいです。
ここで大事なのは「速いからダメ」ではなく、
「1フレームでどれだけ移動しているか」という視点です。

この仕組みを理解しておくと、設定を変えるべきか、設計を見直すべきかの判断がかなり楽になります。
よくある原因5選と解決方法
Rigidbodyが設定されていない
症状
衝突しているはずなのに、オブジェクトが止まらずそのまま通り抜けてしまう
原因
Rigidbodyが付いていないオブジェクトは「静的Collider」として扱われ、自分では物理的に動きません。
そのため、正しい衝突計算が行われないケースがあります。
解決方法
- 動かすオブジェクトにRigidbodyを追加する
- Inspectorから「Add Component → Rigidbody」を選択
注意点
Is KinematicがONになっていると、物理演算の影響を受けなくなるため、挙動が変わる場合があります。
再発防止
「動くオブジェクトには必ずRigidbodyを付ける」と覚えておくと迷いません。
Transformで直接動かしている
症状
通常は問題ないのに、高速移動した瞬間だけすり抜ける
原因
Transform.positionで位置を直接変更すると、物理エンジンの計算を無視した移動になります。
その結果、衝突判定がスキップされやすくなります。
解決方法
- Rigidbody.velocityを使って移動する
- Rigidbody.AddForceを使う
- 移動処理はFixedUpdateで行う
注意点
Updateで物理移動を行うと、フレームレートによって挙動が変わる可能性があります。
再発防止
物理挙動は「Rigidbody+FixedUpdate」で扱うのが基本です。
Collision Detectionの設定ミス
症状
高速で動くオブジェクトだけ壁をすり抜ける
原因
デフォルトの「Discrete」は軽量ですが、高速移動時の衝突検知に弱い特性があります。
解決方法
- Rigidbodyの「Collision Detection」を変更する
- ContinuousまたはContinuous Dynamicを選択
比較の目安
| モード | 特徴 |
|---|---|
| Discrete | 軽いが高速に弱い |
| Continuous | 静的オブジェクトとの衝突に強い |
| Continuous Dynamic | 動的同士でも安定(負荷高) |
| Continuous Speculative | 回転も考慮(比較的軽め) |
注意点
精度を上げるほどCPU負荷も上がるため、必要なオブジェクトだけに適用するのがポイントです。
再発防止
高速で動くもの(弾・プレイヤーなど)は最初からContinuous系を検討すると安定します。
Colliderが小さい・薄い
症状
細い壁や小さいオブジェクトだけすり抜ける
原因
Colliderの厚みが足りないと、1フレームで飛び越えてしまう可能性があります。
解決方法
- Colliderのサイズを大きくする
- 壁に厚みを持たせる
- 複数のColliderを組み合わせる(Compound Collider)
注意点
見た目とColliderサイズが一致していないと、違和感のある挙動になります。
再発防止
「見た目より少し厚め」を意識すると安定しやすいです。
速度が速すぎる
症状
弾や高速移動するオブジェクトが頻繁に貫通する
原因
1フレームの移動距離が大きすぎて、衝突判定を飛び越えてしまっています。
解決方法
- 速度を下げる
- Fixed Timestepを小さくする(物理更新回数を増やす)
- Collision Detectionを強化する
判断基準
- 移動距離 > Collider厚み → すり抜けやすい
注意点
Fixed Timestepを下げるとCPU負荷が上がるため、プロジェクト全体への影響も考慮が必要です。
再発防止
「速度・厚み・更新頻度」のバランスで考えると安定します。
すぐ確認できる診断チェックリスト
上から順にチェックしていけば、原因の切り分けがスムーズに進みます。
3分以内で確認できる内容に絞っています。
- □ Rigidbodyが付いている
- □ Colliderが有効になっている(Enabled)
- □ Is TriggerがONになっていない
- □ Transformで直接移動していない
- □ 移動処理をFixedUpdateで行っている
- □ Collision Detectionが適切(高速ならContinuous系)
- □ Colliderに十分な厚みがある
- □ Layer Collision Matrixで衝突が無効になっていない
- □ 速度が速すぎない(1フレームで飛び越えていない)
- □ Fixed Timestepが大きすぎない
チェックのコツは、「設定 → 使い方 → 物理条件」の順で見ることです。
| 確認の順番 | 内容 |
|---|---|
| ① | Rigidbody / Colliderの設定 |
| ② | Transform操作やUpdate使用の有無 |
| ③ | 速度・厚み・Collision Detection |

特にありがちなのが、「設定は正しいのに動き方が間違っている」ケースです。
このチェックリストを使うと、そのズレに気づきやすくなります。
よくある誤解と正しい理解
Colliderがあれば当たる
Colliderが付いていれば衝突する、と思いがちですが、それだけでは不十分な場合があります。
Unityの物理挙動では、少なくともどちらか一方にRigidbodyが必要です。
両方ともColliderだけだと、静的同士として扱われ、期待通りに動かないことがあります。
正しくは👇
- 動くオブジェクト → Rigidbody + Collider
- 動かないオブジェクト → ColliderのみでもOK
この役割を意識するだけで、かなりトラブルが減ります。
Continuousにすれば全部解決する
Collision DetectionをContinuous系にすれば安心、というわけではありません。
確かにすり抜けは減りますが、次のような限界があります。
- 回転による衝突は検知しづらい場合がある
- 負荷が高くなる
- ゴースト衝突が発生することがある
そのため、設定だけに頼るのではなく「速度・厚み・移動方法」もセットで考えることが重要です。
一度動いたから設定は正しい
これもかなり多い誤解です。
Unityの物理はフレームごとに計算されるため、
- フレームレート
- 処理順
- 負荷状況
によって結果が変わることがあります。
つまり、「たまたまうまくいった」だけの可能性もあるということです。
再現性があるかどうかで判断するクセをつけると、安定した設計になります。
Transformで動かしても問題ない
見た目上は動くので気づきにくいですが、これはかなり危険な使い方です。
Transformで直接位置を変更すると、物理エンジンを通らないため、
- 衝突判定がスキップされる
- すり抜けが発生しやすくなる
といった問題が起きます。
正しくは👇
- 物理挙動 → Rigidbodyで操作
- 見た目だけ動かす → TransformでもOK

この使い分けを意識するだけで、トラブルの多くは防げます。
より高度な対策
Fixed Timestepを調整する
物理計算の精度を上げたい場合、「Fixed Timestep」を調整する方法があります。
設定場所は👇
- Edit → Project Settings → Time → Fixed Timestep
この値を小さくすると、1秒あたりの物理計算回数が増えます。
| 設定 | 結果 |
|---|---|
| 値が大きい | 軽いが精度が低い |
| 値が小さい | 精度が高いが重い |
すり抜け対策としては有効ですが、CPU負荷が増えるため、
全体のパフォーマンスに影響する点には注意が必要です。
目安としては、
- 通常:0.02(デフォルト)
- 精度重視:0.01〜0.015程度
むやみに下げすぎるのではなく、必要な範囲で調整するのがポイントです。
CCDの仕組みを理解する
Collision Detection(CCD)には、大きく2つの考え方があります。
- スイープ方式:進行方向に沿って衝突をチェックする
- 投機方式(Speculative):未来の接触を予測して判定する
それぞれの特徴は次の通りです。
| 方式 | 特徴 |
|---|---|
| スイープ | 直線移動に強いが回転には弱い |
| Speculative | 回転にも対応するが誤判定が起きる場合あり |
状況によって最適な選択が変わるため、「どれが最強」というよりは、
用途に合わせて選ぶという考え方が大切です。
Mesh Colliderの扱いに注意する
見た目に合わせてMesh Colliderを使いたくなることもありますが、注意が必要です。
- 計算コストが高い
- 複雑な形状だと判定が不安定になる
そのため、基本的には👇
- Box Collider
- Sphere Collider
- Capsule Collider
などのプリミティブColliderを組み合わせる方法が推奨されます。
どうしてもMesh Colliderが必要な場合は、
- ConvexをONにする
- 重要な部分だけに限定する
といった工夫をすると安定しやすくなります。

ここまでの対策は、アクションゲームや高速処理が多いゲームで特に重要になります。
普段の開発では「必要になったら使う」くらいの意識で大丈夫です。
実際にハマりやすいパターン
実際の開発でよくある「原因の見当違い」をいくつか紹介します。
どれも一度は通るポイントなので、自分の状況と照らし合わせてみてください。
Colliderの問題だと思ったらTransformだった
「当たり判定がおかしい」と思ってColliderを何度も調整していたのに、
原因はTransformで直接動かしていたことだった、というケースです。
見た目はちゃんと動いているので気づきにくいですが、
物理エンジンを通していないため、衝突判定がスキップされていました。
この場合は、
- Transform操作 → Rigidbody.velocityに変更
- Update → FixedUpdateに変更
これだけで一気に安定することが多いです。
弾だけすり抜ける問題
プレイヤーや敵は問題ないのに、「弾だけ貫通する」というケースもよくあります。
これはほぼ確実に、
- 速度が速い
- Collision DetectionがDiscreteのまま
この2つが原因です。
対処としては👇
- Collision DetectionをContinuousまたはContinuous Dynamicに変更
- 必要ならColliderの厚みを少し増やす
高速オブジェクトは最初から特別扱いするのが安定します。
Fixed Timestepを下げすぎて重くなる
精度を上げようとしてFixed Timestepを極端に小さくすると、
今度はパフォーマンスが落ちる問題が出てきます。
特に、
- 0.005以下など極端な値
- 複数のRigidbodyがあるシーン
では影響が大きくなります。
この場合は、
- Collision Detectionの見直し
- 速度やColliderの調整
といった別の方向で解決する方がバランスが良いです。

物理の問題は「1つの設定で全部解決しようとする」と失敗しやすいので、
複数の要素を少しずつ調整する意識が大切です。
まとめ
すり抜け問題は複雑に見えますが、原因はある程度パターン化できます。
まずは次の順番で確認するのが効率的です👇
- ① RigidbodyとColliderの設定
- ② Transformで直接動かしていないか
- ③ Collision Detectionの設定
- ④ 速度とColliderの厚みのバランス
特に重要なのは、「速さ」ではなく1フレームあたりの移動距離という考え方です。
・移動距離が大きすぎる
・Colliderが薄すぎる
・物理エンジンを通していない
このどれかに当てはまっていないかを見るだけで、かなり原因が絞れます。
また、1つの設定で解決しようとするのではなく、
- 設定(Rigidbody / Collider)
- 使い方(移動方法)
- 設計(速度・厚み)
この3つをバランスよく調整することが、安定した挙動につながります。
より体系的に物理の仕組みを理解しておくと、こういったトラブルに強くなります。
楽しく学ぶUnity「3Dゲーム」作りのきほん
✅ Amazonでチェックする| ✅ 楽天でチェックする
楽しく学ぶ Unity「2Dゲーム」作りのきほん
✅ Amazonでチェックする| ✅ 楽天でチェックする
一度理解してしまえば、「なぜ起きるのか」が分かるようになり、同じ問題で悩むことはほとんどなくなります。
よくある質問(FAQ)
- QRigidbodyがなくても当たり判定はできますか?
- A
条件付きで可能です。
両方がColliderのみの場合でも「静的Collider同士」として配置はできますが、- 物理的に動かない
- 衝突による反応が発生しない
といった制限があります。
動くオブジェクトにはRigidbodyを付けるのが基本です。
- QContinuous Dynamicは常に使うべきですか?
- A
常に使う必要はありません。
精度は高いですが、その分CPU負荷も上がります。使い分けの目安は👇
- 通常の移動 → Discrete
- 高速移動(壁など) → Continuous
- 高速同士の衝突 → Continuous Dynamic
必要なオブジェクトだけに適用するのがポイントです。
- Q低速なのにすり抜けるのはなぜですか?
- A
速度以外の原因の可能性が高いです。
特に多いのは👇
- Transformで直接移動している
- Is TriggerがONになっている
- Layer設定で衝突が無効になっている
このあたりをチェックすると、原因が見つかることが多いです。







※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。
※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。