Глубокое копирование без сериализации

Я пытаюсь скопировать два разных экземпляра одного и того же класса без ссылки, я не знаю, почему это так сложно сделать, просто скопируйте и хорошо, до свидания, да?

Кстати, я нашел скрипт с 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? не смейтесь надо мной, я новичок в этих продвинутых вещах


person Francisco Giestas    schedule 17.08.2014    source источник
comment
Добавьте дополнительную информацию о том, какой класс копировать. Это из вашего собственного кода, какой диапазон членов и т.д.   -  person Henk Holterman    schedule 17.08.2014
comment
почему бы не создать конструктор Pig, который принимает Pig в качестве аргумента и копирует элементы конструктора?   -  person Rudolfwm    schedule 17.08.2014
comment
вау, Рудольф, я провел один день и одну ночь, пытаясь решить эту проблему, и это очень простое решение!   -  person Francisco Giestas    schedule 18.08.2014
comment
Лучше иметь функцию, называемую deepcopy или smallcopy, чем клон или конструктор копирования, поскольку должно быть очевидно, что делается.   -  person Imapler    schedule 18.08.2014
comment
@Imapler, ваше соглашение об именах теоретически лучше, но реальность диктует, что у вас будут смешанные (мелкие и глубокие) копии членов, поэтому это никогда не будет так просто, как вы предлагаете. На самом деле, следуя вашему соглашению об именах, он, вероятно, получит функции deepcopy, deepcopy и notsodeepcopy для описания того, что он делает.   -  person Rudolfwm    schedule 18.08.2014


Ответы (1)


Я понятия не имею, зачем вам куча клонированных текстур. Мне это кажется странным, и я представляю себе такие вещи, как процедурно анимированные изображения.

Обычно вы не можете сериализовать текстуру в Unity. AFAIK это просто не работает таким образом. Но вы можете превратить текстуру в массив байтов с помощью Texture2D.EncodeToPNG и вместо этого сериализовать ее.

В любом случае, в режиме редактора Unity позволяет вам клонировать различные объекты с помощью CopySerialized. Также есть некоторые недокументированные функции, используемые для копирования компонентов:

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

В режиме проигрывателя, если вы хотите клонировать произвольный объект, лучше всего использовать отражение вместо сериализации.

person game development germ    schedule 18.08.2014