You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:57:03