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

Unity中如何移除或提升Max Recursion Depth?解决递归溢出异常

解决StackOverflowException及脚本优化方案

错误原因澄清

你遇到的StackOverflowException是递归调用深度超过上限导致的,和场景中子弹数量没有直接关系。这个错误说明你的代码里存在无限递归(或递归没有正确终止)的逻辑——比如某个函数在执行过程中反复调用自身,或者A函数调用B函数、B函数又调用A函数,形成循环调用,直到达到Unity的递归深度限制。

解决方法

  1. 定位递归逻辑
    • 检查玩家跳跃/子弹生成脚本:确认是否存在每帧递归调用的函数(比如在Update里调用了一个会再次触发Update或自身的方法)
    • 检查碰撞销毁脚本:查看碰撞触发的函数是否间接调用了会再次触发碰撞的逻辑(比如销毁时又调用了生成或碰撞检测相关代码)
    • 用Debug.Log("函数名调用次数:" + count)在可疑函数开头打日志,统计调用次数,快速定位无限递归的源头
  2. 临时调整递归深度(不推荐优先使用)
    如果确认递归逻辑是必要的(比如特定算法需求),可以在代码开头全局设置递归上限:
    Recursion.defaultMaxDepth = 200;
    
    但这只是治标,优先解决递归逻辑问题才是根本。

脚本优化建议

子弹生成脚本优化

  • 用时间间隔控制射速:不要每帧生成子弹,改用时间累加的方式控制发射频率,避免帧率波动影响射速,同时减少无效调用:
    private float fireRate = 0.1f;
    private float nextFireTime = 0;
    
    void Update()
    {
        if (Input.GetKey(KeyCode.Space) && Time.time >= nextFireTime)
        {
            SpawnBullet();
            nextFireTime = Time.time + fireRate;
        }
    }
    
  • 使用对象池复用子弹:创建一个子弹对象池,预先生成一批子弹,需要时激活、用完后回收,避免频繁调用Instantiate和Destroy带来的性能开销,同时更容易控制子弹数量
  • 添加生成边界校验:生成子弹时判断位置是否在有效游戏区域内,避免生成无效子弹

碰撞销毁脚本优化

  • 确保销毁逻辑只触发一次:在碰撞触发后先禁用子弹的碰撞体,防止重复触发碰撞回调:
    void OnCollisionEnter2D(Collision2D other)
    {
        GetComponent<Collider2D>().enabled = false;
        // 回收至对象池或销毁
        gameObject.SetActive(false);
        // 或 Destroy(gameObject, 0.1f);
    }
    
  • 简化碰撞逻辑:不要在碰撞回调中执行复杂递归或嵌套调用,把销毁/回收逻辑拆成简单的同步操作
  • 优化碰撞层检测:给子弹和碰撞目标设置专属Layer,在Physics 2D设置中只让这些Layer互相检测,减少不必要的碰撞检测消耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:03:14