Unity: Как не добавлять ссылки в List с помощью GetComponent ()? - PullRequest
0 голосов
/ 02 октября 2018

У меня есть список компонентов, и я хочу дать ему некоторые значения, как это.

public LoadButtonData loadButtonData;

GameObject clone = Instantiate(buttonPrefab, transform);
LoadButtonProperties properties = clone.GetComponent<LoadButtonProperties>();
properties.filePath = filePath;
properties.Date.text = time.ToShortDateString();
properties.Name.text = fileName;
properties.Place.text = DataLoaded.sceneName;
properties.Thumbnail.sprite = newSprite;
loadButtonData.loadButtons.Add(properties);

LoadButtonData - это объект, содержащийся в другом объекте с помощью DontDestroyOnLoad () и используемый в нескольких сценах.Однако после переключения сцен это происходит:

enter image description here

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

Есть ли обходной путь для этого, чтобы я мог повторно использовать свои значения в своих сценах как реальные значения, а не как ссылки?Как добавить копии данных клона LoadButtonProperties вместо ссылок на клон?

Редактировать: Перефразированный вопрос для уточнения

Редактировать: ЭтоКласс LoadButtonProperties

public class LoadButtonProperties : MonoBehaviour
{
    /// <summary>
    /// Path to the json file for loading
    /// </summary>
    public string filePath;

    [Tooltip("Place Date here")]
    public TextMeshProUGUI Date;
    [Tooltip("Place Name here")]
    public TextMeshProUGUI Name;
    [Tooltip("Place Place here")]
    public TextMeshProUGUI Place;
    [Tooltip("Place Thumbnail here")]
    public Image Thumbnail;
}

Была предпринята попытка глубокого клонирования, но мне не удалось это сделать из-за переменной Image

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

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

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

Если вы хотите хранить данные и объекты между сценами, вы можете использовать сериализацию и DontDestroyOnLoad

. Ознакомьтесь с этим руководством: https://unity3d.com/learn/tutorials/topics/scripting/persistence-saving-and-loading-data для получения дополнительной информации о сохранении данных.

РЕДАКТИРОВАТЬ: чтобы уничтожить все кнопки при переключении между сценами, вы можете сделать что-то вроде этого:

foreach (LoadButtonProperties buttonToDelete in loadButtons) {
    Destroy(buttonToDelete.gameObject);
}
0 голосов
/ 02 октября 2018

Это не красиво, но вы должны скопировать / клонировать все элементы (и если один из них является списком, если вы клонируете список, он не будет таким же, но элементы в списке будутРекомендации).

Вы можете попробовать использовать временный объект, который передает только данные.

0 голосов
/ 02 октября 2018

Вы (реально) не можете

Единственный способ сохранить эти ссылки "живыми" - это предотвратить уничтожение этих объектов в первую очередь (что невозможно при работе с изменениями сцены).

Сохранение ... "удержания" объекта, пока он удален из памяти и воссоздан, на самом деле невозможно.Возможно, вам удастся установить какой-то странный шаг сериализации / десериализации, но вам придется сделать свой список неким UUID, чтобы при смене сцен объекты выясняли свой UUID, а список запрашивал у сцены объекты с этим UUID., но ... это будет грязноИ может даже не работать все время.

Вам лучше сказать «эти данные нестабильны» и строить с учетом этого.Просто позвольте вещам истекать и воссоздайте (если необходимо) их, когда сцена меняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...