我有一个组件列表,我想给它一些值。
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类
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
变量而无法完成
答案 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)
这不是很漂亮,但是您必须复制/克隆所有元素(如果其中一个是列表,则如果克隆列表,则不会相同,但是列表中的元素将是参考)。
您可以尝试使用仅传递数据的临时对象。