Unity中存储gameObject的二维数组更新玩家位置代码可读性优化问题
方案1:提取重复索引计算,优化基础版本
你目前写的第三版已经是兼顾正确性和可读性的基础写法,把重复的坐标强转逻辑提取成单独变量后,逻辑会更清晰,也避免了重复计算:
public void UpdatePlayerPosition(Vector3 posStart, Vector3 posEnd) { int startX = (int)posStart.x; int startZ = (int)posStart.z; int endX = (int)posEnd.x; int endZ = (int)posEnd.z; var startItem = _levelItems[startX, startZ]; _levelItems[endX, endZ] = startItem; _levelItems[startX, startZ] = null; }
这个版本没有额外封装成本,性能和原始正确写法完全一致,可读性更高。
方案2:封装通用扩展方法,适合多次复用的场景
如果你的项目里有大量类似的二维数组元素移动操作,可以写一个通用的扩展方法,后续调用代码会非常简洁:
// 通用二维数组扩展,放在任意公共静态类里即可 public static class Array2DExtensions { public static void MoveElement<T>(this T[,] array, int fromX, int fromY, int toX, int toY) { array[toX, toY] = array[fromX, fromY]; array[fromX, fromY] = default; } } // 业务侧调用代码 public void UpdatePlayerPosition(Vector3 posStart, Vector3 posEnd) { _levelItems.MoveElement( fromX: (int)posStart.x, fromY: (int)posStart.z, toX: (int)posEnd.x, toY: (int)posEnd.z ); }
这种写法的优势是复用性强,调用侧完全不需要关心移动元素的实现细节,方法名本身就表意明确,代码更干净。
注:第二段代码失效是C#的语法规则决定的,placeStart和placeEnd都是栈上的本地变量,存储的是数组元素引用的副本,修改本地变量的指向完全不会影响原数组的存储内容,没有绕过的可能。
内容的提问来源于stack exchange,提问作者user13002098
相关产品推荐
相关产品推荐

