Sistema de armazenamento / carregamento de dados

Olá pessoal!

Provavelmente, todos que começaram a jogar no Unity enfrentaram o dilema de como salvar o progresso do jogo. Hoje vou falar sobre o meu método. Ele não é novo, mas um homem bastante trabalhador.

Se estiver interessado, bem-vindo ao gato.

Quando pensei em como salvar dados, cheguei à conclusão de que seria conveniente serializar dados em JSON. Para não cercar outra bicicleta, decidi usar a popular biblioteca Json.NET - Newtonsoft. Além disso, ele pode salvar objetos e seus tipos.

No momento, a classe de acesso a dados é estática, o que significa que você pode acessá-la de qualquer lugar. Contras - você não pode fazer salvamentos separados.

Vamos analisar um pouco o código:

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

Como é impossível escrever:

 Dictionary<string, SaveItem<T>> 

Vamos envolver SaveItem em ISaveItem. Dessa forma, podemos criar um dicionário com diferentes tipos de dados.

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

Se você tentar serializar Vector2 ou Vector3 ou Color ou outros tipos de dados do mecanismo Unity, provavelmente obterá um erro de loop. Para evitar esse problema no Json.NET - Newtonsoft, existe uma solução para isso: a criação de conversores. Vamos analisar um deles.

Crie uma classe e herde do JsonConverter:

 public class Vector2Converter : JsonConverter 

Crie um construtor e um campo privado:

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

Após redefinir os métodos:

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

A coisa mais importante no método WriteJson . É aqui que os dados são salvos.

E agora como usar meu sistema de salvamento:

Para salvar os dados que escrevemos:

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

Para ler os dados que escrevemos:

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

Em teoria, estruturas de dados complexas podem ser facilmente armazenadas e isso deve funcionar. Vamos tentar salvar e ler o objeto mais complicado:

 [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); 

Como você pode ver, tudo funciona muito bem.

Você também pode editar o salvar, importar, exportar ou excluir.



O editor pode mostrar como tipos comuns (int, float, string, etc.). Então são mais complexos.





Matrizes pares:



Obrigado pela atenção. Link para o projeto no GitHub .

Source: https://habr.com/ru/post/pt471258/


All Articles