这应该是一个相当简单的问题,但我已经尝试了几种方法来解决它,但结果总是一样的。
我正在尝试将包含游戏对象的列表复制到另一个列表中。问题是,似乎我正在复制引用,因为对原始列表中游戏对象所做的任何更改也会影响新列表中的对象,这是我不想发生的事情。从我读到的内容来看,我正在进行浅层复制而不是深层复制,因此我尝试使用以下代码克隆每个对象:
现在,在这里创建原始列表:
我正在尝试将包含游戏对象的列表复制到另一个列表中。问题是,似乎我正在复制引用,因为对原始列表中游戏对象所做的任何更改也会影响新列表中的对象,这是我不想发生的事情。从我读到的内容来看,我正在进行浅层复制而不是深层复制,因此我尝试使用以下代码克隆每个对象:
public static class ObjectCopier
{
/// <summary>
/// Perform a deep Copy of the object.
/// </summary>
/// <typeparam name="T">The type of object being copied.</typeparam>
/// <param name="source">The object instance to copy.</param>
/// <returns>The copied object.</returns>
public static GameObject Clone<GameObject>(GameObject source)
{
if (!typeof(GameObject).IsSerializable)
{
throw new ArgumentException("The type must be serializable ", "source: " + source);
}
// Don't serialize a null object, simply return the default for that object
/*if (Object.ReferenceEquals(source, null))
{
return default(GameObject);
}*/
IFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
using (stream)
{
formatter.Serialize(stream, source);
stream.Seek(0, SeekOrigin.Begin);
return (GameObject)formatter.Deserialize(stream);
}
}
}
我遇到了以下错误:
ArgumentException: 类型必须可序列化 参数名:source:SP0 (UnityEngine.GameObject) ObjectCopier.Clone[GameObject] (UnityEngine.GameObject source) (位于 Assets/Scripts/ScenarioManager.cs:121)
上面贴出的函数在这里被调用:
void SaveScenario(){
foreach(GameObject obj in sleManager.listOfSourcePoints){
tempObj = ObjectCopier.Clone(obj);
listOfScenarioSourcePoints.Add(tempObj);
Debug.Log("Saved Scenario Source List Point");
}
foreach(GameObject obj in sleManager.listOfDestPoints){
tempObj = ObjectCopier.Clone(obj);
listOfScenarioDestPoints.Add(tempObj);
Debug.Log("Saved Scenario Dest List Point");
}
}
void LoadScenario(){
sleManager.listOfSourcePoints.Clear();
sleManager.listOfDestPoints.Clear ();
foreach(GameObject obj in listOfScenarioSourcePoints){
tempObj = ObjectCopier.Clone(obj);
sleManager.listOfSourcePoints.Add(tempObj);
Debug.Log("Loaded Scenario Source List Point");
}
foreach(GameObject obj in listOfScenarioDestPoints){
tempObj = ObjectCopier.Clone(obj);
sleManager.listOfDestPoints.Add(tempObj);
Debug.Log("Loaded Scenario Dest List Point");
}
}
现在,在这里创建原始列表:
if (child.name == "DestinationPoints")
{
parentDestinationPoints = child.gameObject;
foreach (Transform grandChildDP in parentDestinationPoints.transform)
{
//Debug.Log("Added DP object named: " + grandChildDP.name);
tempObj = grandChildDP.gameObject;
listOfDestPoints.Add(tempObj);
tempObj.AddComponent<DestinationControl>();
tempObj.transform.renderer.material.color = Color.white;
}
}
// Hide all SourcePoints in the scene
if (child.name == "SourcePoints")
{
parentSourcePoints = child.gameObject;
foreach (Transform grandChildSP in parentSourcePoints.transform)
{
tempObj = grandChildSP.gameObject;
listOfSourcePoints.Add(tempObj);
tempObj.transform.renderer.enabled = false;
}
}
这个"tempObj"有[SerializeField]属性,所以我可能漏掉了什么。任何帮助都将不胜感激。
编辑:忘记提到,这个应用程序是在Unity3D中的。