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

开发Tetris Attack/Panel de Pon时脚本Debug.Log未执行,求修改方案

问题分析与修复方案

首先,你的Debug.Log("Match?")没执行的核心原因非常直接:你在函数里创建了一个空的List<Vector2Int> exist = new List<Vector2Int>();,然后直接遍历这个空列表——循环体里的代码根本不会被触发,自然看不到调试日志。

除此之外,你的代码还有几个逻辑错误,会导致匹配功能完全无法工作,我来逐一拆解并修复:


1. 空列表导致循环直接跳过

你定义的exist是全新的空列表,foreach循环直接跳过所有内容,这是最直观的问题。这个变量的设计逻辑完全偏离了你的需求——你应该是想检查当前单元格的四个相邻方向(上下左右),而不是遍历一个空集合。

2. 边界判断逻辑错误

你的边界检查写反了x和y的对应范围,而且用<=会导致数组越界:

// 错误写法
if (x >= 0 && x <= height && y >= 0 && y <= width)

通常width对应x轴(水平方向)的最大列数,height对应y轴(垂直方向)的最大行数,数组索引从0开始,所以正确的边界判断应该是:

if (x >= 0 && x < width && y >= 0 && y < height)

3. 无效的相等判断

!n.Equals(matching)这行完全没有意义:n是单个Vector2Int对象,matching是List<Vector2Int>集合,两者永远不可能相等,这行条件会直接阻止任何后续代码执行(哪怕exist有元素也没用)。

4. 递归逻辑重复添加元素

matching.AddRange(FindCellNeighbor(...))会重复添加元素,因为递归调用里已经执行了matching.Add(new Vector2Int(x, y));同时你没有处理重复访问同一个单元格的问题,会导致无限递归。


修复后的完整代码

我重写了FindCellNeighbor函数,用**深度优先搜索(DFS)**来查找所有相邻匹配的单元格,同时用HashSet记录已访问的单元格,避免重复递归和无限循环:

private List<Vector2Int> FindCellNeighbor(int x, int y, List<Vector2Int> matching, HashSet<Vector2Int> visited) {
    // 提前检查:边界越界或已访问过,直接返回
    Vector2Int currentCell = new Vector2Int(x, y);
    if (x < 0 || x >= width || y < 0 || y >= height || visited.Contains(currentCell)) {
        return matching;
    }

    // 标记当前单元格为已访问,并加入匹配列表
    visited.Add(currentCell);
    matching.Add(currentCell);
    Debug.Log($"Added cell: ({x}, {y})");

    // 检查四个相邻方向的匹配情况
    // 右侧邻居
    if (x + 1 < width && data[x, y] == data[x + 1, y]) {
        FindCellNeighbor(x + 1, y, matching, visited);
        Debug.Log("Right neighbor matched");
    }
    // 左侧邻居
    if (x - 1 >= 0 && data[x, y] == data[x - 1, y]) {
        FindCellNeighbor(x - 1, y, matching, visited);
        Debug.Log("Left neighbor matched");
    }
    // 下方邻居
    if (y + 1 < height && data[x, y] == data[x, y + 1]) {
        FindCellNeighbor(x, y + 1, matching, visited);
        Debug.Log("Down neighbor matched");
    }
    // 上方邻居
    if (y - 1 >= 0 && data[x, y] == data[x, y - 1]) {
        FindCellNeighbor(x, y - 1, matching, visited);
        Debug.Log("Up neighbor matched");
    }

    return matching;
}

调用示例

使用这个函数时,需要初始化空的匹配列表和已访问集合:

// 假设你要从(startX, startY)位置开始查找匹配
List<Vector2Int> matches = new List<Vector2Int>();
HashSet<Vector2Int> visited = new HashSet<Vector2Int>();
matches = FindCellNeighbor(startX, startY, matches, visited);

// 输出匹配结果
Debug.Log($"Found {matches.Count} matching cells:");
foreach (var cell in matches) {
    Debug.Log($"({cell.x}, {cell.y})");
}

额外优化建议

  • 用HashSet代替List检查已访问,因为HashSet.Contains()的时间复杂度是O(1),比List.Contains()的O(n)高效很多,尤其在网格较大时。
  • 如果你的游戏需要频繁查找匹配,可以考虑用广度优先搜索(BFS)替代DFS,避免递归深度过大导致栈溢出(比如整个网格都是相同元素的极端情况)。
  • 可以把匹配判断逻辑封装成单独的辅助函数,让代码更易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:55:46