Unity C# 数组 - 如何克隆

本文关键字:何克隆 数组 Unity | 更新日期: 2023-09-27 18:31:28

我在Unity3D中开发一个小应用程序/游戏。

问题是:我需要克隆一个数组(称之为 tempArray)并对其进行一些修改。然后我需要将主数组的值更改为修改后的临时数组。但是,每当我对克隆阵列进行更改时,都会对主阵列进行相同的更改。

所以我使用了以下代码:

private Cell[,] allCells = new Cell[256, 256];
private Cell[,] cellClone = new Cell[256,256];
//meanwhile initiated to some values//
//Here i clone the array.
cellClone = (Cell[,])allCells.Clone();
//Here i output the values for an element from both arrays.
Debug.Log(cellClone[0, 0].region.name.ToString());
Debug.Log(allCells[0, 0].region.name.ToString());
//Here i want to change "Region" variable of cellClone ONLY.
cellClone[0, 0].setRegion(new Region("testregion123", Color.cyan, false));
//Finally, i output the same values again. Only cellClone should change.
Debug.Log(cellClone[0, 0].region.name.ToString());
Debug.Log(allCells[0, 0].region.name.ToString());

但是,输出显示 allCells[0,0] 元素也已更改。这意味着我对克隆阵列执行的任何操作都会对主阵列执行。


编辑:

经过大量的尝试,我将其作为解决方案实现。我发布这个以防有人遇到类似的问题。

但我不确定这是否是应该这样做的,所以如果有人有任何信息 - 我正在检查这篇文章。

for (int i = 0; i < allCells.GetLength(0); i++)
{
    for (int j = 0; j < allCells.GetLength(1); j++)
    {
        //cellClone[i, j] = allCells[i, j].Clone();
        //cellClone[i, j] = new Cell((int)allCells[i, j].position.x, (int)allCells[i, j].position.y, allCells[i, j].getRegionName());
        cellClone[i, j] = allCells[i, j].clone();
    }
}

和克隆功能:

public Cell clone()
{
        Cell n = new Cell((int)position.x, (int)position.y, regionName);
        return n;
}

Unity C# 数组 - 如何克隆

但是,输出显示 allCells[0,0] 元素也已更改。这意味着我对克隆阵列执行的任何操作都会对主阵列执行。

除非Cell是结构,否则您的setRegion方法(听起来它实际上应该只是一个Region属性)根本不会更改数组的内容。它正在更改存储在两个数组都包含引用的对象中的数据。

您正在执行数组的浅层克隆,这意味着正在复制引用 - 但每个Cell对象都没有被克隆。(我们甚至不知道该操作是否已在Cell内实现。

听起来您想执行深度克隆,如下所示:

for (int i = 0; i < allCells.GetLength(0); i++)
{
    for (int j = 0; j < allCells.GetLength(1); j++)
    {
         cellClone[i, j] = allCells[i, j].Clone();
    }
}

。您需要自己实现Clone方法的地方。(例如,它可能需要依次克隆该区域。

看看这个:

数组复制

Array.Copy (Array, Array, Int32)

更简单,只有 1 行代码;