禁用 GameObject 但继续 运行 Coroutine
Disable GameObject but continue to run Coroutine
我有一个 BonusController
脚本作为 Bonus
游戏对象的一个组件。此 Bonus 必须在碰撞时被摧毁,但必须 "act" 几秒钟。我为此启动了一个协程,但脚本停止了执行(我认为这是因为我将 gameObject 设置为非活动状态)。这是BonusController
的代码:
void OnTriggerEnter2D(Collider2D col)
{
StartCoroutine(speedUp(1));
gameObject.SetActive(false);
}
IEnumerator speedUp(float seconds)
{
Debug.Log("before");
yield return new WaitForSeconds(seconds);
Debug.Log("after"); // <--- This is never called
}
如何在删除对象的同时不停止协程脚本的执行?
您不能只禁用 mesh renderer
和 collider
吗?这样游戏对象仍然存在,但用户将看不到它。
你不能拉动你站立的地面。 :)
只需禁用 SpriteRenderer
,因为您正在使用 2D 方法。并保持对象活动并启用。
{
StartCoroutine(speedUp(1));
//gameObject.SetActive (false);
GetComponent<SpriteRenderer> ().enabled = false;
GetComponent<Collider2D> ().enabled = false;
// Above line will deactivate the first collider it will find.
}
IEnumerator speedUp(float seconds)
{
Debug.Log("before");
yield return new WaitForSeconds(seconds);
Debug.Log("after"); // <--- This is never called
}
为了在一段时间后销毁对象,在yield之后在协程内部调用destroy。
yield return WaitForSeconds(second);
Destroy(this);
现在它被正确销毁并释放内存,而不是仍然在那里,不可见,但占用资源。
我有一个 BonusController
脚本作为 Bonus
游戏对象的一个组件。此 Bonus 必须在碰撞时被摧毁,但必须 "act" 几秒钟。我为此启动了一个协程,但脚本停止了执行(我认为这是因为我将 gameObject 设置为非活动状态)。这是BonusController
的代码:
void OnTriggerEnter2D(Collider2D col)
{
StartCoroutine(speedUp(1));
gameObject.SetActive(false);
}
IEnumerator speedUp(float seconds)
{
Debug.Log("before");
yield return new WaitForSeconds(seconds);
Debug.Log("after"); // <--- This is never called
}
如何在删除对象的同时不停止协程脚本的执行?
您不能只禁用 mesh renderer
和 collider
吗?这样游戏对象仍然存在,但用户将看不到它。
你不能拉动你站立的地面。 :)
只需禁用 SpriteRenderer
,因为您正在使用 2D 方法。并保持对象活动并启用。
{
StartCoroutine(speedUp(1));
//gameObject.SetActive (false);
GetComponent<SpriteRenderer> ().enabled = false;
GetComponent<Collider2D> ().enabled = false;
// Above line will deactivate the first collider it will find.
}
IEnumerator speedUp(float seconds)
{
Debug.Log("before");
yield return new WaitForSeconds(seconds);
Debug.Log("after"); // <--- This is never called
}
为了在一段时间后销毁对象,在yield之后在协程内部调用destroy。
yield return WaitForSeconds(second);
Destroy(this);
现在它被正确销毁并释放内存,而不是仍然在那里,不可见,但占用资源。