144 lines
4.8 KiB
C#
144 lines
4.8 KiB
C#
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).");
|
||
}
|
||
}
|