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
相关产品推荐
相关产品推荐

