【发布时间】:2014-03-20 11:23:57
【问题描述】:
这应该是一个相当容易解决的问题,但是我尝试了几种方法,但结果总是一样的。
我正在尝试将包含 GameObjects 的列表复制到另一个列表中。问题是我似乎在复制引用,因为对原始列表的 GameObjects 所做的任何更改也会影响新列表中的那些,这是我不希望发生的事情。根据我的阅读,我正在做浅拷贝而不是深拷贝,所以我尝试使用以下代码克隆每个对象:
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:类型必须是可序列化的参数名称: 来源:SP0 (UnityEngine.GameObject) ObjectCopier.Clone[GameObject] (UnityEngine.GameObject 源)(在 资产/脚本/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 中的。
【问题讨论】:
-
据我所知,您不能像尝试那样简单地创建游戏对象的副本。我认为您需要 Instantiate 一个新的游戏对象,然后将其添加到第二个列表中