Unity Collision删除然后重新添加

时间:2018-07-02 22:07:11

标签: c# unity3d enums triggers collision-detection

我有一些对象可以在屏幕上滚动,并且会不断滚动。 我想在触摸时移除对象(我拿到了那部分)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);
}

2 个答案:

答案 0 :(得分:5)

您可以使用MonoBehavior.Invoke()并将对撞机设置为类变量,但是如果在重新启用步骤之前发生冲突,这将很麻烦。相反,我会使用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);
}

答案 1 :(得分:0)

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

因此,如果您不想显式地使GameObjects在固定的延迟内重生,而是允许管理器脚本按需要处理重生,这可能就是您想要的。