Unity:如何不使用 GetComponent() 将引用添加到列表中?

Unity: How to not add references into List with GetComponent()?

我有一个组件列表,我想像这样给它一些值。

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() 并在多个场景中使用。然而,切换场景后,出现了这样的情况:

我了解这是因为属性作为引用添加到列表中,并且在更改场景时,按钮克隆被破坏并且无法再被引用。

是否有解决方法,让我在整个场景中重用我的值作为实际值而不是引用?如何添加克隆 LoadButtonProperties 数据的 副本 而不是对克隆的引用?

编辑:改写了上面的问题以进行澄清

编辑:这是 LoadButtonProperties class

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 变量

,我无法做到

你(实际上)不能

保持这些引用“存活”的唯一方法是首先防止这些对象被破坏(这在处理场景变化时是不可行的)。

在对象从内存中删除并重新创建时保持...“保留”对象是不可能的。您也许可以设置一些奇怪的 serialization/deserialization 步骤,但您必须使您的列表成为某种 UUID,当您更改场景时,对象会计算出它们的 UUID,并且列表会在场景中查询对象那个 UUID,但是……它会很乱。甚至可能无法一直工作。

你最好说“这些数据是易变的”,并在构建时牢记这一点。当场景改变时,让事物过期并重新创建(如果需要)它们。

你的问题有点矛盾,因为你问如何在场景之间保留引用,然后又问如何不在场景之间保留它们。

至于如何在场景之间清除它们,您可以使用新列表重置按钮列表。这将使您在场景之间从头开始。

如果您想在场景之间保留数据和对象,您可以使用序列化和 DontDestroyOnLoad

查看本教程:https://unity3d.com/learn/tutorials/topics/scripting/persistence-saving-and-loading-data 了解有关数据持久性的更多信息。

编辑: 要在场景之间切换时销毁所有按钮,您可以按照以下方式做一些事情:

foreach (LoadButtonProperties buttonToDelete in loadButtons) {
    Destroy(buttonToDelete.gameObject);
}

它不漂亮,但你必须 copy/clone 所有元素(如果其中一个是列表,如果你克隆列表,它不会相同但元素在该列表将作为参考)。

您可以尝试使用只传递数据的临时对象。