首先,指定粒子可与场景中的哪些碰撞体进行碰撞。为此,请将一个或多个碰撞体分配给 Colliders 列表属性。要增加列表中碰撞体的数量,请单击 Colliders 列表下方的 Add (+) 按钮。要从列表中移除某个碰撞体,请选择该碰撞体,然后单击 Remove (-) 按钮。如果尚未将碰撞体分配给列表的索引,则可以使用空条目右侧较小的 Add (+) 按钮来创建和分配新的碰撞体。这将创建一个新的游戏对象作为粒子系统的子项,并将球形碰撞体附加到该游戏对象,然后将碰撞体分配给空条目。
添加碰撞体后,可指定当粒子满足传递特定触发事件类型的条件时将执行的操作。事件类型有四种,它们描述了粒子如何与碰撞体相互作用。这些事件类型如下:
在 Inspector 中,每种事件类型都有一个下拉选单,您可从中选择当粒子满足触发事件条件时粒子将发生的情况。选项包括:
如果选择 Callback 作为对某一触发事件的反应,则可以从附加的脚本中访问满足事件条件的粒子。为此,首先需要将 OnParticleTrigger() 函数添加到附加的脚本。在此函数中,调用 ParticlePhysicsExtensions.GetTriggerParticles() 函数可获取满足触发事件条件的粒子列表。此函数接受 ParticleSystemTriggerEventType(用于指定需要获取粒子的触发事件,即 Inside、Outside、Enter 或 Exit)以及粒子列表(函数将向其中填充结果)。可从这一列表中访问、修改或销毁任何粒子。该函数还可以采用一个可选参数来输出碰撞信息,例如每个粒子触发哪个碰撞体。Collider Query Mode 属性通过此参数控制可以获得哪些信息。
有关该 API 以及如何使用该 API 的更多信息,请参阅下文示例。
下面的示例会导致粒子在进入碰撞体的边界时变为红色,然后在离开碰撞体的边界时变为绿色。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[ExecuteInEditMode]
public class TriggerScript : MonoBehaviour
{
ParticleSystem ps;
// these lists are used to contain the particles which match
// the trigger conditions each frame.
List<ParticleSystem.Particle> enter = new List<ParticleSystem.Particle>();
List<ParticleSystem.Particle> exit = new List<ParticleSystem.Particle>();
void OnEnable()
{
ps = GetComponent<ParticleSystem>();
}
void OnParticleTrigger()
{
// get the particles which matched the trigger conditions this frame
int numEnter = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter);
int numExit = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit);
// iterate through the particles which entered the trigger and make them red
for (int i = 0; i < numEnter; i++)
{
ParticleSystem.Particle p = enter[i];
p.startColor = new Color32(255, 0, 0, 255);
enter[i] = p;
}
// iterate through the particles which exited the trigger and make them green
for (int i = 0; i < numExit; i++)
{
ParticleSystem.Particle p = exit[i];
p.startColor = new Color32(0, 255, 0, 255);
exit[i] = p;
}
// re-assign the modified particles back into the particle system
ps.SetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter);
ps.SetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit);
}
}
请查看以下图像以了解此示例的结果:
以下示例利用了可从 GetTriggerParticles() 函数中提取的附加碰撞数据。它会导致第一个碰撞体边界内的粒子变为红色,第二个碰撞体边界内的粒子变为蓝色,或者两个碰撞体内的粒子都变为绿色。如果粒子不在碰撞体内,也会变成白色。在本例中,Collider Query Mode 设置为 All。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[ExecuteInEditMode]
public class TriggerScript : MonoBehaviour
{
void OnParticleTrigger()
{
ParticleSystem ps = GetComponent();
// particles
List inside = new List();
List exit = new List();
// get
int numInside = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Inside, inside, out var insideData);
int numExit = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit);
// iterate
for (int i = 0; i < numInside; i++)
{
ParticleSystem.Particle p = inside[i];
if (insideData.GetColliderCount(i) == 1)
{
if (insideData.GetCollider(i, 0) == ps.trigger.GetCollider(0))
p.startColor = new Color32(255, 0, 0, 255);
else
p.startColor = new Color32(0, 0, 255, 255);
}
else if (insideData.GetColliderCount(i) == 2)
{
p.startColor = new Color32(0, 255, 0, 255);
}
inside[i] = p;
}
for (int i = 0; i < numExit; i++)
{
ParticleSystem.Particle p = exit[i];
p.startColor = new Color32(1, 1, 1, 255);
exit[i] = p;
}
// set
ps.SetTriggerParticles(ParticleSystemTriggerEventType.Inside, inside);
ps.SetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit);
}
}
请查看以下图像以了解此示例的结果: