Degulleo3D/Assets/KJM/KJM_Test/SaveDataController.cs
99jamin a3328c7724 DEG-24 [Refactor] 세이브 데이터 적용 및 불러오기 개선
SaveDataController가 각 필드의 데이터를 모으고, 적용한다.
2025-04-24 14:30:00 +09:00

80 lines
2.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using UnityEngine;
public class SaveDataController : MonoBehaviour
{
[SerializeField] private ISaveable[] saveables;
private Save tmpSave;
void Awake()
{
tmpSave = new Save();
if (saveables == null || saveables.Length == 0)
saveables = FindObjectsOfType<MonoBehaviour>().OfType<ISaveable>().ToArray();
}
//세이브를 현재 상태에 적용
public void ApplySaveData(Save saveData)
{
GetSaveDataFromManager(saveData);
SendSaveDataToClass();
}
//현재 상태를 세이브에 적용
public Save GetSaveData()
{
UpdateSaveData();
return tmpSave;
}
//로컬에서 로드한 세이브 데이터를 받아오는 함수.
private void GetSaveDataFromManager(Save saveData)
{
tmpSave = saveData;
}
//세이브 데이터를 각클래스에게 적용하는 함수.
private void SendSaveDataToClass()
{
foreach (var s in saveables)
{
s.ApplySaveData(tmpSave);
}
}
//각 클래스에게서 현재 정보를 받아오는 함수.
private void UpdateSaveData()
{
foreach (var s in saveables)
{
Save partial = s.ExtractSaveData();
MergeSave(ref tmpSave, partial);
}
}
private void MergeSave(ref Save baseSave, Save newSave)
{
if (newSave == null) return;
if (newSave.dungeonSave != null)
{
if (baseSave.dungeonSave == null)
baseSave.dungeonSave = new DungeonSave();
baseSave.dungeonSave.MergeWith(newSave.dungeonSave);
}
if (newSave.homeSave != null)
{
if (baseSave.homeSave == null)
baseSave.homeSave = new HomeSave();
baseSave.homeSave.MergeWith(newSave.homeSave);
}
}
}