Сериализация 2D-массива с помощью JsonUtility - PullRequest
0 голосов
/ 25 октября 2019

поэтому я пытаюсь сохранить некоторые данные с помощью утилит Unity JSON, но у меня есть некоторые тройки.

У меня есть класс World, внутри которого есть некоторые параметры, такие как Width Height и т. Д., И двумерный массив "Tiles", что это другой класс

Сокращенная версия:

public class World
{
[SerializeField]
private Tile[,] tiles;
public Tile[,] Tiles { get { return tiles; } protected set { } }

[SerializeField]
private int width;
public int Width
{
    get { return width; }
}

[SerializeField]
private int height;
public int Height
{
    get { return height; }
}
public int WorldSize
{
    get
    {
        return height * width;
    }
}
}

И в другом сценарии у меня есть система сохранения, в настоящее время я пытаюсь спасти этот мир с его тайлами:

    public void SaveWorld(World worldToSave)
    {
    SaveSystem.Init();
    string json = JsonUtility.ToJson(worldToSave);
    Debug.Log("Json es: " + json);
    //AHORA MISMO ESTO GUARDA SOLO WIDTH Y HEIGHT DEL MUNDO
    File.WriteAllText(SaveSystem.SAVE_FOLDER + "/Save.txt", json);
    }

Плитки уже с Serializable, и если я создаю одномерный массив, я могу сохранить их и получить данные из них, но я не знаю, как сделать это с 2D или как я могу изменить его (его 2D, потому что я получаю их сКоординаты X и Y).

Кроме того, я действительно не понимаю, как JSON оборачивает эти тайлы внутри мира, и вещи внутри тайлов и т. Д.

1 Ответ

0 голосов
/ 25 октября 2019

Поскольку сериализатор Unity не поддерживает многомерный массив , вы можете сделать следующее:

  • преобразовать двумерный массив в массив 1D
  • сериализовать в JSON
  • десериализация из JSON
  • конвертирование 1D массива обратно в 2D массив

Пример:

namespace ConsoleApp2
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            // generate 2D array sample

            const int w = 3;
            const int h = 5;

            var i = 0;

            var source = new int[w, h];

            for (var y = 0; y < h; y++)
            for (var x = 0; x < w; x++)
                source[x, y] = i++;

            // convert to 1D array

            var j = 0;

            var target = new int[w * h];

            for (var y = 0; y < h; y++)
            for (var x = 0; x < w; x++)
                target[j++] = source[x, y];

            // convert back to 2D array

            var result = new int[w, h];

            for (var x = 0; x < w; x++)
            for (var y = 0; y < h; y++)
                result[x, y] = target[y * w + x];
        }
    }
}

Результат:

enter image description here enter image description here enter image description here

Обратите внимание, что вам потребуется разделить ширину и высоту вашего массива в JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...