パーティクルシステムがシーン内で 1 つ以上のコライダーに接触するときには常に、パーティクルシステムがコールバックを発するようにすることができます。コールバックは、パーティクルがコライダーに出入りするとき、または、パーティクルがコライダーの内側、または、外側にある間、発生させることができます。
コールバックは、パーティクルがコライダーに侵入したときに (例えば、雨粒が屋根を突き通るのを防ぐため)、パーティクルを破棄する簡単な方法として使用したり、または、パーティクルのあるプロパティー、または、すべてのプロパティーを変更するために使用できます。
Triggers モジュールには、下に表示されているように、自動的にパーティクルを削除するための Kill オプションや、衝突イベントを無視する Ignore オプションも備えられています。
モジュールを使用するには、最初に、トリガーの対象にするコライダーを加え、それからどのイベントを使うかを選択します。
パーティクルが以下の状態のとき、イベントをトリガーすることができます。
プロパティー | 機能 |
---|---|
Inside | Callback を選択すると、パーティクルがコライダーの内側にあるときにイベントをトリガーします。Ignore を選択すると、パーティクルがコライダーの内側にあってもイベントをトリガーしません。Kill を選択すると、コライダーの内側にあるパーティクルを破棄します。 |
Outside | Callback を選択すると、パーティクルがコライダーの外側にあるときにイベントをトリガーします。Ignore を選択すると、パーティクルがコライダーの外側にあってもイベントをトリガーしません。Kill を選択すると、コライダーの外側にあるパーティクルを破棄します。 |
Enter | Callback を選択すると、パーティクルがコライダーに侵入するときにイベントをトリガーします。Ignore を選択すると、パーティクルがコライダーが侵入してもイベントをトリガーしません。Kill を選択すると、コライダーが侵入するときパーティクルを破棄します。 |
Exit | Callback を選択すると、パーティクルがコライダーから出るときにイベントをトリガーします。Ignore を選択すると、パーティクルがコライダーから出るときもイベントをトリガーしません。Kill を選択すると、コライダーから出るときパーティクルを破棄します。 |
Radius Scale | このパラメーターは、パーティクル自身のコライダー領域を設定します。パーティクルが実際に他のコライダーに接触する前、または、後にイベントが発生するように見えるよう、パーティクル自身のコライダー領域を設定します。例えば、パーティクルがコライダーオブジェクトの表面から跳ね返る少し前に、その表面に食い込むように見せたい場合は、Radius Scale を 1 より少し小さい値にします。この設定はイベントが実際にトリガーするタイミングを変えるわけではなく、トリガーの視覚エフェクトを遅延、または、早めます。 - パーティクルがコライダーに接触するときにイベントが発生するように見せるには 1 を入力します。 - パーティクルがコライダーに侵入した後にトリガーが発生するように見せるには 1 より少ない値を入力します。 - パーティクルがコライダーに接触する前にトリガーが発生するように見せるには 1 より大きい値を入力します。 |
Visualize Bounds | これを有効にすると、エディターウィンドウにパーティクル自身のコライダー領域を表示します。 |
コールバックの内部で、ParticlePhysicsExtensions.GetTriggerParticles() を (指定したい ParticleSystemTriggerEventType とともに) 使用して、どのパーティクルがどの範疇に属するかを限定することができます。
以下の例では、パーティクルがコライダーに侵入すると赤くなり、コライダーの領域から出ると緑に代わります。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[ExecuteInEditMode]
public class TriggerScript : MonoBehaviour
{
ParticleSystem ps;
// これらのリストは、各フレームでトリガーの条件に
// 一致するパーティクルを格納します
List<ParticleSystem.Particle> enter = new List<ParticleSystem.Particle>();
List<ParticleSystem.Particle> exit = new List<ParticleSystem.Particle>();
void OnEnable()
{
ps = GetComponent<ParticleSystem>();
}
void OnParticleTrigger()
{
// このフレームのトリガーの条件に一致するパーティクルを取得します
int numEnter = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter);
int numExit = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit);
// トリガーに侵入したパーティクルを走査し、赤にします
for (int i = 0; i < numEnter; i++)
{
ParticleSystem.Particle p = enter[i];
p.startColor = new Color32(255, 0, 0, 255);
enter[i] = p;
}
// トリガーから出ていくパーティクルを走査し、緑にします
for (int i = 0; i < numExit; i++)
{
ParticleSystem.Particle p = exit[i];
p.startColor = new Color32(0, 255, 0, 255);
exit[i] = p;
}
// 変更したパーティクルをパーティクルシステムに再割り当てします
ps.SetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter);
ps.SetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit);
}
}
この結果は下の図のとおり