This should be a fairly simple problem to solve, however I tried several ways to do this, but the results are always the same.
I am trying to copy a list containing GameObjects to another list. The problem is that I copy the links, since any changes made to the GameObjects of the original list also affect the ones in the new list that I donβt want. From what I read, I am making a shallow copy instead of a deep copy, so I tried using the following code to clone each object:
public static class ObjectCopier
{
public static GameObject Clone<GameObject>(GameObject source)
{
if (!typeof(GameObject).IsSerializable)
{
throw new ArgumentException("The type must be serializable ", "source: " + source);
}
IFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
using (stream)
{
formatter.Serialize(stream, source);
stream.Seek(0, SeekOrigin.Begin);
return (GameObject)formatter.Deserialize(stream);
}
}
}
I get the following error:
ArgumentException: type must be serializable. Parameter name: source: SP0 (UnityEngine.GameObject) ObjectCopier.Clone [GameObject] (Source UnityEngine.GameObject) (in 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)
{
tempObj = grandChildDP.gameObject;
listOfDestPoints.Add(tempObj);
tempObj.AddComponent<DestinationControl>();
tempObj.transform.renderer.material.color = Color.white;
}
}
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], - . .
EDIT: , Unity3D.