2 / 4 平面との衝突をGPU Eventへつなぐ
衝突した親の処理と、子を生成する通知を分けて確認します。通知の数を変え、波紋と飛沫の発生を制御します。
雨粒のUpdateを読む
RainRipples.unityでRainRipples.vfxを開いてください。Constant Spawn Rateから始まる雨粒のシステムを探します。Graphの変更は保存後も残るため、各演習の最後に示す基準値へ戻してください。
雨粒のInitializeでは、Lifetimeを2秒、Velocityを(0, -6, 0)に設定しています。生成位置は高さ5です。水面までの距離は5なので、雨粒は約5 ÷ 6 = 0.83秒で水面へ届きます。寿命が尽きる前に衝突する設定です。
Updateには、上からKill Shape (Plane)、二つのTrigger Event (On Collide)が並んでいます。まずKill Shapeを選び、設定を確かめましょう。
| 項目 | 設定 | 役割 |
|---|---|---|
| Shape | Plane | 平面と衝突させる |
| Behavior | Kill | 接触した親を消す |
| Collision Attributes | Write Always | 衝突の有無・位置・法線を記録する |
| PlaneのPosition | (0, 0, 0) | Y=0を水面にする |
| PlaneのNormal | (0, 1, 0) | 水面の上向きを指定する |
Normalは面の向きを表す単位ベクトルです。Planeはこの位置と法線から定まる無限の平面で、水面のMeshとは別に設定されています。MeshのTransformを動かしただけでは、Graphの衝突面は変わりません。今回は水平な水面の設定を保ちます。
衝突したことを通知する
Trigger Event (On Collide)は、前のBlockで記録した衝突を受けて通知します。そのため、衝突を調べるBlockより後へ置きます。
evtは通知の接続です。Countは、その通知で生成する子の数を指定します。波紋へつながるTrigger EventはCountが1、飛沫へつながる方は4です。GPU Eventからは、子のInitializeへ接続されています。
子のInitializeに通常のSpawnを追加する必要はありません。この作例の子は、GPU Eventを発生の入口にしています。
通知と衝突を分けて確認する
波紋へつながるTrigger EventのCountを、1から0へ変えたら何が起きるか予想してください。親の消滅と、もう一方の飛沫にも注目します。
Countを0にして保存し、Playしてください。雨粒は水面で消え、飛沫は出ますが、新しい波紋は生成されません。波紋を作る通知だけを止めたためです。停止後、Countを1へ戻します。
次は飛沫側のCountだけを4から8へ変え、着水一回あたりの飛沫を比べてください。比較後は4へ戻します。雨粒の発生数は変えず、子の数だけを調整する実験です。
VFX Graphの衝突とGPU Eventは、描画用の粒子をGPU上で制御します。この接続だけでC#のOnCollisionEnterやゲームのダメージ処理が呼ばれるわけではありません。
設定名の詳細は、Collision ShapeとTrigger Eventの公式資料を参照できます。
- Kill ShapeとTrigger Eventを、この順に置く理由を説明できる。
- 波紋の通知を止めても、親の消滅と飛沫が続くことを確認した。
- 波紋のCountを1、飛沫のCountを4へ戻した。