Сериализация тайла карты - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь сериализовать предварительно нарисованную карту тайлов в файл Json, но, похоже, не удается сохранить некоторые данные.

Пробовал через список, массив и утилиты, подобные EasySave - не повезло

using UnityEngine;
using UnityEngine.Tilemaps;

public class WorldTile
{
    public Vector3Int LocalPlace { get; set; }

    public Vector3 WorldLocation { get; set; }

    public TileBase TileBase { get; set; }

    public Tilemap TilemapMember { get; set; }

    public string Name { get; set; }
}

---

using Sirenix.OdinInspector;
using Sirenix.Serialization;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Tilemaps;

public class SaveLoadTiles : SerializedMonoBehaviour
{
    public Tilemap Tilemap;
    public Dictionary<Vector3, WorldTile> tiles;
    public Dictionary<Vector3, WorldTile> tiles2;

    [Button]
    private void GetWorldTiles()
    {
        tiles = new Dictionary<Vector3, WorldTile>();

        foreach (Vector3Int pos in Tilemap.cellBounds.allPositionsWithin)
        {
            var localPlace = new Vector3Int(pos.x, pos.y, pos.z);

            if (!Tilemap.HasTile(localPlace)) continue;

            var tile = new WorldTile
            {
                LocalPlace = localPlace,
                WorldLocation = Tilemap.CellToWorld(localPlace),
                TileBase = Tilemap.GetTile(localPlace),
                TilemapMember = Tilemap,
                Name = localPlace.x + "," + localPlace.y,
            };

            tiles.Add(tile.WorldLocation, tile);
        }

        string path = Application.dataPath + "/data.json";
        DataFormat dataFormat = DataFormat.JSON;
        var bytes = SerializationUtility.SerializeValue(tiles, dataFormat);
        File.WriteAllBytes(path, bytes);

        //tiles = new Dictionary<Vector3, WorldTile>();
    }

    [Button]
    private void SetWorldTiles()
    {
        DataFormat dataFormat = DataFormat.JSON;
        string path = Application.dataPath + "/data.json";
        var bytes = File.ReadAllBytes(path);
        tiles2 = SerializationUtility.DeserializeValue<Dictionary<Vector3, WorldTile>>(bytes, dataFormat);

        foreach (var t in tiles2)
        {
            Tilemap.SetTile(new Vector3Int((int)t.Key.x, (int)t.Key.z, 0), t.Value.TileBase);
        }
    }
}

Отлично работает без записи на диск.

То есть, если я просто сохраняю плитки в словарь - удаляю их и загружаю их из того же словаря - работает отлично.

Но выглядитнекоторая информация теряется после десериализации.

Словари и тайлы и тайлы2 работают нормально, но данные тайлов не загружаются на экран.

Tiles Json
{
    "$id": 0,
    "$type": "0|System.Collections.Generic.Dictionary`2[[UnityEngine.Vector3, UnityEngine.CoreModule],[WorldTile, Assembly-CSharp]], mscorlib",
    "comparer": {
        "$id": 1,
        "$type": "1|System.Collections.Generic.GenericEqualityComparer`1[[UnityEngine.Vector3, UnityEngine.CoreModule]], mscorlib"
    },
    "$rlength": 2,
    "$rcontent": [
        {
            "$k": {
                "$type": "2|UnityEngine.Vector3, UnityEngine.CoreModule",
                103,
                -1.52587891E-05,
                99.0000153
            },
            "$v": $eref:0
        },
        {
            "$k": {
                "$type": 2,
                104,
                -1.52587891E-05,
                99.0000153
            },
            "$v": $eref:1
        }
    ]
}

Список ссылок GameObject Json

{
    "$id": 0,
    "$type": "0|System.Collections.Generic.List`1[[UnityEngine.Object, UnityEngine.CoreModule]], mscorlib",
    "$rlength": 2,
    "$rcontent": [
        {
            "$id": 1,
            "$type": "1|WorldTile, Assembly-CSharp",
            "serializationData": {
                "$type": "2|Sirenix.Serialization.SerializationData, Sirenix.Serialization",
                "SerializedFormat": 2,
                "SerializedBytes": null,
                "ReferencedUnityObjects": {
                    "$id": 2,
                    "$type": 0,
                    "$rlength": 0,
                    "$rcontent": [
                    ]
                },
                "SerializedBytesString": null,
                "Prefab": null,
                "PrefabModificationsReferencedUnityObjects": null,
                "PrefabModifications": null,
                "SerializationNodes": {
                    "$id": 3,
                    "$type": "3|System.Collections.Generic.List`1[[Sirenix.Serialization.SerializationNode, Sirenix.Serialization]], mscorlib",
                    "$rlength": 0,
                    "$rcontent": [
                    ]
                }
            }
        },
        {
            "$id": 4,
            "$type": 1,
            "serializationData": {
                "$type": 2,
                "SerializedFormat": 2,
                "SerializedBytes": null,
                "ReferencedUnityObjects": {
                    "$id": 5,
                    "$type": 0,
                    "$rlength": 0,
                    "$rcontent": [
                    ]
                },
                "SerializedBytesString": null,
                "Prefab": null,
                "PrefabModificationsReferencedUnityObjects": null,
                "PrefabModifications": null,
                "SerializationNodes": {
                    "$id": 6,
                    "$type": 3,
                    "$rlength": 0,
                    "$rcontent": [
                    ]
                }
            }
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...