2014-11-20 2 views
2

Im разрабатывает небольшое приложение/игру в Unity3D.Unity C# Array - как клонировать

Проблема в следующем: Мне нужно клонировать массив (называть его 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] был также изменен. Это означает, что любая операция, которую я делаю с клонированным массивом, выполняется в основном массиве.


EDIT:

После много играть вокруг я реализовал это в качестве решения. Я отправляю это, если у кого-то есть аналогичная проблема.

Но я не уверен, что так оно и должно быть сделано, если у кого-то есть какая-либо информация.

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

Вы проверили 'Deep Copy или Clone.? вот какой-то пример http://stackoverflow.com/questions/4054075/how-to-make-a-deep-copy-of-an-array-in-c – MethodMan

+0

Я пробовал глубокую копию.Однако я сбросил его, когда попросил меня установить «UnityEngine.Vector2» как сериализуемый. – Szlosestack

ответ

5

Тем не менее, вывод показывает, что элемент 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. (Это, возможно, потребуется клонировать область, в свою очередь, к примеру.)

+0

Спасибо. Я обязательно проверю это. – Szlosestack

Смежные вопросы