パーティクルシステムがシーン内で 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);
}
}
この結果は下の図のとおり
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.