Unity忽略同一层的碰撞。

3

我希望使用 Physics.IgnoreCollision 避免子弹相互碰撞。子弹是在第8层生成的。为什么这不起作用?如何忽略与同一层上的所有物体的碰撞?

// bulletscript.cs
gameObject.layer = 8;

// maingamescript.cs
Physics.IgnoreCollision(8,8);

第8层可能还有其他应该被忽略的对象(例如玩家飞船)。


你的代码是正确的,那个更改只需要一些时间才能在Unity中生效,请查看我的答案(实际上这是Unity的问题,我以为他们已经解决了这个问题)。如果我的答案不起作用,那么你必须在其他覆盖设置的脚本中寻找解决方案。 - CoffeDeveloper
3个回答

10

为什么不使用方便的物理管理器。转到 编辑->项目设置-> 物理 并设置正确的层碰撞。 输入图像描述


2

转到物理管理器,并取消选中带有自身的层以避免碰撞。

enter image description here


1

问题排查:

  1. Unity bug,尝试更新到最新的Unity 5.3.x(5.4目前有严重的bug)
  2. 确保子弹和玩家在所需的层中有效
  3. 更改层需要一些时间才能生效(几帧),由于子弹速度很快,你可能会遇到这种延迟(因此在更改生效之前,子弹已经击中了目标)
  4. 最好的方法是拥有一个子弹预制件,它已经在正确的层中生成,稍后可以根据需要在运行时更改图形,但为了避免延迟,应该已经在正确的层中实例化。

无需转到物理管理器,OP已经执行了与物理管理器相当的正确代码。真正的问题是GameObject应该已经用正确的层实例化,因为层更新可能需要一些时间才能生效。

另一个解决方法是禁用/重新启用碰撞器。


请删除此内容。已经有回答了这个问题,而这个并没有。 “尝试更新到最新的Unity 3.3.x(3.4目前存在严重的错误)” 真的吗?更新到5年前发布的Unity 3.3.x可以解决问题吗?那么OP也应该降级到Windows 95。 - Programmer
抱歉,我是指Unity 5.3.x :) 无论如何,这些答案都是无用的,因为它们只是编辑器实现OP已经试图以编程方式实现的内容的方式,所以它们不能解决问题,因为具有与OP代码相同的效果,问题实际上在其他地方(事实上我的答案也不同)。问题是更改传播时间,而不是使用编辑器。这些可能会强制间接使用预定义层,但那只是一个副作用,并且对于未来的读者没有用处,因为这在Unity中已经深入记录了。 - CoffeDeveloper
1
哦,好的。3.3.x让我感到害怕。很高兴知道你指的是5.4。至于其他答案,我真的不认为它们是无用的。唯一无用的情况是如果OP想要在后期禁用碰撞然后启用它。在这种情况下,OP只想禁用碰撞。从编辑器中执行此操作完全没有问题。你回答中的#3听起来像是实际的问题。 - Programmer
1
我其实是指从编辑器中更改它,别再用代码来做了。当然,也需要从编辑器中更改图层。仅当 OP 想要在某个时刻禁用碰撞,然后再启用它时,才应该使用代码进行更改。如果他只想像在问题中提到的那样禁用它,则无需从代码中这样做。这是浪费代码。对于您的第三点和第四点表示赞同。 - Programmer
我认为有可能是在代码起作用之前子弹已经击中了目标。当我使用碰撞物理管理器时,它运作正常,所以那可能是问题所在。我不确定应该选择哪个答案作为正确答案……在我的情况下,问题是通过使用物理管理器解决的。 - Kokodoko
标记您更喜欢哪一个,物理管理器间接修复问题,最终只有 OP 知道哪个答案对他更有用。(问题是延迟,您可以通过物理管理器来解决它) - CoffeDeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接