mirror of
https://github.com/ConjureETS/Unity_Utils.git
synced 2026-03-24 13:00:58 +00:00
100 lines
2.9 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|