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 以固定的延迟重生,但允许管理器脚本根据需要处理重生,这可能就是您要找的。
我有一些对象在屏幕上滚动,并且不停地滚动。
我想在触摸时删除对象(我得到了那部分)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 以固定的延迟重生,但允许管理器脚本根据需要处理重生,这可能就是您要找的。