OnCollisionStay与OnCollisionEnter

时间:2014-05-15 14:49:07

标签: unity3d

您好我已经使用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;
}

3 个答案:

答案 0 :(得分:5)

这真的很简单。让我们假设碰撞开始,碰撞器保持相交一段时间(几帧),并在一段时间后再次分开。事件是:

  • 仅适用于第一帧的OnCollisionEnter,直到OnCollisionExit之后才会再次使用
  • OnCollisionStay整个持续时间(所有帧)
  • 仅限最后一帧的OnCollisionExit
  

即使它每帧调用一次,如果我在空中跳起来并击中我上方的天花板,它仍然被称为?

当然可以。但是那次新的碰撞。但是如果有一段时间你没有碰到任何东西,那么你将不会在这段时间内获得OnCollisionStay事件。

为了更深入地了解这些事件,最好创建一个简单的演示场景,在该场景中手动交叉两个碰撞器,并将一些文本写入控制台以用于各种事件。

答案 1 :(得分:1)

巴特的答案是正确的,所以这个答案更像是你如何使用这两个答案的一个例子。

因此,OnCollisionEnter每次碰撞时会发射1次,例如球撞击墙壁,OnCollisionEnter可能会对墙壁造成一些伤害或破坏墙壁。 (如突破)

//Ball
#pragma strict

function OnCollisionEnter (col : Collision)
{
    if(col.gameObject.name == "Wall")
    {
        Destroy(col.gameObject);
    }
}

然而,在OnCollisionStay中,只要OnCollisionStay继续射击,你就会使用具有生命点的角色进入毒云并移除连续生命值或删除增量定时生命值的角色经过一段时间后。 (我正在思考castlevania SOTH)

//PoisonGasCloud
#pragma strict
function OnCollisionStay(collisionInfo : Collision)
{

    collisionTime = Time.deltaTime;

    if ( collisionTime > 5)
    {
        hero.hp-=10;
    }
}

注意:我通常使用C#编写代码,因此我的UnityScript可能会有点偏差。

答案 2 :(得分:0)

  • 碰撞开始时:OnCollisionEnter和OnCollisionStay
  • 当碰撞继续时:OnCollisionStay
  • 碰撞结束后:OnCollisionExit

注意1:不会同时调用OnCollisionStay和OnCollisionExit。

注释2:OnCollisionStay之前的OnCollisionEnter呼叫。