Skip to content
第15回 GPU完結での衝突判定とパーティクル生成

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を選び、設定を確かめましょう。

項目設定役割
ShapePlane平面と衝突させる
BehaviorKill接触した親を消す
Collision AttributesWrite 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より後へ置きます。

着水から波紋が出るまで
雨粒のUpdate
On Collideのevt出力
GPU Event
GPU Event
子を生成する通知
波紋のInitialize
波紋のInitialize
位置と寿命を決めて表示
波紋のUpdateとOutput

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へ戻した。