数据存储/加载系统

大家好!

也许每个开始在Unity上进行游戏的人都面临着如何保存游戏进度的难题。 今天我将告诉您我的方法。 他不是新手,而是一个工人。

如果有兴趣,欢迎来猫。

当我考虑如何保存数据时,我得出的结论是,以JSON序列化数据对我来说很方便。 为了不妨碍其他自行车,我决定使用流行的Json.NET库-Newtonsoft。 而且,它可以保存对象及其类型。

目前,数据访问类是静态的,这意味着您可以从任何地方访问它。 缺点-您无法单独保存。

让我们分析一下代码:

public abstract class ISaveItem { public string Key { get; set; } } 

由于不可能写:

 Dictionary<string, SaveItem<T>> 

我们将把SaveItem包装在ISaveItem中。 这样,我们可以创建具有不同类型数据的字典。

 public class SaveItem<T> : ISaveItem { public T item; } private static Dictionary<string, ISaveItem> items; 

如果您尝试序列化Vector2或Vector3或Color或Unity引擎的其他数据类型,则很可能会出现循环错误。 为了避免在Json.NET-Newtonsoft中出现此问题,有一个解决方案:创建转换器。 让我们分析其中之一。

创建一个类并从JsonConverter继承:

 public class Vector2Converter : JsonConverter 

创建一个构造函数和私有字段:

 private readonly Type type; public Vector2Converter(Type type) { this.type = type; } 

重新定义方法后:

 public override bool CanConvert(Type objectType) { return type == objectType; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return null; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value.GetType() == type) { var vector = (Vector2)value; writer.WriteStartObject(); writer.WritePropertyName("X"); writer.WriteValue(vector.x); writer.WritePropertyName("Y"); writer.WriteValue(vector.y); writer.WriteEndObject(); } } 

WriteJson方法中最重要的事情。 这是保存数据的地方。

现在如何使用我的保存系统:

为了保存数据,我们编写:

 int myInt = 33; SaveSystem.Set("MyInt", myInt); 

要读取我们编写的数据:

 var myInt = SaveSystem.Get<int>("MyInt"); 

从理论上讲,复杂的数据结构可以轻松存储,并且应该可以正常工作。 让我们尝试保存和读取更复杂的对象:

 [System.Serializable] public class Test { public string Name; public float FloatParam; } Test test = new Test() {Name = "TestValue1", FloatParam = 0.1f}; // SaveSystem.Set("MyTestClass", test); // var saveTest = SaveSystem.Get<Test>("MyTestClass"); Debug.Log(saveTest.Name); Debug.Log(saveTest.FloatParam); 

如您所见,一切正常。

您还可以编辑保存,导入,导出或删除。



编辑器可以显示为普通类型(int,float,string等)。 所以比较复杂。





偶数数组:



谢谢您的关注。 链接到GitHub上的项目。

Source: https://habr.com/ru/post/zh-CN471258/


All Articles