MonoBehaviour.OnParticleCollision(GameObject)
当粒子击中碰撞体(Collider)时,Unity 会调用 OnParticleCollision 回调。该方法常用于在粒子命中游戏对象时对其施加伤害等逻辑处理。
触发条件:粒子与非 Trigger 的 Collider 发生碰撞时,绑定了该脚本的对象会收到 OnParticleCollision 回调。
1. 碰撞消息的接收规则
在同一帧内,即使某个粒子系统的多个粒子同时与同一碰撞体发生碰撞,该碰撞体也只会收到一次碰撞消息,即 OnParticleCollision 只会被调用一次。
如果脚本绑定在 Cube 上,那么它将分别接收到来自 blacksmoke 和 redsomke 的碰撞消息,回调参数中的 GameObject 也分别对应这两个粒子系统。
void OnParticleCollision(GameObject obj)
{
Debug.Log(obj.name);
}
反过来,如果脚本绑定在 blackXXX 上,那么回调参数中的 GameObject 将是 Cube 和 redXXXX。
2. 利用 ParticleCollisionEvent 处理多粒子碰撞
除了基本的回调外,还可以通过 ParticleCollisionEvent 数组获取每个粒子的碰撞细节,从而对多个粒子的碰撞事件逐一处理。以下是官方示例:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public ParticleSystem part;
public ParticleCollisionEvent[] collisionEvents;
void Start() {
part = GetComponent<ParticleSystem>();
collisionEvents = new ParticleCollisionEvent[16];
}
void OnParticleCollision(GameObject other) {
int safeLength = part.safeCollisionEventSize;
if (collisionEvents.Length < safeLength)
collisionEvents = new ParticleCollisionEvent[safeLength];
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++;
}
}
}