public virtual LevelEditorSaveData LoadLevel(string path)
        {
            loadLocation = path;
            LevelEditorSaveData data;

            if (!File.Exists(path))
            {
                Debug.LogError($"There's no file with path '{path}'.");
                return(new LevelEditorSaveData());
            }

            switch (levelFormat)
            {
            case FormatType.JSON:
                data = LevelEditorSerializer.DeserializeJson <LevelEditorSaveData>(File.ReadAllText(path));
                break;

            case FormatType.Binary:
                data = LevelEditorSerializer.DeserializeBinary <LevelEditorSaveData>(File.ReadAllBytes(path), compress);
                break;

            default:
                data = new LevelEditorSaveData();
                break;
            }

            return(LoadLevel(data));
        }
        public void CreateObjectsFromSaveData(LevelEditorSaveData data)
        {
            if (data.objects != null && data.objects.Count > 0)
            {
                ILevelEditorObject[] savedObjects = new ILevelEditorObject[data.objects.Count];

                for (int i = 0; i < data.objects.Count; i++)
                {
                    ILevelEditorObject obj = this.CreateObject(data.objects[i]);
                    savedObjects[i] = obj;
                }

                Assert.AreEqual(data.objects.Count, savedObjects.Length);

                for (int i = 0; i < savedObjects.Length; i++)
                {
                    LevelEditorComponentData[] components = data.objects[i].components;

                    if (savedObjects[i] == null)
                    {
                        continue;
                    }

                    savedObjects[i].ApplyExposedData(components);
                    OnCreatedObjectFromSaveData?.Invoke(this, new LevelEditorObjectEvent(savedObjects[i]));
                }
            }
        }
        public virtual void SaveLevel(LevelEditorSaveData saveData, string path)
        {
            string saveFolder = Path.GetDirectoryName(path);

            if (!Directory.Exists(saveFolder))
            {
                Directory.CreateDirectory(saveFolder);
            }

            LevelSavingLoadingArgs args = new LevelSavingLoadingArgs(saveData, path);

            OnLevelSaving?.Invoke(this, args);
            if (args.Cancel)
            {
                LevelEditorLogger.Log("LevelEditorSaveManager saving was canceled.");
                return;
            }

            saveData.customData = args.GetAllCustomData();

            switch (levelFormat)
            {
            case FormatType.JSON:
                string json = LevelEditorSerializer.SerializeJson(saveData);
                File.WriteAllText(path, json);
                break;

            case FormatType.Binary:
                byte[] bytes = LevelEditorSerializer.SerializeBinary(saveData, compress);
                File.WriteAllBytes(path, bytes);
                break;
            }

            OnLevelSaved?.Invoke(this, new LevelEventArgs(saveData));
        }
        public virtual LevelEditorSaveData GetLevelData(string levelName)
        {
            LevelEditorSaveData data = new LevelEditorSaveData(levelName);

            List <ILevelEditorObject> objects = realObjectManager.GetAllObjects();

            objects.Sort((x, y) => x.MyGameObject.transform.GetSiblingIndex().CompareTo(y.MyGameObject.transform.GetSiblingIndex()));
            for (int i = 0; i < objects.Count; i++)
            {
                data.objects.Add(new LevelEditorObjectData(objects[i]));
            }

            return(data);
        }
        public virtual LevelEditorSaveData LoadLevel(LevelEditorSaveData data)
        {
            LevelSavingLoadingArgs args = new LevelSavingLoadingArgs(data, loadLocation);

            loadLocation = null;
            OnLevelLoading?.Invoke(this, args);
            if (args.Cancel)
            {
                LevelEditorLogger.Log("LevelEditorSaveManager loading was canceled.");
                return(new LevelEditorSaveData(null));
            }

            realObjectManager.DeleteAllObjects();
            realObjectManager.CreateObjectsFromSaveData(data);

            OnLevelLoaded?.Invoke(this, new LevelEventArgs(data));

            return(data);
        }
        public virtual LevelEditorSaveData LoadLevelFromJson(string json)
        {
            LevelEditorSaveData data = LevelEditorSerializer.DeserializeJson <LevelEditorSaveData>(json);

            return(LoadLevel(data));
        }
        public virtual LevelEditorSaveData LoadLevelFromBytes(byte[] levelBytes)
        {
            LevelEditorSaveData data = LevelEditorSerializer.DeserializeBinary <LevelEditorSaveData>(levelBytes, compress);

            return(LoadLevel(data));
        }
 public virtual void SaveLevel(LevelEditorSaveData saveData)
 {
     SaveLevel(saveData, BuildSavePath(baseSaveLocation, saveSuffix, saveData.name, fileExtension));
 }
        public virtual void SaveLevel(string levelName)
        {
            LevelEditorSaveData data = GetLevelData(levelName);

            SaveLevel(data, BuildSavePath(baseSaveLocation, saveSuffix, levelName, fileExtension));
        }
 public LevelSavingLoadingArgs(LevelEditorSaveData data, string location) : base(data)
 {
     Location = location;
 }
 public LevelEventArgs(LevelEditorSaveData data)
 {
     Data       = data;
     customData = data.customData;
 }