Настройка триггера частиц
Для начала определите, с какими коллайдерами в Scene могут взаимодействовать частицы. Для этого назначьте один или несколько коллайдеров свойству списка Коллайдеры. Чтобы увеличить количество коллайдеров в списке, нажмите кнопку Добавить (+) под списком коллайдеров. Чтобы удалить Collider из списка, выберите Collider и нажмите кнопку Удалить (-). Если вы еще не назначили Collider индексу списка, вы можете использовать меньшую кнопку Добавить (+) справа от пустой записи, чтобы создать и назначить новую Collider. Это создает новую GameObject как дочернюю Particle System и прикрепляет к ней сферу Collider, а затем назначает Collider к пустой записи.
После добавления коллайдеров вы можете задать, что будет делать частица, когда она соответствует критериям для прохождения определенного типа события триггера. Существует четыре типа событий, которые описывают, как частица может взаимодействовать с Collider. Они таковы:
- Внутри: Частица находится в пределах Collider.
- вне: Частица находится за пределами Collider.
- Введите: Частица входит в границы Collider.
- Выход: Частица выходит из границ Collider.
В Inspector для каждого из этих типов событий есть выпадающее меню, которое позволяет выбрать, что должно произойти с частицей, если она пройдет условия триггерного события.
- Обратный вызов: Позволяет получить доступ к частице в обратной функции OnParticleTrigger().
- Kill: Уничтожает частицу. Вы не можете получить доступ к частице в обратной функции OnParticleTrigger().
- Ignore: Игнорирует частицу. Вы не можете получить доступ к частице в обратной функции OnParticleTrigger().
Доступ к частицам внутри OnParticleTrigger()
Если вы выберете Обратный вызов в качестве реакции на одно из триггерных событий, можно получить доступ к частицам, выполняющим условие события, из приложенного скрипта. Для этого сначала нужно добавить OnParticleTrigger() Внутри этой функции вызовем функцию ParticlePhysicsExtensions.GetTriggerParticles() функция для получения списка частиц, которые удовлетворяют критериям триггерного события. Эта функция принимает ParticleSystemTriggerEventType, который указывает триггерное событие, для которого вы хотите получить частицы (Внутри, За пределами, Вход, или Выход), а также перечень Particles из которого функция заполняет результатом. Из списка вы можете получить доступ, изменить или уничтожить любую часть. Функция может также принимать дополнительный параметр, который выводит информацию о столкновении, например, Collider каждой частицы срабатывает. Collider Режим запроса свойство определяет, какая информация доступна через этот параметр.
Для получения дополнительной информации о API и как его использовать, см. ниже примера.
Примеры
Взаимодействие с коллайдером
Приведенный ниже пример заставляет частицы становиться красными, когда они входят в границы Collider, а затем зелеными, когда они покидают границы Collider.
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’s границы, чтобы стать красным, в пределах второй Collider’s границы, чтобы стать синим, или внутри обоих коллайдеров, чтобы стать зеленым. Он также превращает частицы белым, если они не находятся внутри Collider. Для этого примера, Collider Режим запроса установлен на Все.
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);
}
}
См. следующее изображение для результата этого примера: