Unity2D中C#方法无异常终止问题排查求助
Unity2D国际象棋Piece类CopyInfoToGlobals方法终止问题排查与解决
问题现象
- 调用
CopyInfoToGlobals()时,执行到Add()操作后方法无异常提示但直接终止 - 循环内的
print($"yfdhg {ew[r].x}, {ew[r].y}")仅打印一次 - 循环后的
print("yuo")从未执行,调用方法后无任何返回输出
原因分析
- 二维数组内List未实例化:
globals.PieceInteractions是静态二维数组,仅创建了数组框架,但每个元素默认是null。第一次执行Add()时触发NullReferenceException,Unity部分场景下不会显示异常日志,但方法已因异常中断。 - 循环条件错误:
r < ew.Count - 1会跳过最后一个键值对,即使修复空引用问题,也无法处理所有元素。
解决方案
1. 初始化PieceInteractions的所有List元素
在Globals类的静态构造函数或Awake方法中,为二维数组的每个位置创建新的List实例:
public class Globals { public static List<Piece.LocalBoardRepresention>[,] PieceInteractions = new List<Piece.LocalBoardRepresention>[8,8]; static Globals() { for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { PieceInteractions[x, y] = new List<Piece.LocalBoardRepresention>(); } } } }
2. 修正循环条件
把循环条件改成r < ew.Count,确保遍历所有字典键:
for (int r = 0; r < ew.Count; r++) { print($"yfdhg {ew[r].x}, {ew[r].y}"); globals.PieceInteractions[ew[r].x, ew[r].y].Add(range[ew[r]]); }
3. 可选:添加空值安全检查
为避免后续出现空引用问题,在Add操作前增加判断:
var targetPos = ew[r]; if (globals.PieceInteractions[targetPos.x, targetPos.y] != null && range.TryGetValue(targetPos, out var boardRep)) { globals.PieceInteractions[targetPos.x, targetPos.y].Add(boardRep); }
内容的提问来源于stack exchange,提问作者Tyler Levy
相关产品推荐
相关产品推荐

