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

C#协程内延迟销毁其他GameObject的报错问题排查与解决

问题根因

你的代码存在两个直接导致报错/逻辑不生效的问题:

  • 作用域错误:other是OnTriggerEnter方法的局部参数,仅在该方法内部可访问,你定义的DestroyingScale协程是独立方法,作用域内不存在other变量,直接访问会抛出编译错误。
  • 协程返回值类型错误:Unity协程要求返回值类型为IEnumerator,你写的IEnumerable是集合迭代器的基接口,用这个类型启动协程不会正常执行。

另外你当前的逻辑和需求描述存在偏差:现有写法只会销毁触发本次碰撞事件的单个对象,不会一次性销毁场景内所有标签为"scale"的对象。


修复代码

版本1:仅销毁触发碰撞的带scale标签对象(匹配你当前代码的逻辑方向)

给协程传入待销毁的目标对象引用即可,额外做空判断避免等待期间对象被提前销毁触发空引用:

private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("scale"))
    {
        StartCoroutine(DestroyingScale(other.gameObject));
    }
}

IEnumerator DestroyingScale(GameObject target)
{
    yield return new WaitForSeconds(5f);
    if (target != null)
    {
        Destroy(target);
    }
}

版本2:触发时销毁全场景所有带scale标签的对象(匹配你最开始描述的需求)

协程内查找所有符合标签要求的对象,延迟后统一销毁:

private void OnTriggerEnter(Collider other)
{
    // 可按需调整触发条件,比如判断进入碰撞体的是玩家才执行销毁逻辑
    StartCoroutine(DestroyAllScaleAfterDelay(5f));
}

IEnumerator DestroyAllScaleAfterDelay(float waitTime)
{
    yield return new WaitForSeconds(waitTime);
    GameObject[] allScaleObjs = GameObject.FindGameObjectsWithTag("scale");
    foreach (GameObject obj in allScaleObjs)
    {
        if (obj != null) Destroy(obj);
    }
}

补充说明
  • 协程的生命周期和挂载脚本的GameObject绑定,如果挂载该脚本的触发器对象在延迟等待期间被销毁,协程会自动终止,后续销毁逻辑不会执行。
  • 如果需要延迟时间可配置,可以把等待时间也做成协程参数,不要硬写在协程内部。
  • 标签判断优先使用CompareTag方法,比直接通过tag属性对比字符串性能更好,且传入不存在的标签名时会直接在控制台输出错误,避免静默逻辑失败。

内容的提问来源于stack exchange,提问作者chana banana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:15:38