Unity Prefab被设为非激活后无法重新激活问题求助
问题根本原因
你的TreeSpawner脚本是挂载在要被激活/失活的tree GameObject本身上的。Unity中,当挂载协程的GameObject被设置为非激活状态时,该对象上所有正在运行的协程都会被直接终止,不会继续执行后续逻辑。
第一个1秒等待结束后,执行tree.SetActive(false),此时挂在tree上的TreeSpawner实例的Respawn协程直接被停掉,所以第二个2秒的等待以及之后的逻辑永远不会执行,自然看不到Respawn Timer done...的日志。
修复方案
有三种常用的修复方式:
- 把
TreeSpawner脚本挂载到一个永远不会被失活的GameObject上(比如场景里专门放全局管理器的空对象),只把需要控制的tree对象赋值给TreeSpawner的tree字段即可,协程运行在全局管理器对象上,不会受tree失活的影响。 - 不用协程实现计时,改用独立于GameObject生命周期的计时方案,比如
Time.deltaTime累积计时、或者Async/Await结合Task.Delay(注意C#异步要提前处理好场景卸载的取消逻辑,避免内存泄漏)。 - 如果一定要把TreeSpawner挂在tree对象上,可以把后半段协程转交给出不会失活的对象运行,示例代码如下:
IEnumerator Respawn(float timeToDespawn, float timeToRespawn) { yield return new WaitForSeconds(timeToDespawn); Debug.Log("Deleting..."); tree.SetActive(false); Debug.Log("Deleted..."); Debug.Log("Respawning..."); // 把后续协程转交给出不会失活的主摄像机对象运行 yield return Camera.main.StartCoroutine(WaitAndActive(timeToRespawn)); } IEnumerator WaitAndActive(float delay) { yield return new WaitForSeconds(delay); Debug.Log("Respawn Timer done..."); tree.SetActive(true); Debug.Log("Respawned..."); }
内容的提问来源于stack exchange,提问作者jackabe
相关产品推荐
相关产品推荐

