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

Unity抛射物仅首个可按时停用 后续实例堆积问题排查求助

问题根因

  • 你代码中操作的始终是原始的projectile对象(大概率是场景中的源对象/关联的预制体),没有持有每次新生成的抛射物实例的引用,1.5秒后被停用的只有原始对象,后续实例化出来的抛射物没有任何逻辑控制它们的停用,自然会一直堆积。
  • 协程blah()定义在Update()方法内属于错误写法,Update每帧执行会重复定义协程,存在不可预知的运行风险。
  • 先激活原始projectile再实例化的逻辑多余,实例化出来的对象会默认继承源对象的激活状态,不需要额外操作源对象。

修复后代码

void Update()
{
    if (timebtwshots <= 0)
    {
        StartCoroutine(SpawnProjectile());
    }
    else
    {
        timebtwshots -= Time.deltaTime;
    }
}

// 协程提到类级别定义,不要放在Update内
IEnumerator SpawnProjectile()
{
    // 持有本次新生成的抛射物实例引用
    GameObject newProjectile = Instantiate(projectile, transform.position, Quaternion.identity);
    newProjectile.SetActive(true);
    timebtwshots = starttimebtwshots;
    yield return new WaitForSeconds(1.5f);
    // 停用本次生成的实例,而非原始的projectile对象
    newProjectile.SetActive(false);
}

补充优化建议

如果要实现抛射物复用减少性能消耗,建议单独实现对象池逻辑:提前实例化一批抛射物存到队列中,需要使用时取出激活,到期停用后放回队列,不需要反复执行Instantiate/Destroy操作。

内容的提问来源于stack exchange,提问作者Moaaz Siddiqui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 03:39:04