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

如何统计递归调用次数及判断首次递归调用执行完成?

实现CompositeRun递归计数与首次调用完成判断方案

1. 递归激活次数统计

添加私有成员变量跟踪递归层级(即激活次数),进入CompositeRun时递增计数,协程执行完毕后递减:

private int _compositeRecursionDepth = 0;
private bool _isGameCompleted = false; // 标记是否达成关卡目标

2. 首次调用完成判断

首次调用的CompositeRun是递归的最外层,当递归层级回到0时,说明所有嵌套复合操作已执行完毕。此时若_isGameCompleted为false,则触发「真正游戏结束」逻辑。

3. 修改后的完整代码

private int _compositeRecursionDepth = 0;
private bool _isGameCompleted = false;

IEnumerator CompositeRun(string name)
{
    _compositeRecursionDepth++; // 进入协程,递归计数+1

    BotOperation operation;
    compositeOps.TryGetValue(name, out operation);
    CompositeOperation compOp = operation as CompositeOperation;
    List<BotOperation> botOpList = compOp?.opList;

    if (botOpList != null)
    {
        for (int i = 0; i < botOpList.Count; i++)
        {
            // 已达成目标则直接终止循环
            if (_isGameCompleted) break;

            BotOperation op = botOpList[i];
            CompositeOperation comp = op as CompositeOperation;

            if (comp != null)
            {
                // 递归执行子复合操作
                yield return StartCoroutine(CompositeRun(comp.name));
            }

            if (op != null && op.ValidateOperation(gameObject, levelDef))
            {
                op.RunOperation(gameObject, levelDef);

                if (CheckGameOver())
                {
                    _isGameCompleted = true;
                    StopAllCoroutines();
                }
            }
            
            if (!_isGameCompleted)
            {
                yield return new WaitForSeconds(operationDelay);
            }
        }
    }

    _compositeRecursionDepth--; // 协程执行完毕,递归计数-1

    // 判断最外层调用完成且未达成目标
    if (_compositeRecursionDepth == 0 && !_isGameCompleted)
    {
        // 触发「真正游戏结束」逻辑
        TriggerTrueGameOver();
    }

    yield return null;
}

// 自定义真正游戏结束逻辑方法
void TriggerTrueGameOver()
{
    // 这里写入失败UI展示、关卡重置等结束处理代码
}

关键逻辑说明

  • 递归计数通过_compositeRecursionDepth精准跟踪激活次数,进增退减确保层级判断准确。
  • _isGameCompleted避免目标达成后执行冗余逻辑,同时防止终止协程后触发错误的结束判断。
  • 最外层调用完成的核心判断条件是_compositeRecursionDepth == 0,此时所有嵌套操作已执行完毕,未达成目标则触发自定义结束流程。

内容的提问来源于stack exchange,提问作者Lucas da Costa Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:39:16