Version: 5.4
Collision モジュール
Sub Emitters モジュール

Triggers モジュール

パーティクルシステムは、シーン内で 1 つ以上のコライダーに接触した場合に、コールバックをトリガーする事ができます。パーティクルがコライダーから出入りするタイミングや、パーティクルがコライダーの内側にある時、または外側にある時に、コールバックをトリガーする事ができます。

コールバックは、パーティクルがコライダーに侵入したときに (例えば、雨粒が屋根を突き通るのを防ぐため)、パーティクルを破棄する簡単な方法として使用したり、または、パーティクルのあるプロパティー、または、すべてのプロパティーを変更するために使用できます。

Triggers モジュールには、下に表示されているように、自動的にパーティクルを削除するための Kill オプションや、衝突イベントを無視する Ignore オプションも備えられています。

パーティクルシステム Triggers モジュール
パーティクルシステム Triggers モジュール

モジュールを使用するには、最初に、トリガーの対象にするコライダーを加え、それからどのイベントを使うかを選択します。

パーティクルが以下の状態のとき、イベントをトリガーすることができます。

  • コライダーの境界の内側にあるとき
  • コライダーの境界の外側にあるとき
  • コライダーの境界に入るとき
  • コライダーの境界から出るとき
プロパティー 機能
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: これにより、エディターウィンドウにパーティクルのコライダー範囲を表示することができます。

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);
    }
}

この結果は下のイメージのとおり。

エディタービュー
エディタービュー
ゲームビュー
ゲームビュー
Collision モジュール
Sub Emitters モジュール