OnCollisionEnter函数如何“基本”工作?

时间:2019-06-11 17:56:10

标签: c# unity3d

我对C#和Unity陌生,我有一个问题。我无法理解OnCollisionEnter的工作原理。

例如,如果我有一个地形和一个在其上悬停的,具有刚体分量的球体,则我写:-

void OnCollisionEnter(Collision other)
{
    Debug.Log(other.gameObject.name);
}

,然后在控制台屏幕上运行我们的代码将获得“ Sphere”而不是“ Terrain”。为什么将Sphere传递给“其他”而不是地形?

第二,我相信OnCollisionEnter是MonoBehavior类的一部分,我们的类已经从MonoBehavior继承了它。

然后,为什么我们必须再次定义OnCollisionEnter()?

这些问题确实让我大吃一惊。如果有人可以帮助我,我将非常感激。

2 个答案:

答案 0 :(得分:2)

工作原理:“当该对撞机/刚体开始接触另一个刚体/对撞机时,将调用OnCollisionEnter”-https://docs.unity3d.com/ScriptReference/Collider.OnCollisionEnter.html 如果在由引擎本身调用的MonoBehavior派生类的主体中定义了OnCollisionEnter,则它是其他函数(更新,固定更新,启动,唤醒等),

为什么在Sphere上触发:由于您在类中附加了方法,因此,请参见上方的OnCollisionEnter的工作原理。

答案 1 :(得分:2)

  

为什么将Sphere传递给“其他”而不是地形?

other中传递的内容取决于将该组件附加到哪个对象……如果将其附加到Terrain,则在other中应该得到Sphere,反之亦然。因此,您看到other这个名字实际上是有道理的,对吧?

  

然后,为什么我们必须再次定义OnCollisionEnter()

MonoBehaviour中,您可以在“消息” OnCollisionEnterAwakeUpdateStart等>,而不在“私人/公共/任何方法”下。

简而言之:消息仅在内部由组件中的Unity进程(如果存在)调用,如果不存在,则根本不调用。

我认为他们在后台使用类似于Component.SendMessage的方式,但不确定。

  

在此游戏对象中的每个methodName上调用名为MonoBehaviour的方法。