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++;
        }
    }
}