From 704154f11fe1518b88340e8dfbfa0840025f077b Mon Sep 17 00:00:00 2001 From: Danylo Lytvynenko Date: Thu, 4 Mar 2021 14:49:35 +0200 Subject: [PATCH 1/3] feat: LocalProjectSettingsSingleton --- .../Runtime/Config/PackagesConfig.cs | 5 + .../PackageSettings/LocalProjectSettings.cs | 41 +++++++ .../LocalProjectSettings.cs.meta | 3 + .../LocalProjectSettingsSingleton.cs | 109 ++++++++++++++++++ .../LocalProjectSettingsSingleton.cs.meta | 3 + 5 files changed, 161 insertions(+) create mode 100644 com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettings.cs create mode 100644 com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettings.cs.meta create mode 100644 com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettingsSingleton.cs create mode 100644 com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettingsSingleton.cs.meta diff --git a/com.stansassets.plugins-dev-kit/Runtime/Config/PackagesConfig.cs b/com.stansassets.plugins-dev-kit/Runtime/Config/PackagesConfig.cs index d5f0dab..be2f0bf 100644 --- a/com.stansassets.plugins-dev-kit/Runtime/Config/PackagesConfig.cs +++ b/com.stansassets.plugins-dev-kit/Runtime/Config/PackagesConfig.cs @@ -9,5 +9,10 @@ public static class PackagesConfig /// Package runtime settings location path. /// public const string SettingsPath = "Assets/Plugins/StansAssets/Settings"; + + /// + /// Package runtime settings location path. + /// + public const string LibraryPath = "Library/StansAssets"; } } diff --git a/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettings.cs b/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettings.cs new file mode 100644 index 0000000..2ab48c7 --- /dev/null +++ b/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettings.cs @@ -0,0 +1,41 @@ +using System; +using UnityEngine; + +namespace StansAssets.Plugins +{ + [Serializable] + public class LocalProjectSettings + { + public LocalProjectSettings() + { + SettingsFileName = GetType().Name; + PackageName = "newPackage"; + } + + public LocalProjectSettings(string packageName, string settingsFileName) + { + SettingsFileName = settingsFileName; + PackageName = packageName; + } + + /// + /// Plugin package name. + /// + public string PackageName { get; } + + /// + /// Plugin settings folder path. + /// + public string SettingsFolderPath => $"{Application.dataPath}/{PackagesConfig.LibraryPath}/{PackageName}"; + + /// + /// Plugin settings file path. + /// + public string SettingsFilePath => $"{SettingsFolderPath}/{SettingsFileName}.json"; + + /// + /// Settings file name. + /// + public string SettingsFileName { get; } + } +} \ No newline at end of file diff --git a/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettings.cs.meta b/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettings.cs.meta new file mode 100644 index 0000000..76cf654 --- /dev/null +++ b/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettings.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d4a0268991794378bbd76db3ebffcef6 +timeCreated: 1614852471 \ No newline at end of file diff --git a/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettingsSingleton.cs b/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettingsSingleton.cs new file mode 100644 index 0000000..41d5a54 --- /dev/null +++ b/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettingsSingleton.cs @@ -0,0 +1,109 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using UnityEngine; + +namespace StansAssets.Plugins +{ + public abstract class LocalProjectSettingsSingleton : LocalProjectSettings where T : LocalProjectSettings, new() + { + static T s_Instance; + + /// + /// Returns a singleton class instance + /// If current instance is not assigned it will try to find an object of the instance type, + /// in case instance already exists in a project. If not, new instance will be created, + /// and saved under a location + /// + public static T Instance + { + get + { + if (s_Instance == null) + { + var inst = new T(); + s_Instance = InitFromCache(inst); + + if (s_Instance == null) + { + s_Instance = inst; + Save(inst); + } + } + + return s_Instance; + } + } + + /// + /// Saves instance to an editor database. + /// Only applicable while in the editor. + /// + public static void Save() + { + // Only applicable while in the editor. +#if UNITY_EDITOR + Save(Instance); +#endif + } + + /// + /// // Only applicable while in the editor. + /// + static void Save(T asset) + { + // Only applicable while in the editor. +#if UNITY_EDITOR + var path = Path.Combine(asset.SettingsFilePath); + var directory = Path.GetDirectoryName(path); + + if (directory == null) + throw new InvalidOperationException($"Failed to get directory from package settings path: {path}"); + + if (!Directory.Exists(directory)) + Directory.CreateDirectory(directory); + + CacheDocument(asset); +#endif + } + + static T InitFromCache(T asset) + { + if (File.Exists(asset.SettingsFilePath)) + { + StreamReader reader = null; + try + { + reader = new StreamReader(asset.SettingsFilePath); + var text = reader.ReadToEnd(); + return JsonUtility.FromJson(text); + } + finally + { + reader?.Close(); + } + } + + return null; + } + + static Task CacheDocument(T asset) + { + var path = asset.SettingsFilePath; + return Task.Run(() => { + try + { + File.WriteAllText(path, JsonUtility.ToJson(asset)); + } + catch (Exception e) + { + Debug.LogException(e); + } + finally + { + Debug.Log($"Personal project settings saved: {path}"); + } + }); + } + } +} \ No newline at end of file diff --git a/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettingsSingleton.cs.meta b/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettingsSingleton.cs.meta new file mode 100644 index 0000000..1182811 --- /dev/null +++ b/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettingsSingleton.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 627a9eeb89564029baf67e75595a948a +timeCreated: 1614852434 \ No newline at end of file From 5c32cd6ba72c89fbc8e3284113238a087e949233 Mon Sep 17 00:00:00 2001 From: Danylo Lytvynenko Date: Thu, 4 Mar 2021 14:54:44 +0200 Subject: [PATCH 2/3] fix: LocalProjectSettings constructor --- .../Runtime/PackageSettings/LocalProjectSettings.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettings.cs b/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettings.cs index 2ab48c7..24cd248 100644 --- a/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettings.cs +++ b/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettings.cs @@ -8,14 +8,14 @@ public class LocalProjectSettings { public LocalProjectSettings() { - SettingsFileName = GetType().Name; PackageName = "newPackage"; + SettingsFileName = GetType().Name; } - public LocalProjectSettings(string packageName, string settingsFileName) + public LocalProjectSettings(string packageName, string settingsFileName = null) { - SettingsFileName = settingsFileName; PackageName = packageName; + SettingsFileName = settingsFileName == null ? settingsFileName : GetType().Name; } /// From bd0590e32ab8dd13e5fe3e3a235f246af2b721d3 Mon Sep 17 00:00:00 2001 From: Danylo Lytvynenko Date: Tue, 9 Mar 2021 10:56:48 +0200 Subject: [PATCH 3/3] chore: fix summary --- .../Runtime/Config/PackagesConfig.cs | 2 +- .../PackageSettings/LocalProjectSettingsSingleton.cs | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/com.stansassets.plugins-dev-kit/Runtime/Config/PackagesConfig.cs b/com.stansassets.plugins-dev-kit/Runtime/Config/PackagesConfig.cs index be2f0bf..24342a9 100644 --- a/com.stansassets.plugins-dev-kit/Runtime/Config/PackagesConfig.cs +++ b/com.stansassets.plugins-dev-kit/Runtime/Config/PackagesConfig.cs @@ -11,7 +11,7 @@ public static class PackagesConfig public const string SettingsPath = "Assets/Plugins/StansAssets/Settings"; /// - /// Package runtime settings location path. + /// Library settings folder path. /// public const string LibraryPath = "Library/StansAssets"; } diff --git a/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettingsSingleton.cs b/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettingsSingleton.cs index 41d5a54..439239b 100644 --- a/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettingsSingleton.cs +++ b/com.stansassets.plugins-dev-kit/Runtime/PackageSettings/LocalProjectSettingsSingleton.cs @@ -54,7 +54,7 @@ static void Save(T asset) { // Only applicable while in the editor. #if UNITY_EDITOR - var path = Path.Combine(asset.SettingsFilePath); + var path = asset.SettingsFilePath; var directory = Path.GetDirectoryName(path); if (directory == null) @@ -69,12 +69,13 @@ static void Save(T asset) static T InitFromCache(T asset) { - if (File.Exists(asset.SettingsFilePath)) + var path = asset.SettingsFilePath; + if (File.Exists(path)) { StreamReader reader = null; try { - reader = new StreamReader(asset.SettingsFilePath); + reader = new StreamReader(path); var text = reader.ReadToEnd(); return JsonUtility.FromJson(text); }