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