スポンサーリンク
エラー・トラブルシューティング

Unityでオブジェクトがすり抜ける原因と対策|ColliderとRigidbody完全解説

エラー・トラブルシューティング

はじめに

「プレイヤーが壁をすり抜ける」「弾が床を貫通する」——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)

Q
Rigidbodyがなくても当たり判定はできますか?
A

条件付きで可能です。
両方がColliderのみの場合でも「静的Collider同士」として配置はできますが、

  • 物理的に動かない
  • 衝突による反応が発生しない

といった制限があります。
動くオブジェクトにはRigidbodyを付けるのが基本です。

Q
Continuous Dynamicは常に使うべきですか?
A

常に使う必要はありません。
精度は高いですが、その分CPU負荷も上がります。

使い分けの目安は👇

  • 通常の移動 → Discrete
  • 高速移動(壁など) → Continuous
  • 高速同士の衝突 → Continuous Dynamic

必要なオブジェクトだけに適用するのがポイントです。

Q
低速なのにすり抜けるのはなぜですか?
A

速度以外の原因の可能性が高いです。

特に多いのは👇

  • Transformで直接移動している
  • Is TriggerがONになっている
  • Layer設定で衝突が無効になっている

このあたりをチェックすると、原因が見つかることが多いです。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク