using System.Collections.Generic; using UnityEngine; [ExecuteInEditMode] public class SaveableObjectsOnSceneManager : MonoBehaviour { public List SaveableObjects; public List SaveableDoors; private static SaveableObjectsOnSceneManager _instance; public static SaveableObjectsOnSceneManager GetInstance() { return _instance; } private void Awake() { if (_instance != null && _instance != this) { Destroy(gameObject); return; } _instance = this; } public void SaveSceneData(GameSaveData saveData) { if (saveData == null) { saveData = new GameSaveData(); } if (saveData.sceneSaveData == null) { saveData.sceneSaveData = new SceneSaveData(); } #region Objects State if (saveData.sceneSaveData.ObjectsData == null) { saveData.sceneSaveData.ObjectsData = new List(); } foreach (var saveableObject in SaveableObjects) { // Έλεγχος αν το αντικείμενο υπάρχει ήδη στη λίστα var existingObject = saveData.sceneSaveData.ObjectsData.Find( data => data.GameObjectID == saveableObject.GameObjectID ); if (existingObject != null) { // Αν υπάρχει ήδη, αντικαθιστούμε την τιμή existingObject.IsSetActive = saveableObject.IsSetActiveTrueAfterLoad; } else { // Αν δεν υπάρχει, το προσθέτουμε ως νέο SaveableObjectData data = new SaveableObjectData { GameObjectID = saveableObject.GameObjectID, IsSetActive = saveableObject.IsSetActiveTrueAfterLoad }; saveData.sceneSaveData.ObjectsData.Add(data); } print("SaveableObjectsSaved"); } #endregion #region Doors if (saveData.sceneSaveData.DoorsData == null) { saveData.sceneSaveData.DoorsData = new List(); } foreach (var saveableDoor in SaveableDoors) { // Έλεγχος αν το αντικείμενο υπάρχει ήδη στη λίστα var existingObject = saveData.sceneSaveData.DoorsData.Find( data => data.SaveableDoorID == saveableDoor.SaveableDoorID ); if (existingObject != null) { // Αν υπάρχει ήδη, αντικαθιστούμε την τιμή existingObject.IsLockedAfterLoad = saveableDoor.IsLockedAfterLoad; } else { // Αν δεν υπάρχει, το προσθέτουμε ως νέο SaveableDoorData data = new SaveableDoorData { SaveableDoorID = saveableDoor.SaveableDoorID, IsLockedAfterLoad = saveableDoor.IsLockedAfterLoad }; saveData.sceneSaveData.DoorsData.Add(data); } print("SaveableDoorsSaved"); } #endregion } private void OnValidate() { PopulateSaveableObjects(); PopulateSaveableDoors(); } private void PopulateSaveableObjects() { SaveableObjects = new List(); // Find all objects of type SaveableObject, including inactive ones SaveableObject[] allSaveableObjects = Resources.FindObjectsOfTypeAll(); foreach (SaveableObject saveable in allSaveableObjects) { // Ensure the object is part of the current scene and not from a prefab if (saveable.gameObject.scene.IsValid() && !string.IsNullOrEmpty(saveable.gameObject.scene.name)) { SaveableObjects.Add(saveable); } } Debug.Log($"Found {SaveableObjects.Count} SaveableObjects in the scene (including inactive ones)."); } private void PopulateSaveableDoors() { SaveableDoors = new List(); // Find all objects of type SaveableObject, including inactive ones SaveableDoor[] allSaveableDoors = Resources.FindObjectsOfTypeAll(); foreach (SaveableDoor saveable in allSaveableDoors) { // Ensure the object is part of the current scene and not from a prefab if (saveable.gameObject.scene.IsValid() && !string.IsNullOrEmpty(saveable.gameObject.scene.name)) { SaveableDoors.Add(saveable); } } Debug.Log($"Found {SaveableObjects.Count} SaveableObjects in the scene (including inactive ones)."); } }