Я пытаюсь сериализовать предварительно нарисованную карту тайлов в файл 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": [
]
}
}
}
]
}