gpt4 book ai didi

c# - 如何避免 ScriptableObject 数据结构更改时的数据丢失

转载 作者:行者123 更新时间:2023-12-03 21:20:31 30 4
gpt4 key购买 nike

我正在使用 ScriptableObject Assets 来存储我的多语言应用程序项目的数据。这工作得很好,除了我想更改现有数据结构的情况。

就我而言,数据结构如下所示:

[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/I18NData", order = 1)]
public class I18NData : ScriptableObject
{
public I18NSpriteData[] Sprites;
public I18NTextData[] Texts;
}

[System.Serializable]
public class I18NSpriteData
{
public string Label;
public Sprite SpriteEN;
public Sprite SpriteFR;
public Sprite SpriteSG;
public Sprite SpriteES;
public Sprite SpriteDE;
public Sprite SpriteIT;
}

[System.Serializable]
public class I18NTextData
{
public string Label;

[TextArea]
public string TextEN;

[TextArea]
public string TextFR;

[TextArea]
public string TextSG;

[TextArea]
public string TextES;

[TextArea]
public string TextDE;

[TextArea]
public string TextIT;
}

现在我在 Unity 编辑器中添加数据,一切正常。但是,一旦我对现有数据结构进行了更改,编辑器中的所有数据都会丢失。 ScriptableObject 似乎被重置为空状态。

这尤其令人讨厌,因为我们正处于开发阶段,并且在这个阶段数据结构的变化是不可避免的......

为了避免这种情况,你会怎么做?您是否有一些基于其他文件(例如 JSON)生成 ScriptableObjects 的脚本?还是在 Unity 中有一种简单的方法?

感谢您的任何提示!

最佳答案

如果要重命名序列化字段,但保留数据,Unity 有一个名为 FormerlySerializedAs 的属性。 ,它将保留旧的序列化字段名称。

[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/I18NData", order = 1)]
public class I18NData : ScriptableObject
{

[FormerlySerializedAs("Sprites")]
public I18NSpriteData[] Sprites2;
public I18NTextData[] Texts;
}

另一种选择是您可以将字段设为私有(private)并使用 SerializeField属性。然后,您可以随时间自由更改访问或修改字段的属性,而不会影响序列化:
[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/I18NData", order = 1)]
public class I18NData : ScriptableObject
{
[SerializeField]
private I18NSpriteData[] Sprites;
public I18NSpriteData[] Sprites2 {
get { return Sprites; }
set { Sprites = value; }
}

[SerializeField]
private I18NTextData[] Texts;
public I18NTextData[] Texts2 {
get { return Texts; }
set { Texts= value; }
}
}

您可能要考虑的另一件事是使用 ISerializationCallbackReceiver接口(interface)以更好地控制 Unity 的序列化过程。它提供了两个方法,OnBeforeSerialize 和 OnAfterDeserialize,在 Unity 的序列化和反序列化过程中调用。

在序列化 Unity 通常无法处理的复杂结构(如字典)时,这可能更有用,但根据您所做的更改类型,它可能会有所帮助。您可能会使用它在修订之间迁移数据。

关于c# - 如何避免 ScriptableObject 数据结构更改时的数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54543209/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com