取消对GameObject的延迟Destroy()调用

时间:2016-10-27 15:50:14

标签: c# unity3d unity5

我在destroy中创建了一个gameObject,并在此对象上调用了Destroy()方法,延迟时间为2秒。

Destroy(gameObject,2.0f);

我想要的是,如果另一个带有对撞机的游戏对象与此游戏对象发生碰撞,我想取消对此特定游戏对象的销毁调用。

我试图在同一个游戏对象上再次使用新的持续时间调用destroy,但它仍然会根据旧的持续时间被破坏。

void OnCollisionEnter2D(Collision2D coll)
{
    //Debug.Log("Inside Enter");
    if (coll.gameObject.tag == "Ball")
    {
        Destroy(gameObject, reInitializeLifeOfLine);
        Debug.Log("Inside Enter");
    }
}

有人可以建议如何实现这个

2 个答案:

答案 0 :(得分:1)

调用Destroy()后,没有内置方法可以防止GameObject的破坏。但是,其他人已经探索过各种解决方案,这些解决方案可以完全满足您的需求。

这是一个简单的(改编自Unity Answers),使用Invoke(),您可以手动取消:

void OnCollisionEnter2D(Collision2D coll)
{
    if (coll.gameObject.tag == "Ball")
    {
        CancelInvoke("DestroySelf");
        Invoke("DestroySelf", reInitializeLifeOfLine);
    }
}

void DestroySelf () {
    Destroy(gameObject);
}

希望这有帮助!如果您有任何问题,请告诉我。

答案 1 :(得分:1)

我使用以下代码

解决了这个问题
float reInitializeLifeOfObject = 5.0f;
float lifeTimeOfObject = 3f;
private float startTime;

void Start()
{
    startTime = Time.time;
}

void FixedUpdate()
{
    // This will destroy the gameObject in 5 second
    if((Time.time - startTime) > lifeTimeOfObject)
    {
        Destroy(gameObject.transform.parent.gameObject);
    }
}
void OnCollisionEnter2D(Collision2D coll)
{
    if (coll.gameObject.tag == "Ball")
    {
        // Re-initializing the startTime so that Object is not abruptly destroy while ball is still
        // interacting with game object
        startTime = Time.time;
    }
}

我创建了一个float变量startTime并在Start()方法中初始化它。 现在在FixedUpdate中,我正在检查是否已经过了5秒。如果是,则销毁该对象。

现在对于碰撞部分,我正在检查OnCollisionEnter2D()。如果object正在与一个collider进行交互,那么我将使用当前时间为startTime重新赋值。

这解决了我的问题