public static MapInfos Deserialize(MapInfosSerializable serializedData, DatabasePreset materialsPreset, List <Player> player, List <Enemy> enemies)
    {
        MapInfos mapInfos = new MapInfos();

        string path = "MapData/" + serializedData.MapDataType.ToString();

        mapInfos.MapData = Resources.Load <ScriptableObject>(path) as MapData;

        mapInfos.Size   = new Vector2(serializedData.SizeX, serializedData.SizeY);
        mapInfos.Layout = serializedData.Layout;

        if (serializedData.Map != null)
        {
            Dictionary <string, Material> materials         = new Dictionary <string, Material>();
            Dictionary <string, string>   materialsDatabase = DataSerialization.ReadDatabasePathByName(materialsPreset);

            foreach (string name in serializedData.Materials)
            {
                if (materialsDatabase.ContainsKey(name))
                {
                    materials.Add(name, Resources.Load <Material>(materialsDatabase[name]));
                }
                else
                {
                    Debug.Log("Material " + name + " not found in DB");
                }
            }

            Cell[,] newMap = new Cell[serializedData.SizeX, serializedData.SizeY];
            for (int x = 0; x < serializedData.SizeX; x++)
            {
                for (int y = 0; y < serializedData.SizeY; y++)
                {
                    newMap[x, y] = new Cell();

                    if (serializedData.Map[x, y].UnitId != -1)
                    {
                        newMap[x, y].IsTaken = GetUnitById(serializedData.Map[x, y].UnitId, player, enemies);
                    }

                    newMap[x, y].IsWalkable = serializedData.Map[x, y].IsWalkable;
                    newMap[x, y].X          = serializedData.Map[x, y].X;
                    newMap[x, y].Y          = serializedData.Map[x, y].Y;
                    newMap[x, y].Z          = serializedData.Map[x, y].Z;
                    newMap[x, y].RealY      = serializedData.Map[x, y].RealY;

                    if (serializedData.Map[x, y].MaterialName != null &&
                        serializedData.Map[x, y].MaterialName != "")
                    {
                        if (materials.ContainsKey(serializedData.Map[x, y].MaterialName))
                        {
                            newMap[x, y].Material = materials[serializedData.Map[x, y].MaterialName];
                        }
                        else
                        {
                            Debug.Log("Deserialization error, material " + serializedData.Map[x, y].MaterialName + " not found");
                        }
                    }

                    if (serializedData.Map[x, y].FillerName != null &&
                        serializedData.Map[x, y].FillerName != "")
                    {
                        if (materials.ContainsKey(serializedData.Map[x, y].FillerName))
                        {
                            newMap[x, y].Filler = materials[serializedData.Map[x, y].FillerName];
                        }
                        else
                        {
                            Debug.Log("Deserialization error, material " + serializedData.Map[x, y].FillerName + " not found");
                        }
                    }
                }
            }
            mapInfos.Map = newMap;
        }
        else
        {
            mapInfos.Map = null;
        }

        return(mapInfos);
    }