为什么OnCollisionEnter不会被触发?

时间:2019-05-29 12:40:15

标签: c# unity3d

我有两个对象:

对象A(SteamVR摄像机):

  • 具有启用了“运动学”功能的刚体。
  • 具有一个启用了“触发”功能的Box Collider。
  • 具有“ OnCollisionEnter”方法的脚本。

对象B(地球模型):

  • 具有启用了“触发”功能的Sphere Collider。

我确保对撞机范围正确,但是以某种方式不会触发OnCollisionEnter方法。

我用于OnCollisionEnter的代码如下:

private void OnCollisionEnter(Collision collision)
{
    Debug.Log("Collision entered");
}

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

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

  

对象A :运动刚体触发对撞机
  对象B :静态触发器对撞机

如果您选中Collision Matrix,则与具有触发器的任何对象(对象A和对象B)都不会发生碰撞,因此OnCollisionEnter将不会触发。
我再说一遍:触发器不会与其他任何物体发生碰撞。

解决方案:使用OnTriggerEnter代替OnCollisionEnter

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

请考虑在这种情况下,方法的参数将是Collider other,它是Collider而不是Collision,但是在您的情况下,我认为您不需要冲突完全没有。

private void OnTriggerEnter(Collider other) 
    => Debug.Log("entered");

关于Unity冲突的见识

碰撞取决于刚体和对撞机设置对象。我可以根据您的情况显示一些示例。

要考虑的第一个元素是,静态对撞机不是通常设置为“静态”的对象(这在下面的注释中引起混淆)。

来自Unity Manual

  

静态收藏家
  这是一个具有对撞机但没有刚体的GameObject。静态的   对撞机用于始终保持不变的关卡几何   的地方,永远不要动弹。传入的刚体物体将发生碰撞   使用静态对撞机,但不会移动它。

还请考虑您要使用触发器(将STATIC COLLDER转换为STATIC TRIGGER COLLIDER)。

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

触发器

  

脚本系统可以检测何时发生冲突并启动   使用OnCollisionEnter函数执行操作。但是,您也可以使用   物理引擎仅用于检测一个对撞机何时进入太空   不会产生碰撞配置为   触发器(使用“触发器”属性)不像实体一样   反对,并且只会允许其他对撞机通过。当一个   对撞机进入其空间,触发器将调用OnTriggerEnter   触发对象脚本的功能