取消游戏对象上延迟的Destroy()调用

本文关键字:Destroy 调用 延迟 游戏 对象 取消 | 更新日期: 2023-09-27 18:15:12

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

Destroy(gameObject,2.0f);

我想要的是,如果另一个带有碰撞器的gameObject与这个gameObject碰撞,我想要取消对这个特定gameObject的destroy调用。

我尝试在相同的游戏对象上使用新的持续时间再次调用destroy,但它仍然会根据旧的持续时间被销毁。

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

谁能建议如何实现这个

取消游戏对象上延迟的Destroy()调用

没有内置的方法来防止在你调用Destroy()后破坏游戏对象。然而,其他人已经探索了各种各样的解决方法,这些方法可以达到您所需要的效果。

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

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

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

我使用下面的代码解决了这个问题

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;
    }
}

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

现在对于碰撞部分,我正在检查OnCollisionEnter2D()。如果对象与碰撞器交互,我将用当前时间重新分配startTime的值。

这就解决了我的问题