为什么 OnCollisionEnter 没有被触发?

zer*_*erk 1 c# unity-game-engine

我有两个对象:

对象 A(SteamVR 相机):

  • 具有启用“Is Kinematic”的刚体。
  • 有一个启用了“Is Trigger”的盒子碰撞器。
  • 具有带有“OnCollisionEnter”方法的脚本。

对象 B(地球模型):

  • 具有启用“Is Trigger”的球体碰撞器。

我确保碰撞器范围正确,但不知何故,OnCollisionEnter 方法没有被触发。

我用于 OnCollisionEnter 的代码如下所示:

private void OnCollisionEnter(Collision collision)
{
    Debug.Log("Collision entered");
}
Run Code Online (Sandbox Code Playgroud)

有人可以给我一些见解/建议吗?

谢谢转发。

Jac*_*ani 5

问题:任何带有触发器的对象之间都没有碰撞

\n\n

要了解碰撞的工作原理,您首先需要确定哪些对象正在碰撞,因为很少有对象可能会触发OnCollisionEnter

\n\n

根据您的描述,我们可以识别出两种类型的物体。

\n\n
\n

对象 A:运动刚体触发碰撞器
\n 对象 B:静态触发碰撞器

\n
\n\n

如果您检查碰撞矩阵,则可能不会与具有触发器的任何物体(对象 A 和对象 B)发生碰撞,因此 OnCollisionEnter 不会触发。
\n我再说一遍:无论其他对象是什么,触发器都不会与任何东西发生碰撞。

\n\n

解决方案:使用 OnTriggerEnter 而不是 OnCollisionEnter

\n\n

如果您想从与触发对象(或其中两个,如您的情况)的碰撞中获取事件,您可以使用OnTriggerEnter

\n\n

考虑到在这种情况下,该方法的参数将是Collider otherCollider不是Collision,但在您的情况下,我认为您根本不需要碰撞。

\n\n
private void OnTriggerEnter(Collider other) \n    => Debug.Log("entered");\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

关于 Unity 碰撞的见解

\n\n

碰撞取决于刚体和碰撞器设置对象。我可以根据你的情况举几个例子。

\n\n

要考虑的第一个元素是静态碰撞器不是通常设置为静态的对象(这是下面评论中的混乱根源)。

\n\n

来自Unity手册

\n\n
\n

静态碰撞器
\n 这是一个具有碰撞器但没有刚体的游戏对象。静态碰撞器用于始终保持在同一位置且从不移动的关卡几何体。传入的刚体对象将与静态碰撞器发生碰撞,但不会移动它。

\n
\n\n

还要考虑您想要使用触发器(使您的 STATIC COLLDER 变成 STATIC TRIGGER COLLIDER)。

\n\n

基本上,触发器背后的想法是:\n “当您想要捕获事件但不希望游戏对象与物理力交互时使用触发器。”

\n\n

触发器

\n\n
\n

脚本系统可以检测何时发生冲突并使用 OnCollisionEnter 函数启动操作。不过,您也可以使用物理引擎来检测一个碰撞体何时进入另一个碰撞体的空间,而不产生碰撞配置为触发器(使用“Is Trigger”属性)的碰撞体不会表现为实体对象,而只会允许其他碰撞体通过。当碰撞体进入其空间时,触发器将调用触发器对象\xe2\x80\x99s 脚本上的 OnTriggerEnter\n 函数

\n
\n