Files
HauntedBloodlines/Assets/Scripts/SaveLoad/SaveableObjectsOnSceneManager.cs
2025-05-29 22:31:40 +03:00

144 lines
4.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class SaveableObjectsOnSceneManager : MonoBehaviour
{
public List<SaveableObject> SaveableObjects;
public List<SaveableDoor> 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<SaveableObjectData>();
}
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<SaveableDoorData>();
}
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<SaveableObject>();
// Find all objects of type SaveableObject, including inactive ones
SaveableObject[] allSaveableObjects = Resources.FindObjectsOfTypeAll<SaveableObject>();
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<SaveableDoor>();
// Find all objects of type SaveableObject, including inactive ones
SaveableDoor[] allSaveableDoors = Resources.FindObjectsOfTypeAll<SaveableDoor>();
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).");
}
}