Unity C#数组-如何克隆 - c#

我在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;
}

参考方案

但是,输出显示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方法的地方。 (例如,可能需要依次克隆该区域。)

Unity XCode iOS启动时崩溃 - c#

我正在开发Unity iOS游戏。运行正常,然后突然出现,当我通过团结追加并尝试在发生异常后通过XCode运行时。即使我的备份XCode项目也是如此。之后,我创建了一个测试项目,仍然给出相同的错误。 dyld:找不到符号:__Unwind_SjLjUnregister引用自: /System/Library/PrivateFrameworks/GameKit…

Unity WebGL WebSocket消息头 - c#

我已经制作了多人游戏系统。一切正常。但是我想更改消息头(或-标记,开销等),以减少传输的数据。Node.JS服务器端具有“消息”标签wss.on('message',function incoming(message)){ ... ... } 但是在Unity方面,我无法使用方法或变量。w = new WebSocket (new Uri…

C#如何将System.Net.ConnectStream转换为字节[](数组) - c#

我试图将流(System.Net.ConnectStream)转换为字节数组。关于如何做到这一点的任何想法/例子? 参考方案 Stream sourceStream = ... // the ConnectStream byte[] array; using (var ms = new MemoryStream()) { sourceStream.CopyT…

将Java转换为C#(Unity) - java

我正在尝试将this Java code(使用Dijkstra的两栈算法评估算术表达式)转换为C#:using System; using System.Collections.Generic; using System.IO; public class Evaluate { public double Eval(string expression) { S…

OnGUI仅在第一个组件中被调用 - c#

我正在创建一个游戏,以了解Unity观看教程(this one)的过程,并且我的播放器具有两个组件:PlayerHealth和PlayerAttack。两者都工作正常,但问题是当我尝试在第二个组件(PlayerAttack)的OnGUI中执行某项操作时,从不调用PlayerAttack中的OnGUI。是因为PlayerAttack被添加到PlayerHeal…