Unity Collision Remove 然后添加回来

Unity Collision Remove then Add back

我有一些对象在屏幕上滚动,并且不停地滚动。 我想在触摸时删除对象(我得到了那部分)SetActive/Destroy。
我正在尝试将对象添加回场景,以便可以重新使用它们。

我该怎么做?

if (col.gameObject.tag == "Coin"){
        coinCount++;
        coins.text = coinCount.ToString();

        // Save Coins
        PlayerPrefs.SetInt("Coins", coinCount);
        col.gameObject.SetActive(false);
    }

上面的代码在 -> OnTriggerEnter2D(Collider2D){}

// Waits Seconds to put coins in correct spot
IEnumerator afterSeconds(GameObject x)
{
    //x.SetActive(false);

    yield return new WaitForSeconds(5f);//5f

    //x.SetActive(true);
}

您可以使用 MonoBehavior.Invoke() 并为对撞机设置一个 class 变量,但是如果在重新启用步骤之前发生碰撞,这会很麻烦。相反,我会使用 Coroutine.

if (col.gameObject.tag == "Coin"){
        coinCount++;
        coins.text = coinCount.ToString();

        // Save Coins
        PlayerPrefs.SetInt("Coins", coinCount);
        StartCoroutine(afterSeconds(col.gameObject)); //hide, delay, show  
    }

然后:

// Waits Seconds to put coins in correct spot
IEnumerator afterSeconds(GameObject x)
{
    x.SetActive(false);
    yield return new WaitForSeconds(5f);
    x.SetActive(true);
}

您可能正在寻找的是对象池。这是一个管理动态数量 GameObjects 实例化的系统,通过 而不是 销毁和实例化它们,而是使它们不可见和可重用。如果池中 运行 没有所需的对象(因为一次使用的对象太多),它可以根据需要实例化其他对象。通常有资产可以做到这一点,但我想它也可以自己编码。即使是官方的 Unity 教程也提到了这一点并将其归类为初学者级别:Object Pooling。 然后发生的是您只需用您的 InstantiatePool 方法替换所有 Instantiate 方法。

因此,如果您不想明确地让 GameObjects 以固定的延迟重生,但允许管理器脚本根据需要处理重生,这可能就是您要找的。