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};
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 .