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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:48:01