パーティクルトリガーの設定
Create and configure a trigger on the particles of a Particle System.
読み終わるまでの所要時間 9 分最終更新 4時間前
はじめに、パーティクルが相互作用できるシーンのコライダーを指定します。そのためには Colliders リストプロパティに 1 つ以上のコライダーを割り当てます。リストのコライダーの数を増やすには、コライダーのリストの下にある追加 (+) ボタンをクリックします。リストからコライダーを削除するには、コライダーを選択して削除 (-) ボタンをクリックします。リストのインデックスにまだコライダーを割り当てていない場合は、空のエントリーの右側にある小さい追加 (+) ボタンを使用し、新しいコライダーを作成して割り当てることができます。この例では、パーティクルシステムの子として新しいゲームオブジェクトを作成し、そこにスフィアコライダーをアタッチしてから、コライダーを空のエントリーに割り当てます。
コライダーを追加したら、パーティクルが特定のトリガーイベントタイプの基準を満たした場合に行う動作を指定できます。パーティクルがコライダーと相互作用する方法は、4 つのイベントタイプで指定します。相違点:
- Inside:パーティクルがコライダーの境界の中にある。
- Outside:パーティクルがコライダーの境界の外にある。
- Enter:パーティクルがコライダーの境界に入る。
- Exit:パーティクルがコライダーの境界から出る。
Inspector では、これらのイベントタイプごとにドロップダウンがあり、トリガーイベントの条件を満たす場合にパーティクルに何が起こるかを選択することができます。これで HDRP がモーションベクトルをレンダリングできるようになります。オブジェクトモーションベクトルを有効にする場合は、デフォルトにより、新しいメッシュレンダラーがオブジェクトモーションベクトルを書きますので、注意してください。この動作を変更するには、メッシュレンダラーを選択し、Inspector で Motion Vectors プロパティーの値を変更します。

- Callback:OnParticleTrigger() コールバック関数でパーティクルにアクセスできるようになります。
- Kill:パーティクルを破棄します。OnParticleTrigger() コールバック関数でパーティクルにアクセスできません。
- Ignore:パーティクルを無視します。OnParticleTrigger() コールバック関数でパーティクルにアクセスできません。
OnParticleTrigger() 内でのパーティクルへのアクセス
トリガーイベントの 1 つに対するリアクションとして Callback を選択する場合、アタッチしたスクリプトからイベント条件を満たすパーティクルにアクセスできます。これを行うには、まずアタッチしたスクリプトに 関数を追加する必要があります。この関数内で、ParticlePhysicsExtensions.GetTriggerParticles() 関数を呼び出して、トリガーイベントの条件を満たすパーティクルのリストを取得します。この関数は、パーティクルを取得したいトリガーイベント (Inside、Outside、Enter、Exit) を指定する ParticleSystemTriggerEventType と、この関数が結果を表す Particles のリストを受け取ります。このリストから、任意のパーティクルにアクセスしたり、変更したり、破棄したりすることができます。また、この関数は任意のパラメーターをとり、各パーティクルがどのコライダーをトリガーしたかなどの衝突情報を出力することができます。Collider Query Mode プロパティは、このパラメーターを通して利用できる情報を制御します。
OnParticleTrigger()API の詳細や使用方法については、以下の例 を参照してください。
例
コライダーとの相互作用
以下の例では、パーティクルがコライダーに侵入すると赤くなり、コライダーの境界から出ると緑に変わります。
using UnityEngine;using System.Collections;using System.Collections.Generic;[ExecuteInEditMode]public class TriggerScript : MonoBehaviour{ ParticleSystem ps; // these lists are used to contain the particles which match // the trigger conditions each frame. List<ParticleSystem.Particle> enter = new List<ParticleSystem.Particle>(); List<ParticleSystem.Particle> exit = new List<ParticleSystem.Particle>(); void OnEnable() { ps = GetComponent<ParticleSystem>(); } void OnParticleTrigger() { // get the particles which matched the trigger conditions this frame int numEnter = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter); int numExit = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit); // iterate through the particles which entered the trigger and make them red for (int i = 0; i < numEnter; i++) { ParticleSystem.Particle p = enter[i]; p.startColor = new Color32(255, 0, 0, 255); enter[i] = p; } // iterate through the particles which exited the trigger and make them green for (int i = 0; i < numExit; i++) { ParticleSystem.Particle p = exit[i]; p.startColor = new Color32(0, 255, 0, 255); exit[i] = p; } // re-assign the modified particles back into the particle system ps.SetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter); ps.SetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit); }}
この例の結果は下の画像の通りです。

エディタービュー

ゲームビュー
複数のコライダーとの相互作用
以下の例では、 関数から抽出できる追加の衝突データを利用しています。1 つ目のコライダーの境界内にあるパーティクルは赤に、2 つ目のコライダーの境界内にあるパーティクルは青に、そして両方のコライダーの境界内にあるパーティクルは緑になります。また、パーティクルがコライダーの内側にない場合は白色になります。この例では、 Collider Query Mode を All に設定しています。
GetTriggerParticles()using UnityEngine;using System.Collections;using System.Collections.Generic;[ExecuteInEditMode]public class TriggerScript : MonoBehaviour{ void OnParticleTrigger() { ParticleSystem ps = GetComponent(); // particles List inside = new List(); List exit = new List(); // get int numInside = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Inside, inside, out var insideData); int numExit = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit); // iterate for (int i = 0; i < numInside; i++) { ParticleSystem.Particle p = inside[i]; if (insideData.GetColliderCount(i) == 1) { if (insideData.GetCollider(i, 0) == ps.trigger.GetCollider(0)) p.startColor = new Color32(255, 0, 0, 255); else p.startColor = new Color32(0, 0, 255, 255); } else if (insideData.GetColliderCount(i) == 2) { p.startColor = new Color32(0, 255, 0, 255); } inside[i] = p; } for (int i = 0; i < numExit; i++) { ParticleSystem.Particle p = exit[i]; p.startColor = new Color32(1, 1, 1, 255); exit[i] = p; } // set ps.SetTriggerParticles(ParticleSystemTriggerEventType.Inside, inside); ps.SetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit); }}
この例の結果は下の画像の通りです。

ゲームビュー