パーティクルシステムは、シーン内で 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 より少し小さい値にします。この設定はイベントが実際にトリガーするタイミングを変えるわけではありませんが、トリガーの視覚エフェクトを遅延させたり、早めたりします。
Visualize Bounds: これにより、エディターウィンドウにパーティクルのコライダー範囲を表示することができます。
Callback の内部で ParticleSystem.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);
}
}
この結果は下のイメージのとおり。