我在Unity3D中开发一个小应用程序/游戏。
问题是: 我需要克隆一个数组(称之为tempArray)并对其进行一些修改。然后我需要将MAIN数组的值更改为修改后的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;
}
答案 0 :(得分:4)
但是,输出显示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
方法。 (例如,它可能需要依次克隆该区域。)
答案 1 :(得分:1)