在 Unity 中避免粒子和对撞机之间的碰撞

Posted

技术标签:

【中文标题】在 Unity 中避免粒子和对撞机之间的碰撞【英文标题】:Avoiding collision between particles and collider in Unity 【发布时间】:2015-08-21 14:46:08 【问题描述】:

我有任意多的东西互相射击粒子系统。我希望粒子击中目标而不是原始对象。是否可以:

在粒子系统和碰撞器之间使用IgnoreCollision

在运行时定义新的碰撞层

或者是否有一些我没有考虑过的偷偷摸摸的方法来解决这个问题?

【问题讨论】:

【参考方案1】:

您应该检查您正在碰撞的对象是否与您的原始对象相同,因此通过检查器将您的原始游戏对象分配给该脚本的原始变量,然后在碰撞中检查您撞击的对象是否相同,如果不是那么你没有击中起源

  Public GameObject origin;
 void OnParticleCollision(GameObject other)           
     if(other.GetInstanceID() != origin.GetInstanceID())
         DoSomething();
              

【讨论】:

虽然这在某些情况下有效,但 OnParticleCollision 仅在发生实际物理碰撞和反弹后调用,这使得无法从对象中发射,因为它永远不会到达目的地 你说你现在检查代码中的冲突,而你的问题是在某些情况下忽略它,那么你如何检查代码中的冲突 我确实将 OnParticleCollision 用于游戏逻辑。 :) 但是碰撞的物理处理——无论事物是否通过其他事物——是 Unity 的一部分,我不知道如何从我的代码中影响它。 最好的方法是将你的粒子附加到一个游戏对象上并为你的游戏对象添加一个碰撞器,然后改用OnCollisionEnter【参考方案2】:

我能给你的最佳建议是检查自碰撞并记录有关谁在做的警告。然后就是摆弄对撞机和粒子生成器的问题,这样就不会发生上述碰撞。

不幸的是,似乎没有任何代码端方法可以告诉粒子系统碰撞模块忽略某些碰撞器。

如果绝对所有其他方法都失败了,您是否可以改用 Particle Trigger 体积来代替?随着变通办法的进行,这可能是一个巨大的痛苦。您必须手动控制“可碰撞”形状集。

【讨论】:

【参考方案3】:

如果您想在运行时设置 Collision 模块的 collides with 值,您需要定义 Layermask 并使用以下代码:

var particleCollision = yourParticleSystemComponent.collision;
particleCollision.collidesWith = layermask;

我认为您不能在 ParticleSystem 和 Collider 之间使用 IgnoreCollision

【讨论】:

以上是关于在 Unity 中避免粒子和对撞机之间的碰撞的主要内容,如果未能解决你的问题,请参考以下文章

Unity 中某些动画期间平滑过渡和碰撞的动画

Unity3D之怎么实现粒子特效的碰撞

Unity使用ParticleSystem粒子系统模拟药水在血管中流动(粒子碰撞)

Unity使用ParticleSystem粒子系统模拟药水在血管中流动(粒子碰撞)

碰撞后未调用 Unity5 OnTriggerEnter2D(2D 游戏)

unity3d 怎么检测碰撞?比如主角碰撞到物体之后销毁被撞到的物体