没有Seri​​alize的深层复制

时间:2014-08-17 10:19:37

标签: c# generics serialization unity3d binaryformatter

我正在尝试复制同一类的两个不同的实例,没有参考,我不知道为什么那么难做,只是复制并且好,再见,是的?

顺便说一下,我发现了一个带有binnaryformatter的脚本,可以满足我的需求,但是在我的课堂上我有一个Texture2D类型的变量,当我按下播放时,我有一个错误,说Texture2D没有被标记为可序列化。

using UnityEngine;
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;

public class pichota : MonoBehaviour {

    public List<Pig> johnPigList = new List<Pig>();
    public List<Pig> peterPigList = new List<Pig>();

    void Start () {
        List<Pig> templist = Clone(johnPigList);
        peterPigList = templist;
    }

    public List<Pig> Clone(List<Pig> source)
    {
        BinaryFormatter bf = new BinaryFormatter();
        using (var ms = new MemoryStream())
        {
            bf.Serialize(ms, source);
            ms.Seek(0, 0);
            return (List<Pig>)bf.Deserialize(ms);
        }
    }

    void Update () {
        if (Input.GetKeyDown(KeyCode.G))
        {

            peterPigList[0].number += 2;
        }
    }
}

[System.Serializable]
public class Pig
{
    public int number;
}

有另一种深度复制的方法,还是只是序列化纹理2d?不要嘲笑我,我对这些先进的东西不熟悉

1 个答案:

答案 0 :(得分:1)

我不知道为什么你需要一堆克隆纹理。这对我来说似乎很奇怪,我想象的是程序化的动画图像。

通常,您无法在Unity中序列化纹理。 AFAIK它不会那样工作。但您可以使用 Texture2D.EncodeToPNG 将纹理转换为字节数组,并将其序列化。

无论如何,在编辑器模式下,Unity允许您使用CopySerialized克隆不同的对象。此外,还有一些用于复制组件的未记录的函数:

UnityEditorInternal.ComponentUtility.CopyComponent(copiedComponent);
UnityEditorInternal.ComponentUtility.PasteComponentAsNew(targetGameObject);

在播放器模式下,如果要克隆任意对象,那么最好的方法是使用反射而不是序列化。