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

调用DestroyAircraft方法时电脑卡顿崩溃,疑因生成大量BrokenAircraft

问题分析与修复方案

核心问题

你的代码存在两个致命逻辑错误,直接导致卡顿崩溃:

  1. 操作对象错误:实例化BrokenAircraft后,没有保存实例的引用,反而遍历原始预制体的子物体,并且错误地给当前脚本所在的gameObject反复添加Rigidbody组件——子物体越多,添加的组件数量就越多,最终导致内存暴涨、性能崩溃。
  2. 逻辑顺序错误:在销毁原飞机后,未正确关联实例化的破碎飞机对象,所有物理力的施加都没有作用在目标物体上,反而无效消耗性能。

修复后的代码

public void DestroyAircraft()
{
    Vector3 aircraftPos = Aircraft.transform.position;
    // 保存实例化的破碎飞机引用,操作这个实例而非原始预制体
    GameObject instantiatedBroken = GameObject.Instantiate(BrokenAircraft, aircraftPos, Quaternion.identity);
    
    Destroy(Aircraft);

    // 遍历实例化对象的子物体,而非原始预制体
    foreach(Transform child in instantiatedBroken.transform)
    {
        // 给子物体添加Rigidbody,而非当前脚本所在对象
        Rigidbody rb = child.gameObject.AddComponent<Rigidbody>();
        
        if(rb != null)
        {
            // 爆炸力的作用点用原飞机位置,确保效果正确
            rb.AddExplosionForce(Random.Range(minExplode, maxExplode), aircraftPos, radius);
        }
    }
}

额外优化建议

  • 如果BrokenAircraft的子物体已经自带Rigidbody,可以移除循环里的AddComponent逻辑,避免重复添加组件浪费性能。
  • 对于大量碎片的情况,建议使用对象池提前预制碎片对象,避免频繁实例化/销毁带来的性能波动。
  • 如果不需要长期保留碎片,可以给实例化的instantiatedBroken添加延迟销毁逻辑,比如Destroy(instantiatedBroken, 5f);,防止内存堆积。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:39:46