using System.IO; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using UnityEngine; namespace Jovian.ProjectSettings { /// /// Reads and writes settings to ProjectSettings/CustomLoggerSettings.json. /// Flat key-value store. Use prefixed keys by convention (e.g. "logger.myKey"). /// internal static class JovianProjectSettings { private const string FileName = "CustomLoggerSettings.json"; private static string FilePath { get { var fullName = Directory.GetParent(Application.dataPath)?.FullName; return Path.Combine(fullName ?? Application.dataPath, "ProjectSettings", FileName); } } internal static T Get(string packagePrefix, string setting, T defaultValue) { var root = LoadRoot(); var key = $"{packagePrefix}.{setting}"; if (root.TryGetValue(key, out var token)) { try { return token.ToObject(); } catch { return defaultValue; } } return defaultValue; } internal static void Set(string packagePrefix, string setting, T value) { var root = LoadRoot(); var key = $"{packagePrefix}.{setting}"; root[key] = value != null ? JToken.FromObject(value) : JValue.CreateNull(); SaveRoot(root); } private static JObject LoadRoot() { string path = FilePath; if (!File.Exists(path)) { return new JObject(); } try { string json = File.ReadAllText(path); return JObject.Parse(json); } catch { return new JObject(); } } private static void SaveRoot(JObject root) { string path = FilePath; string dir = Path.GetDirectoryName(path); if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) { Directory.CreateDirectory(dir); } string json = root.ToString(Formatting.Indented); File.WriteAllText(path, json); } } }