您好,我使用Unity已经有一段时间了,我仍然无法分辨OnCollisionStay和OnCollisionEnter之间的区别。我假设当一个刚体(如球)与另一个刚体/碰撞器(如墙)接触时,就会调用OncollisionEnter。但是当我看到OnCollisionStay的例子时,我完全搞混了。即使它每帧调用一次,例如,如果我跳到空中,撞到我上方的天花板,它仍然被调用吗?到底有什么不同呢?以下是Unity文档所说的内容和我使用的代码。
“当此碰撞器/刚体已开始接触另一个刚体/碰撞器时,将调用OnCollisionEnter。”
“对于接触刚体/碰撞器的每个碰撞器/刚体,每帧调用一次OnCollisionStay。”
if(Input.GetKeyDown(KeyCode.W) && OnGround == True)
{
rigidbody.velocity.y = jumpHeight;
}
onGround = false;
function OnCollisionStay()
{
onGround = true;
}
发布于 2014-05-15 23:19:48
这真的很简单。让我们假设碰撞开始,碰撞器保持相交一段时间(几帧),并在一段时间后,他们再次分离。这些事件包括:
仅对第一帧执行
即使它每帧调用一次,例如,如果我跳到空中,撞到我上方的天花板,它还会被调用吗?
当然是了。但是对于那次新的碰撞。但是,如果在这两者之间有一段时间你没有与任何东西发生冲突,那么在这段时间内你将不会得到OnCollisionStay事件。
为了更深入地理解这些事件,最好创建一个简单的演示场景,在其中手动将两个对撞机相交,并将各种事件的一些文本写入控制台。
发布于 2014-05-15 23:23:33
Bart的答案是正确的,所以这个答案更多地是如何使用这两个的一个例子。
比方说,假设一个球打在墙上,OnCollisionEnter
会在每个碰撞案例中发射1次,而OnCollisionEnter
可能会对墙造成一些破坏,或者摧毁墙。(就像突破一样)
//Ball
#pragma strict
function OnCollisionEnter (col : Collision)
{
if(col.gameObject.name == "Wall")
{
Destroy(col.gameObject);
}
}
然而,在OnCollisionStay
中,只要OnCollisionStay
在给定的时间后继续发射,你就可以使用它,只要你有一个角色的生命点步入毒云,并移除连续的生命点或增量计时生命点。(我在想castlevania )
//PoisonGasCloud
#pragma strict
function OnCollisionStay(collisionInfo : Collision)
{
collisionTime = Time.deltaTime;
if ( collisionTime > 5)
{
hero.hp-=10;
}
}
注意:我通常用C#编写代码,所以我的UnityScript可能有点偏。
发布于 2020-10-22 04:49:08
注1:不会同时调用OnCollisionStay和OnCollisionExit。
注2:在OnCollisionStay之前调用OnCollisionEnter。
https://stackoverflow.com/questions/23681719
复制相似问题