Unity3D粒子系统碰撞器抑制、反弹

时间:2024-05-23 17:43:52


Unity3D粒子系统碰撞器抑制、反弹Unity3D粒子系统碰撞器抑制、反弹

关于碰撞检测的主要配置我们看图中的Collision

第一项:因为是一个,所以这里我选择的是World

第二项(Dampen):抑制(0~1),选这个为1时(完全抑制),碰撞之后,阻止了粒子,可以使碰撞的粒子消失

第三项(Bounce):反弹(0~2),选完这个之后,可以让产生碰撞的粒子以某个角度反弹出去

第三项(Lifetime Loss):生命周期损失(0~1),碰撞之后让粒子损失百分比的生命周期,为1时(生命周期完全损失),可以使粒子消失

第四项(Min Kill Speed):最小清除速度,设置值越大,粒子发生碰撞之后被移除的速度越快,当达到某个值之后,可以近似碰撞之后立即消失

第五项(Collides With):可碰撞范围,设置可以与该粒子系统碰撞的层

第六项(Collision Quality):碰撞质量,设置发生碰撞的碰撞概率大小,选项三项从上到下由高到低,越低碰撞到的概率就越低

第七项(Send Collision Messages):发送碰撞信息,与下面这个方法有关

[csharp] view plaincopyUnity3D粒子系统碰撞器抑制、反弹Unity3D粒子系统碰撞器抑制、反弹Unity3D粒子系统碰撞器抑制、反弹

  1. // 需要处理的碰撞信息,放在被撞的物体身上  
  2.  
  3. //(官方案例)给碰撞的物体添加粒子移动方向的力
  4.  
  5. public ParticleSystem part;
  6. public List<ParticleCollisionEvent> collisionEvents;
  7.  
  8. void Start()
  9. {
  10. part = GetComponent<ParticleSystem>();
  11. collisionEvents = new List<ParticleCollisionEvent>();
  12. }
  13.  
  14. void OnParticleCollision(GameObject other)
  15. {
  16. int numCollisionEvents = part.GetCollisionEvents(other, collisionEvents);
  17.  
  18. Rigidbody rb = other.GetComponent<Rigidbody>();
  19. int i = 0;
  20.  
  21. while (i < numCollisionEvents)
  22. {
  23. if (rb)
  24. {
  25. Vector3 pos = collisionEvents[i].intersection;
  26. Vector3 force = collisionEvents[i].velocity * 10;
  27.  
  28. rb.AddForce(force);
  29. }
  30. i++;
  31. }
  32. }
  33.  


总结一下以上可以使粒子消失的方法有以下三种:

1)设置Dampen1

2)设置Lifetime Loss1

3)设置较大的Min Kill Speed

 

 

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; }//粒子碰撞时的三维速度向量

}