大家好!
也许每个开始在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};
如您所见,一切正常。
您还可以编辑保存,导入,导出或删除。

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


偶数数组:

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