9.

UE5で動くオブジェクトと静止キャラの当たり判定が出ない原因と解決方法

編集

UE5で「動いているオブジェクトが静止しているキャラクターに当たっても当たり判定(Hitイベント)が発生しない」場合、まず確認すべきは双方のコリジョンが有効かイベントを発生させたい側のコンポーネントで「Simulation Generates Hit Events(Hitイベントを生成)」が有効になっているかの2点です。それでもHitが出ない場合は、HitではなくOverlap(オーバーラップ)イベントで判定するのが最短の解決策です。HitイベントはUE5の仕様上「動いている側」を起点に発生し、各コンポーネントは自分自身にしか通知しないため、静止しているキャラクター側のHitは発火しにくいからです。

この記事の要点
  • 最短の解決:双方の Collision Enabled を「Query and Physics」にし、判定したい側で「Simulation Generates Hit Events」を ON。出ないなら Overlap に切り替える。
  • HitはOverlapと別物:Hit は基本的に物理的なブロック(衝突)や Sweep 移動で発生し、各コンポーネントは自分自身にだけ通知する。相手側のイベントは別途設定が必要。
  • 「動いている側」が起点:静止して一切動かないキャラクターは、いくら当てられても自分の Hit を発火しにくい。確実に拾うなら Overlap を使う。
  • 片方だけ設定は失敗の典型:オブジェクトとキャラクターの両方で設定を揃える。Block/Overlap のレスポンスもお互いに対応している必要がある。

なぜHitイベントはOverlapより条件が厳しいのか

「当たり判定が出ない」を解決するには、まず UE5 が当たり判定をどう扱うかを整理すると早道です。当たり判定には大きく Hit(ブロック/衝突)Overlap(重なり) の2系統があり、発生条件がそれぞれ異なります。「Hitが出ない」と言っているケースの多くは、実は Overlap で拾うべき状況です。

当たり判定が出ない主な原因は次の通りです。

  • コリジョンプリセット/Collision Enabled が不適切:「No Collision」や「Query Only (No Physics Collision)」になっていると、物理的なブロック=Hitが発生しません。Hitを使うには「Query and Physics」または「Collision Enabled (Query and Physics)」が必要です。
  • 「Simulation Generates Hit Events」が OFF:このフラグが無効だと、物理シミュレーション中の衝突で Hit イベント(On Component Hit / Event Hit)が発火しません。
  • どちらの側もイベントを出していない:Hit は「自分のコンポーネントが何かに当たった(当てられた)」という通知で、そのコンポーネント自身にしか飛びません。動いている球が静止した箱に当たったとき、球側で Hit を有効にしていても、箱側のイベントを設定していなければ箱側では何も起きません。
  • 当たる側が「動いていない」:Hit は物理シミュレーション、Character Movement による移動、または Sweep を有効にした移動(SetActorLocation などの Sweep オプション)によって発生します。静止して一切移動しないアクターは、自分発の Hit を発火させる「移動」を持たないため、当てられても Hit が出にくくなります。
  • レスポンスが噛み合っていない:一方が相手のオブジェクトタイプに対し「Block」でも、もう一方が「Ignore/Overlap」だと、ブロック=Hit は成立しません。Block 同士で初めて物理的に弾き合い、Hit が成立します。

解決手順(最短ルート)

次の順で確認・設定します。1〜2 で多くのケースは解決し、それでも静止キャラ側で拾いたい場合は 3 の Overlap へ切り替えます。

手順1:双方のコリジョンを有効にする

動いているオブジェクトと、当たられるキャラクター(メッシュやカプセル)双方の Details パネルで、コリジョンを確認します。

  • Collision Presets:用途に合うプリセット、なければ「Custom」を選択。
  • Collision Enabled:物理的なブロック=Hit を使うなら「Query and Physics」。重なり検知だけでよいなら「Query Only」でも Overlap は機能します。
  • Object Type / Response:お互いの Object Type に対するレスポンスを目的に合わせる。物理で弾きたいなら双方「Block」、すり抜けつつ検知したいなら双方「Overlap」。

「Block 対 Block」になっていれば物理的な衝突(Hit)の前提が整い、「Overlap 対 Overlap」なら重なりイベントの前提が整います。片方だけでは成立しない点に注意してください。

手順2:判定したい側で「Generate Hit Events」を有効化

Hit イベントを使う場合、イベントを発生させたいコンポーネントの設定で次を有効にします。

  • Simulation Generates Hit Events:ON。物理シミュレーション中の衝突で Hit を発火させる前提条件です。

そのうえで、Blueprint にそのコンポーネントの On Component Hit(または Actor の Event Hit)ノードを追加します。重要なのは、Hit を受け取りたい側のコンポーネントにイベントを置くことです。動くオブジェクト側で検知したいならオブジェクトの BP に、キャラクター側で検知したいならキャラクターの該当コンポーネントに置きます。

// 動くオブジェクト側の Blueprint(自分が当たったことを検知)

Event On Component Hit (Mesh)

  -> Branch [ Other Actor Is Valid AND Other Actor != Self ]

     True -> Print String ("Hit: " + Other Actor の表示名)

静止キャラクター側で Hit を受けたい場合は、キャラクターのカプセルやメッシュに同様の On Component Hit を置きます。ただし後述の通り、キャラクターが完全に静止している構成では Hit が発火しにくいため、その場合は手順3を採用してください。

手順3:確実に拾うなら Overlap に切り替える

「動くオブジェクトが、静止しているキャラクターに触れたこと」を確実に検知したいだけなら、Hit に固執せず Overlap を使うのが最も安定します。Overlap は移動の有無や物理ブロックの成立に左右されにくく、重なりが発生した時点で発火するためです。

  • 検知したい両コンポーネントで Generate Overlap Events を ON。
  • お互いの Response を Overlap(すり抜けつつ検知)または、ブロックしつつ別コンポーネントで Overlap を取る構成にする。
  • Blueprint に On Component Begin Overlap を追加し、相手が目的のアクターかを判定する。

// 静止キャラクター側、または検知用コリジョンの Blueprint

Event On Component Begin Overlap (Capsule)

  -> Cast To [動くオブジェクトのクラス] (Other Actor)

     Success -> ダメージ処理 / リアクション再生 など

HitとOverlapの違い

どちらを使うべきか迷ったら、次の比較で判断してください。

観点Hit(On Component Hit / Event Hit)Overlap(Begin / End Overlap)
必要な Collision EnabledQuery and Physics(物理ブロックが前提)Query Only でも可(物理は不要)
レスポンス双方が Block少なくとも一方が Overlap、相手は Ignore 以外
必要なフラグSimulation Generates Hit Events を ONGenerate Overlap Events を ON
発生の起点移動・物理シミュレーション・Sweep 移動による衝突形状が重なった瞬間(移動の有無に依存しにくい)
すり抜けしない(物理的に弾き合う)する(重なりを検知するだけ)
向いている用途物理的にぶつけて弾く・反発させる触れたかどうかの検知、トリガー、ダメージ判定

つまずきやすい落とし穴

症状原因と対処
片方だけ設定して動かないコリジョン・Generate Hit/Overlap Events・レスポンスは双方で揃える。Block 対 Overlap の組み合わせでは物理 Hit は成立しない。
静止キャラ側の Hit が出ないHit は「動いている側」を起点に発生し、各コンポーネントは自分にしか通知しない。完全に静止したキャラは自分発の Hit を出しにくいため、動くオブジェクト側に Hit を置くか、Overlap に切り替える
イベントは出るが押し返されないOverlap は物理ブロックをしない。物理的に弾きたいなら Block + Query and Physics に変更する。逆に「すり抜けて検知だけ」が目的なら Overlap が正しい。
低速移動だと Hit が飛ばされる高速移動の貫通対策には CCD(Use CCD)を、移動命令での検知漏れには Sweep の有効化を検討する。挙動の細部はバージョンで差があるため公式ドキュメント確認を推奨。

なお、当たり判定の有無を切り分けたいときは、Project Settings → Engine → Collision や各アクターの「Show Collision」表示でコリジョン形状を可視化し、そもそも形状が重なっているかを目視確認すると原因の特定が速くなります。物理マテリアルや質量の調整は「弾き方」の話で、まずは「判定が成立しているか」を先に固めるのが順序です。

よくある質問

Q1. 動くオブジェクトはぶつかって弾けるのに、当たられたキャラクター側で何も起きません。
A. Hit は当たった本人のコンポーネントにしか通知されません。キャラクター側で処理したいなら、キャラクターのコンポーネントに On Component Hit を置くか、より確実な Overlap で検知してください。キャラクターが静止構成なら Overlap が安定します。

Q2. すり抜けてほしくない(物理的に止めたい)のですが、Overlap だと通り抜けてしまいます。
A. Overlap は重なりを検知するだけで物理的にはブロックしません。止めたい場合は双方を Block + Collision Enabled を「Query and Physics」にし、Simulation Generates Hit Events を有効にして Hit で扱ってください。

Q3. ダメージ判定をしたいのですが、Hit と Overlap のどちらが向いていますか。
A. 「触れたら一度ダメージ」のような検知用途は Overlap が扱いやすく安定します。物理的に弾きつつ衝撃の強さ(Hit の法線や速度)を使いたい場合は Hit が適します。両立させたい場合は、ブロック用コリジョンと検知用コリジョンを分けて配置する構成も有効です。

まとめ

「動くオブジェクト→静止キャラ」で当たり判定が出ない問題は、(1) 双方のコリジョン有効化と Block/Overlap の整合(2) 判定側での Generate Hit/Overlap Events 有効化(3) Hit が出にくい構成では Overlap への切り替えの3点でほぼ解決します。Hit は「動いている側を起点に、自分自身へ通知する」という性質を押さえ、確実な検知が目的なら Overlap を選ぶのが近道です。バージョン依存の細かな挙動は、Epic 公式ドキュメントのコリジョン解説もあわせて確認してください。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 床の上に乗ったらイベントを発生させる方法
  2. OverlapAllDynamicとOverlapAllの違い
  3. タイトル画面を作る方法
  4. サードパーソンテンプレートでのキャラクター表示の仕組みと非表示にする方法
  5. ボタンに文字を記載する方法
  6. Event ActorBeginOverlapとOn Component Begin Overlapの違い
  7. キャラクターに特定のオブジェクトとの当たり判定を付ける
  8. 特定のオブジェクトに触れたとき、キャラクターが倒れるようにする
  9. 動いているオブジェクトに静止しているキャラクターが当たり判定を持たない原因と解決方法
  10. 「On Component Hit」に「Cast To ~」で複数のクラスを指定する方法
  11. Blenderファイルをインポートする方法
  12. 鏡を作成する方法
  13. レベルブループリントでキャラクターの出現を設定する方法
  14. サードパーソンテンプレートにおけるキャラクター出現の定義
  15. アイテムに近づいたらボタンを押してイベントを発火させる方法
  16. 画面の中央にメッセージを表示する方法
  17. どこからでも呼び出せるカスタムイベントを作成する方法
  18. カスタムイベントに引数を追加する方法
  19. 「Get Overlapping Actors」から特定のクラスの場合のみ処理を実行する方法
  20. オブジェクトに近づいている間だけメッセージを表示する方法
  21. PCの画面を操作するUIを作る方法
  22. コンテンツブラウザに画像を追加する方法
  23. SetInputMode_UIOnlyを取り消す方法
  24. 特定の画像の上にマウスカーソルを置いたら手マークにする方法
  25. オブジェクトがアウトライナーで選択できない原因と解決策
  26. PlayerStartを作成する方法
  27. メニュー画面を作成して開く方法
  28. 「Esc」キーを押してメニュー画面を開く方法
  29. イベントの「On Clicked」と「On Pressed」の違い
  30. 「Set Input Mode」の種類と使い方
  31. 「Set Game Paused」の使い方と詳細解説
  32. Motion Matchingとは?
  33. 「GameMode」と「GameModeBase」の違い
  34. マップに配置したTargetPointを取得する方法
  35. TargetPointにタグをつけて取得する方法
  36. Spawnしたインスタンスがイベントを実行する方法
  37. 特定の時間ごとに処理を実行する方法
  38. 数値をランダムで出力する方法
  39. ThirdPersonテンプレートでキャラクターの移動を歩くように変更する方法
  40. MaxWalkSpeedを変更する方法
  41. しゃがむ動作を導入する方法
  42. キャラクターのアニメーションを設定する方法
  43. 導入済みのプラグインを確認する方法
  44. Motion Matchingの導入と必要なプラグイン
  45. プレイヤーを非表示にする方法
  46. カメラを傾ける角度を制限させる方法
  47. 配列からランダムに重ならない要素を特定の数取得する方法
  48. カメラの映す画面に文字やエフェクトを付ける方法
  49. キャラクターやメッシュを非表示にした際にカメラが移動しなくなる問題の解決方法
  50. プライマリーデータアセットを活用する方法
  51. プレイヤーのHPといった変数を定義する最適な場所
  52. カメラに映った画面をスクリーンショットとして保存する方法
  53. ゲーム内のカメラ映像を保存して再表示する方法
  54. HighResShot を使って高解像度の画像を保存する方法(UE5)
  55. HighResShotで保存した画像のファイル名を取得する方法
  56. SceneCapture2DとFrameGrabberの画像保存方法の比較
  57. SceneCapture2Dを使用して画像を保存・取得する方法
  58. HighResShotとTake High Res Screenshotの違い
  59. ゲーム終了ボタンを作成する方法
  60. 「Save Game To Slot」の戻り値がfalseになる問題の解決方法
  61. 画面上にメッセージを指定された時間表示させる方法
  62. シェーダコンパイル時間を短縮する方法
  63. 「Take High Res Screenshot」実行時に「シェーダをコンパイル」に長時間待たされる問題とその解決策
  64. データベースを活用する方法
  65. UE5.5がインストールされた環境にUE5.4を追加で導入する方法
  66. World PartitionとWorld Compositionの違い
  67. オープンワールドテンプレートとは?
  68. ポーンをスポーンさせても視点を切り替えない方法
  69. キャラクター同士がすり抜けてしまう問題の解決方法
  70. キャラクターの外見を動的に変更
  71. World Partitionでインスタンスが「アンロード済み」になる問題
  72. データ アセットとデータ テーブルの違い
  73. コンポーネントイベントグラフ内で親クラスの変数にアクセスする方
  74. エディターのソースコードの自動保存の頻度を高める方法
  75. SpawnActorでSpawn Transform Rotationが反映されない理由
  76. ミニマップを表示しポーンの位置を反映する方法
  77. RInterp ToとVInterp Toの違い
  78. 毎秒実行するイベントの定義方法
  79. Niagara のエフェクトにコリジョンを持たせる方法
  80. 「Overlap」と「Hit」の違い
  81. OverlapはあるがHitがない原因
  82. Overlapした位置の座標を取得する方法
  83. ブループリントでレベル間のパラメータを受け渡す方法

最近更新/作成されたページ