168 lines
5.4 KiB
C#
168 lines
5.4 KiB
C#
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
|
|
public class SettingsManager : MonoBehaviour
|
|
{
|
|
public static SettingsManager instance;
|
|
private static string SETTINGS_FILE_PATH => Path.Combine(Application.persistentDataPath, "GameSettings.json");
|
|
|
|
public static SettingsContainer Container;
|
|
|
|
public static UnityEvent OnSettingsChanged;
|
|
|
|
public static void Initialize() //добавить инициализацию в менеджера в парвильное место в порядке
|
|
{
|
|
OnSettingsChanged = new UnityEvent();
|
|
Container = LoadContainerAuto();
|
|
OnSettingsChanged?.Invoke();
|
|
}
|
|
|
|
public static void ChangeSetting(Setting setting, int direction)
|
|
{
|
|
bool changed = setting.ChangeValue(direction);
|
|
if (changed)
|
|
{
|
|
SaveContainerToFile();
|
|
OnSettingsChanged?.Invoke();
|
|
}
|
|
}
|
|
|
|
//Геттеры возможно будут статикой
|
|
public static bool GetBool(string id, bool _default)
|
|
{
|
|
var setting = Container.TryGetSetting(id);
|
|
|
|
if (setting != null)
|
|
{
|
|
if (setting.Type != Setting.SettingType.Bool) Debug.LogWarning($"Тип настройки {id} не соответсвует bool");
|
|
return setting.BoolValue;
|
|
}
|
|
else
|
|
{
|
|
return _default;
|
|
}
|
|
}
|
|
|
|
public static int GetInt(string id, int _default)
|
|
{
|
|
var setting = Container.TryGetSetting(id);
|
|
|
|
if (setting != null)
|
|
{
|
|
if (setting.Type != Setting.SettingType.Int) Debug.LogWarning($"Тип настройки {id} не соответсвует int");
|
|
return setting.IntValue;
|
|
}
|
|
else
|
|
{
|
|
return _default;
|
|
}
|
|
}
|
|
|
|
public static float GetFloat(string id, float _default)
|
|
{
|
|
var setting = Container.TryGetSetting(id);
|
|
|
|
if (setting != null)
|
|
{
|
|
if (setting.Type != Setting.SettingType.Float) Debug.LogWarning($"Тип настройки {id} не соответсвует float");
|
|
return setting.FloatValue;
|
|
}
|
|
else
|
|
{
|
|
return _default;
|
|
}
|
|
}
|
|
|
|
public static string GetString(string id, string _default)
|
|
{
|
|
var setting = Container.TryGetSetting(id);
|
|
|
|
if (setting != null)
|
|
{
|
|
if (setting.Type != Setting.SettingType.String) Debug.LogWarning($"Тип настройки {id} не соответсвует string");
|
|
return setting.StringValue;
|
|
}
|
|
else
|
|
{
|
|
return _default;
|
|
}
|
|
}
|
|
|
|
private static string GetSettingsHash(List<Setting> settings)
|
|
{
|
|
StringBuilder sb = new();
|
|
foreach (Setting setting in settings)
|
|
{
|
|
sb.Append(setting.Id);
|
|
sb.Append(setting.Alias);
|
|
//sb.Append(setting.Group);
|
|
sb.Append(setting.Type);
|
|
}
|
|
|
|
byte[] inputBytes = Encoding.UTF8.GetBytes(sb.ToString());
|
|
using MD5 md5 = MD5.Create();
|
|
byte[] hashBytes = md5.ComputeHash(inputBytes);
|
|
|
|
return Encoding.UTF8.GetString(hashBytes);
|
|
}
|
|
|
|
public static void SaveContainerToFile()
|
|
{
|
|
SettingDataWrapper dataWrapper = new SettingDataWrapper(Container.Settings);
|
|
string json = JsonUtility.ToJson(dataWrapper);
|
|
string jsonEnc = CryptoUtil.EncryptJson(json, "RR_SeTtInGs");
|
|
File.WriteAllText(SETTINGS_FILE_PATH, jsonEnc);
|
|
}
|
|
private static void SaveContainerToFile(SettingsContainer container)
|
|
{
|
|
SettingDataWrapper dataWrapper = new SettingDataWrapper(container.Settings);
|
|
string json = JsonUtility.ToJson(dataWrapper, true);
|
|
string jsonEnc = CryptoUtil.EncryptJson(json, "RR_SeTtInGs");
|
|
File.WriteAllText(SETTINGS_FILE_PATH, jsonEnc);
|
|
}
|
|
//private static SettingsContainer GetContainerFromDefault()
|
|
//{
|
|
// SettingsContainer container = new SettingsContainer(GetDefaultSettings());
|
|
// SaveContainerToFile(container);
|
|
// return container;
|
|
//}
|
|
private static SettingsContainer GetContainerFromFile()
|
|
{
|
|
string jsonEnc = File.ReadAllText(SETTINGS_FILE_PATH);
|
|
string json = CryptoUtil.DecryptJson(jsonEnc, "RR_SeTtInGs");
|
|
SettingDataWrapper dataWrapper = JsonUtility.FromJson<SettingDataWrapper>(json);
|
|
SettingsContainer container = new SettingsContainer(dataWrapper);
|
|
return container;
|
|
}
|
|
private static SettingsContainer LoadContainerAuto()
|
|
{
|
|
bool shouldLoadDefault = !SettingsFileExists() || !IsSavedSettingsValid();
|
|
|
|
//return shouldLoadDefault ? GetContainerFromDefault() : GetContainerFromFile();
|
|
return GetContainerFromFile();
|
|
}
|
|
|
|
private static bool SettingsFileExists()
|
|
{
|
|
if (!File.Exists(SETTINGS_FILE_PATH))
|
|
{
|
|
Debug.LogWarning($"Файл не найден по пути: {SETTINGS_FILE_PATH}");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
private static bool IsSavedSettingsValid()
|
|
{
|
|
string savedHash = GetSettingsHash(GetContainerFromFile().Settings);
|
|
//string defaultHash = GetSettingsHash(GetDefaultSettings());
|
|
string defaultHash = "asd";
|
|
|
|
bool valid = string.Equals(savedHash, defaultHash);
|
|
return valid;
|
|
}
|
|
|
|
} |