Unity_Utils/SaveSystem/SaveManager.cs
2021-07-31 22:24:34 -04:00

100 lines
2.9 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using Core;
using UnityEngine;
using UnityEngine.Events;
namespace SaveSystem
{
public class SaveManager : Singleton<SaveManager>
{
public static UnityAction<GameData> OnLoadCompleted;
private static readonly List<ISaveData> SaveDataList = new List<ISaveData>();
private GameData _saveGame;
private int _loadedGameNumber = -1;
protected override void Awake()
{
base.Awake();
_saveGame = new GameData();
}
private void Start() => Load();
public void Save(int saveNumber = 1)
{
foreach (ISaveData saveData in SaveDataList)
{
saveData.Save(ref _saveGame);
}
string json = JsonUtility.ToJson(_saveGame);
byte[] plainTextBytes = System.Text.Encoding.UTF8.GetBytes(json);
string b64 = Convert.ToBase64String(plainTextBytes);
using StreamWriter sw = new StreamWriter($"saveData{saveNumber:00}.sgd");
sw.Write(b64);
_loadedGameNumber = -1;
}
public void SaveExplicit()
{
foreach (ISaveData saveData in SaveDataList)
{
saveData.Save(ref _saveGame);
}
string json = JsonUtility.ToJson(_saveGame);
using StreamWriter sw = new StreamWriter($"saveData01.json");
sw.Write(json);
}
public void Load(int saveNumber = 1)
{
if (saveNumber != _loadedGameNumber)
{
try
{
using StreamReader sr = new StreamReader($"saveData{saveNumber:00}.sgd");
string b64 = sr.ReadToEnd();
byte[] plainTextBytes = Convert.FromBase64String(b64);
string json = System.Text.Encoding.UTF8.GetString(plainTextBytes);
_saveGame = JsonUtility.FromJson<GameData>(json);
}
catch (FileNotFoundException)
{
Debug.LogWarning($"Tried to load saveData{saveNumber:00}.sgd but file doesn't exist");
}
_loadedGameNumber = saveNumber;
}
foreach (ISaveData saveData in SaveDataList)
{
saveData.Load(ref _saveGame);
}
OnLoadCompleted?.Invoke(_saveGame);
}
public static void Register(ISaveData saveData)
{
if (!SaveDataList.Contains(saveData))
{
SaveDataList.Add(saveData);
}
}
public static void Unregister(ISaveData saveData)
{
SaveDataList.Remove(saveData);
}
protected override void OnDestroy()
{
base.OnDestroy();
Save();
}
}
}