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

时间:2018-10-02 02:29:42

标签: list unity3d pass-by-reference gameobject cloning

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

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;
}

尝试进行DeepCloning,但由于Image变量而无法完成

3 个答案:

答案 0 :(得分:0)

您(实际上)不能

使这些引用保持活动状态的唯一方法是,首先防止这些对象被破坏(在处理场景更改时这是不可行的)。

将对象从内存中删除并重新创建时,保持它的“保留”是不可能的。您也许可以设置一些奇怪的序列化/反序列化步骤,但是您必须使列表具有某种UUID,以便在更改场景时,对象会找出其UUID,并且列表会在场景中查询具有该UUID的对象,但是...会很混乱。甚至可能不会一直工作。

您最好说“这些数据是易变的”,并牢记这一点。只要让事物过期并在场景变化时重新创建(如果需要)即可。

答案 1 :(得分:0)

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

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

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

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

编辑: 要在场景之间切换时销毁所有按钮,可以按照以下步骤进行操作:

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

答案 2 :(得分:0)

这不是很漂亮,但是您必须复制/克隆所有元素(如果其中一个是列表,则如果克隆列表,则不会相同,但是列表中的元素将是参考)。

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