如何在Unity中检测哪个粒子与刚体碰撞?

时间:2018-11-22 11:11:25

标签: c# unity3d

让我们说一个刚体正在穿过一堆属于单个粒子系统的粒子,并且您希望与刚体碰撞的每个粒子都弹起。你会怎么做?

当刚体与粒子系统碰撞时,将调用

void OnParticleCollision(GameObject other)。但是,我需要知道粒子系统中的哪个粒子与人体碰撞。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

使用ParticleSystem.GetParticles函数,您可以捕获所有“活动”粒子,然后为其分配索引(您应从粒子类继承,因为粒子类没有任何索引或id变量)。

GertParticles:

https://docs.unity3d.com/ScriptReference/ParticleSystem.GetParticles.html

如何访问粒子系统中的各个粒子? https://answers.unity.com/questions/639816/how-do-you-access-the-individual-particles-of-a-pa.html

正如我所说,粒子没有任何ID来标识它们,我知道这似乎不是“最佳方法”,但是请参阅Unity文档中有关SetCustomParticleData函数(https://docs.unity3d.com/ScriptReference/ParticleSystem.SetCustomParticleData.html)的示例,它们会对所有粒子进行迭代

还在同一页面上,您可以看到一个示例,在每个粒子出生时为其分配唯一ID:

using UnityEngine;
using UnityEditor;
using System.Collections.Generic;

public class ExampleClass : MonoBehaviour {

    private ParticleSystem ps;
    private List<Vector4> customData = new List<Vector4>();
    private int uniqueID;

    void Start() {

        ps = GetComponent<ParticleSystem>();
    }

    void Update() {

        ps.GetCustomParticleData(customData, ParticleSystemCustomData.Custom1);

        for (int i = 0; i < customData.Count; i++)
        {
            // set custom data to the next ID, if it is in the default 0 state
            if (customData[i].x == 0.0f)
            {
                customData[i] = new Vector4(++uniqueID, 0, 0, 0);
            }
        }

        ps.SetCustomParticleData(customData, ParticleSystemCustomData.Custom1);
    }
}