80.

UE Niagara にコリジョンを持たせる方法完全ガイド

編集
この記事の要点
  • Niagara System の Particle Update セクションに Collision モジュールを追加
  • CPU シミュレーション: Distance Field / Trace / Plane の 3 種類
  • GPU シミュレーション: Async Distance Field / Depth Buffer のみ対応
  • Bounciness / Friction / Lifetime Loss でバウンド感を調整
  • CollisionEvent を使えば衝突時にスポーン / 別 Emitter を起動可能

Niagara コリジョンの基本

Unreal Engine の Niagara パーティクルシステムでは、コリジョンモジュールを追加することで地面や壁にぶつかったときの跳ね返りや弾跡を表現できます。古い Cascade と比べて Niagara はモジュール式で柔軟性が高い反面、設定箇所も多いです。

手順: Collision モジュールの追加

  1. Niagara System を開く
  2. Emitter を選択 → 右側のスタックビュー
  3. Particle Update セクションの「+」ボタン
  4. 検索ボックスに「Collision」と入力
  5. Collision モジュールを選択して追加
  6. パラメータを調整

主要パラメータ

パラメータ意味
Collision Mode判定方法Distance Field / Ray Trace / Plane
Bounciness反発係数 (0-1)0.5 で半分の速度で跳ね返り
Friction摩擦係数 (0-1)0.3 で接線方向に減速
Lifetime Loss On Collision衝突時の寿命減少0.2 で 20% 短縮
Restitution跳ね返りの精度1.0 が完全弾性衝突
Collision Radiusパーティクルの判定半径5.0 (cm)

Collision Mode の違い

1. Plane(平面コリジョン)

最もシンプル。指定した無限平面 1 枚に対する衝突を判定:

Plane Position: (0, 0, 0)        ← 平面の位置
Plane Normal: (0, 0, 1)           ← 平面の法線(上向き = 地面扱い)

メリット: 高速、GPU パーティクル対応
デメリット: ステージの実形状を見ない → 床だけ扱う想定の演出向き

2. Distance Field

シーンの Distance Field(事前計算された距離情報)を使う。Project Settings → Rendering → Generate Mesh Distance Fields を有効化:

メリット:
  - GPU パーティクルでも動作
  - 高速(数万パーティクルでも OK)
  - シーンの実形状を反映

デメリット:
  - Distance Field 未生成のメッシュは無視
  - 動的オブジェクトは反応しない(または精度低下)
  - 細かい形状は丸められる

3. Ray Trace(CPU のみ)

通常の物理 Trace を毎フレーム実行。CPU パーティクル限定:

メリット:
  - 完全に正確な衝突判定
  - 動的オブジェクトに対応
  - Collision Channel / Object Type で細かく制御

デメリット:
  - 重い(数百パーティクル以上で問題化)
  - GPU シミュレーションでは使えない

CPU vs GPU シミュレーション

Emitter の Sim Target プロパティで切替:

CPUGPU
パーティクル数上限数千数百万
Collision ModePlane / Trace / Distance FieldPlane / Async Distance Field / Depth Buffer
CollisionEventすべて対応制限あり
Lit (ライティング)制限あり制限あり
用途少数の高精度パーティクル大量の演出パーティクル

CollisionEvent → SpawnParticles

衝突したときに別のパーティクル(弾着エフェクト、火花、煙)をスポーンする例:

1. Particle Update に Generate Collision Event を追加
2. Emitter 2 つ目(弾着用)を作成
3. その Emitter Update に Event Handler を追加
   → Source: Emitter 1 の Collision Event
   → Action: Spawn Burst Instantaneous (Count = 10)

これで「弾が地面に当たる → 火花が散る」が実装できる

Bounciness / Friction の調整例

ゴムボール風:
  Bounciness: 0.85
  Friction: 0.2
  Lifetime Loss: 0.0

雪・砂など跳ねない素材:
  Bounciness: 0.05
  Friction: 0.9
  Lifetime Loss: 0.5

血しぶき・水しぶき:
  Bounciness: 0.3
  Friction: 0.5
  Lifetime Loss: 0.8  ← 衝突したらほぼ消える

火花:
  Bounciness: 0.5
  Friction: 0.7
  Lifetime Loss: 0.4

パフォーマンス考慮

  • 大量パーティクルは GPU + Distance Field 一択
  • CPU Trace は毎フレーム全パーティクル分飛ぶ → 100 以下に抑える
  • 不要になったパーティクルは Lifetime Loss で早めに消す
  • Distance Field の解像度を Project Settings で調整(Quality Level)
  • シーンに不要なメッシュの Distance Field 生成を切る(StaticMesh の Affect Distance Field Lighting)

Cascade との違い

Cascade(旧)Niagara(現行)
UI固定モジュールスタック式・カスタム可
GPU 衝突Depth Buffer のみDistance Field 含む
EventEventGenerator/ReceiverEvent Handler(より柔軟)
UE5 でのサポート非推奨標準

FAQ

Q: GPU パーティクルで Distance Field が効かない
A: Project Settings → Rendering → Software Ray Tracing → Generate Mesh Distance Fields が ON か確認。再起動が必要。

Q: 動く物体(キャラクター)にぶつけたい
A: Distance Field は静的メッシュ向き。動的物体は CPU Trace か、Skeletal Mesh Distance Field を ON に。

Q: 衝突しても止まらず貫通する
A: Collision Radius が小さすぎるか、シミュレーション周期(Substep)が粗い。Spawn Rate を下げて Velocity も下げると改善。

編集
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. UE5でマップに配置したTargetPointを取得する方法
  36. TargetPointにタグをつけて取得する方法
  37. Spawnしたインスタンスがイベントを実行する方法
  38. 特定の時間ごとに処理を実行する方法
  39. 数値をランダムで出力する方法
  40. ThirdPersonテンプレートでキャラクターの移動を歩くように変更する方法
  41. MaxWalkSpeedを変更する方法
  42. しゃがむ動作を導入する方法
  43. キャラクターのアニメーションを設定する方法
  44. 導入済みのプラグインを確認する方法
  45. Motion Matchingの導入と必要なプラグイン
  46. プレイヤーを非表示にする方法
  47. カメラを傾ける角度を制限させる方法
  48. 配列からランダムに重ならない要素を特定の数取得する方法
  49. カメラの映す画面に文字やエフェクトを付ける方法
  50. キャラクターやメッシュを非表示にした際にカメラが移動しなくなる問題の解決方法
  51. プライマリーデータアセットを活用する方法
  52. プレイヤーのHPといった変数を定義する最適な場所
  53. カメラに映った画面をスクリーンショットとして保存する方法
  54. スクショ以外の方法でゲーム内のカメラ映像を保存して再表示する方法
  55. HighResShotを使って画像を保存する方法
  56. HighResShotで保存した画像のファイル名を取得する方法
  57. SceneCapture2DとFrameGrabberの画像保存方法の比較
  58. SceneCapture2Dを使用して画像を保存・取得する方法
  59. HighResShotとTake High Res Screenshotの違い
  60. ゲーム終了ボタンを作成する方法
  61. 「Save Game To Slot」の戻り値がfalseになる問題の解決方法
  62. 画面上にメッセージを指定された時間表示させる方法
  63. 「シェーダをコンパイル」を短縮する方法
  64. 「Take High Res Screenshot」実行時に「シェーダをコンパイル」に長時間待たされる問題とその解決策
  65. データベースを活用する方法
  66. UE5.5がインストールされた環境にUE5.4を追加で導入する方法
  67. World PartitionとWorld Compositionの違い
  68. オープンワールドテンプレートとは?
  69. ポーンをスポーンさせても視点を切り替えない方法
  70. キャラクター同士がすり抜けてしまう問題の解決方法
  71. キャラクターの外見を動的に変更
  72. World Partitionでインスタンスが「アンロード済み」になる問題
  73. データ アセットとデータ テーブルの違い
  74. コンポーネントイベントグラフ内で親クラスの変数にアクセスする方
  75. エディターのソースコードの自動保存の頻度を高める方法
  76. SpawnActorでSpawn Transform Rotationが反映されない理由
  77. ミニマップを表示し、ポーンの位置を反映する方法
  78. RInterp ToとVInterp Toの違い
  79. 毎秒実行するイベントの定義方法
  80. Niagara のエフェクトにコリジョンを持たせる方法
  81. 「Overlap」と「Hit」の違い
  82. Overlapは発生するがHitは発生しない原因
  83. Overlapした位置の座標を取得する方法
  84. ブループリントでレベル間のパラメータを受け渡す方法