Описание
OnParticleCollision вызывается, когда частица сталкивается с коллайдером.
Это можно использовать для нанесения урона игровому объекту при попадании частиц. Это сообщение отправляется сценариям, прикрепленным к системам частиц, и к коллайдеру, по которому произошло столкновение.
Когда OnParticleCollision вызывается из сценария, прикрепленного к GameObject с помощью Collider, параметр GameObject представляет ParticleSystem. Коллайдер получает не более одного сообщения на каждую Систему частиц, которая столкнулась с ним в любом заданном кадре, даже когда Система частиц столкнулась с Коллайдером. с несколькими частицами в текущем кадре. Чтобы получить подробную информацию обо всех коллизиях, вызванных ParticleSystem, необходимо использовать ParticlePhysicsExtensions.GetCollisionEvents для извлечения массива. ParticleSystem.CollisionEvent.
Когда OnParticleCollision вызывается из скрипта, прикрепленного к ParticleSystem, параметр GameObject представляет GameObject с прикрепленным коллайдером, пораженным < a href="ParticleSystem">ParticleSystem. ParticleSystem получает не более одного сообщения на каждый коллайдер, в который попал. Как и выше, ParticlePhysicsExtensions.GetCollisionEvents необходимо использовать для получения всех инцидентов столкновений с GameObject.
Сообщения отправляются только в том случае, если вы включили Send Collision Messages
в Инспекторе модуля Particle System Collision.
OnParticleCollision может быть сопрограммой. Просто используйте оператор yield в функции.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class ExampleClass : MonoBehaviour
{
public ParticleSystem part;
public List<ParticleCollisionEvent> collisionEvents;
void Start()
{
part = GetComponent<ParticleSystem>();
collisionEvents = new List<ParticleCollisionEvent>();
}
void OnParticleCollision(GameObject other)
{
int numCollisionEvents = part.GetCollisionEvents(other, collisionEvents);
Rigidbody rb = other.GetComponent<Rigidbody>();
int i = 0;
while (i < numCollisionEvents)
{
if (rb)
{
Vector3 pos = collisionEvents[i].intersection;
Vector3 force = collisionEvents[i].velocity * 10;
rb.AddForce(force);
}
i++;
}
}
}