我对C#和Unity陌生,我有一个问题。我无法理解OnCollisionEnter的工作原理。
例如,如果我有一个地形和一个在其上悬停的,具有刚体分量的球体,则我写:-
void OnCollisionEnter(Collision other)
{
Debug.Log(other.gameObject.name);
}
,然后在控制台屏幕上运行我们的代码将获得“ Sphere”而不是“ Terrain”。为什么将Sphere传递给“其他”而不是地形?
第二,我相信OnCollisionEnter是MonoBehavior类的一部分,我们的类已经从MonoBehavior继承了它。
然后,为什么我们必须再次定义OnCollisionEnter()?
这些问题确实让我大吃一惊。如果有人可以帮助我,我将非常感激。
答案 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
中,您可以在“消息” OnCollisionEnter
等Awake
,Update
,Start
等>,而不在“私人/公共/任何方法”下。
简而言之:消息仅在内部由组件中的Unity进程(如果存在)调用,如果不存在,则根本不调用。
我认为他们在后台使用类似于Component.SendMessage
的方式,但不确定。
在此游戏对象中的每个
methodName
上调用名为MonoBehaviour
的方法。