# パーティクルの衝突

> Understand how the Particle System can create and calculate collisions between particles and GameObjects

[Collisions](/engine/6000.0/manual/visual-effects/particle-systems/particle-system-modules/part-sys-collision-module.md) モジュールは、パーティクルとシーンのゲームオブジェクトとの衝突の仕方を制御します。

パーティクルの周辺に他のオブジェクトが存在するとき、パーティクルがそれらのオブジェクトと相互作用したほうが、効果はより現実的になります。例えば、水や破片などは、壁を簡単に通り抜けるのではなく、堅い壁に阻まれたほうが現実的です。**Collision** モジュールを有効にすると、パーティクルはシーンのオブジェクトと衝突するようになります。

パーティクルシステムを設定して、**World** モードを選択すると、発生したパーティクルがシーン内のすべてのコライダーと衝突するように設定できます。また、 **Collides With** プロパティを使ってレイヤーごとにコライダーを無効にすることもできます。**Planes** モードオプションもあり、コライダーを無効にする平面をシーンに追加できます。このオプションはシンプルな床、壁などのオブジェクトに利用でき、 **World** モードよりプロセッサーのオーバーヘッドを低くできます。

**Planes** モードを有効にすると、Transform のリスト (通常は空のゲームオブジェクト) を **Planes** プロパティで追加できます。平面は、オブジェクトのローカル XZ 平面上に無限に広がり、正の Y 軸は平面の法線ベクトルを示します。開発を支援するために、目に見えるメッシュがオブジェクトにあるかどうかに関わらず、平面はシーン内でギズモとして表示されます。ギズモは、ワイヤーフレームグリッドまたは立体の平面として表示でき、拡大縮小することもできます。ただし、拡大縮小は可視化にのみ適用され、衝突面自体はシーンを通して無限に広がります。

衝突を有効にすると、表面と接触するときにパーティクルのグラフィックスがクリッピングされる場合があるため、サイズの問題が発生することがあります。その結果、パーティクルが停止または跳ね返る前に、表面とぶつかる途中で "沈む" ように見える場合があります。**Radius Scale** プロパティは、パーティクルのおおよその半径を実際のサイズに対する割合で定義することで、この問題を解決します。このサイズ情報は、クリッピングと沈んで見える現象を回避するために使用されます。

**Dampen** と **Bounce** プロパティはパーティクルが固形のオブジェクトを表すときに便利です。例えば、砂利を投げた場合は固い表面で跳ね返るものですが、雪玉のパーティクルは衝突の間にスピードを失うこともあります。**Lifetime Loss** と **Min Kill Speed** を使うと、衝突の後に続く残りのパーティクルの効果を小さくすることができます。例えば、火の玉は空中を飛んでいる間、数秒間は存在しているかもしれませんが、衝突の後は分かれた火のパーティクルは早めに散っていくべきです。

**Send Collision Messages** が有効になっている場合、スクリプトからパーティクルの衝突を検知することもできます。スクリプトは、パーティクルシステムが設定されたオブジェクト、コライダーが設定されたオブジェクト、またはその両方が設定されたオブジェクトにアタッチできます。衝突を検知することで、パーティクルを弾丸、魔法、パワーアップアイテムなどのアクティブなオブジェクトとしてゲームプレイで使用できます。詳細な情報や例についてはスクリプトリファレンスページの [MonoBehaviour.OnParticleCollision](/engine/6000.0/script-reference/unity-engine/mono-behaviour/on-particle-collision.md) を参照してください。

### World の Collision Quality##world-collision-quality

World Collision モジュールには **Collision Quality** プロパティがあり、**High**、**Medium**、**Low** に設定できます。**Collision Quality** を **Medium (Static Colliders)** か **Low (Static Colliders)** に設定すると、衝突はボクセルのグリッド (3D グリッドの値) を使用し、後のフレームで素早く再使用するために前の衝突をキャッシュします。

このキャッシュは、各ボクセルの平面で構成され、平面はその位置での衝突面を表します。各フレームで、Unity はパーティクルの位置の平面のキャッシュを確認し、存在する場合は衝突判定に使用します。それ以外の場合は、物理演算システムに問い合わせます。衝突が返されると、後続のフレームで高速クエリーを実行するためにキャッシュに追加されます。

これは近似なので、衝突を見逃すことがあります。Voxel Size の値を低くしてこれを改善することができます。ただし、そうするとメモリが余分に消費されるので、効率が落ちます。

**Medium** と **Low** の違いは、各フレームでシステムが物理演算システムにクエリする回数だけです。Low では、Medium に比べ、フレームごとに少ない回数のクエリを行います。回数が上限に達すると、残りのパーティクルにはキャッシュだけを利用します。この結果、キャッシュがさらに包括的に増えるまで衝突を検知し損なうことが多くなります。
