如何统计递归调用次数及判断首次递归调用执行完成?
实现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
相关产品推荐
相关产品推荐

