Version: 2019.3
言語: 日本語
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 これを有効にすると、エディターウィンドウにパーティクル自身のコライダー領域を表示します。

コールバックの内部で、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);
    }
}

この結果は下の図のとおり

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