Unity粒子碰撞事件ParticleCollisionEvent

发表于2018-01-19
评论0 5.8k浏览
本篇文章给大家介绍下什么是粒子碰撞事件,在介绍之前,首先要和大家介绍一下 OnParticleCollision() 函数
  • MonoBehaviour.OnParticleCollision(GameObject)
  • 当粒子碰撞了collider非Trigger就会触发绑定了该脚本的 OnParticleCollision  函数。
  • 这个可以用于游戏对象被粒子击中时应用伤害到它上面。
对了,还要把特效的Particle System 中的Collision组件里的Send Collision Messages 的对勾打上,才能使函数生效哦!

同一帧中即使一个粒子系统的多个粒子对象均与碰撞体对象发生碰撞,碰撞体对象也只会接收到一条碰撞消息,也就是OnParticleCollision只会被调用一次。

还可以利用ParticleCollisionEvent数组来处理多个粒子对象碰撞事件事件

Unity粒子部分所带的结构体属性解析
//结构体ParticleCollisionEvent包含的属性
public struct ParticleCollisionEvent
{
        [Obsolete("collider property is deprecated. Use colliderComponent instead, whichsupports Collider and Collider2Dcomponents.")]
        public Collider collider {get; }
        public Component colliderComponent {get; }
        public Vector3 intersection {get; }//碰撞的点在空间中的坐标
        public Vector3 normal {get; } //粒子入射碰撞点的法线方向(eg:如果粒子从X轴正方向入射,则normal输出为(1,0,0),反之负方向为(-1,0,0))
        public Vector3 velocity {get; }//粒子碰撞时的三维速度向量
}
//(官方案例)给碰撞的物体添加粒子移动方向的力
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++;
        }
}

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引