using System; using System.Collections.Generic; using TriLibCore.Utils; #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; namespace TriLibCore { /// /// Represents the TriLib project settings provider. /// You can override this behavior to store the settings in other places. /// public class TriLibSettings : ScriptableObject, ISerializationCallbackReceiver { private const int MaxSettings = 64; private Dictionary _boolPreferences; [SerializeField] [HideInInspector] private string[] _dictionaryBoolKeys = new string[MaxSettings]; [SerializeField] [HideInInspector] private bool[] _dictionaryBoolValues = new bool[MaxSettings]; [SerializeField] [HideInInspector] private int _settingsCount; private static TriLibSettings GetTriLibPreferences() { var preferencesFiles = Resources.LoadAll("TriLibSettings"); TriLibSettings triLibSettings; if (preferencesFiles.Length == 0) { #if UNITY_EDITOR var triLibDirectories = AssetDatabase.FindAssets("TriLibMainFolderPlaceholder"); var triLibDirectory = triLibDirectories.Length > 0 ? FileUtils.GetFileDirectory(AssetDatabase.GUIDToAssetPath(triLibDirectories[0])) : ""; triLibSettings = CreateInstance(); AssetDatabase.CreateAsset(triLibSettings, $"{triLibDirectory}/TriLibSettings.asset"); AssetDatabase.SaveAssets(); #else throw new Exception("Could not find TriLib preferences file."); #endif } else { if (preferencesFiles.Length > 1) { Debug.LogWarning("There is more than one TriLibSettings asset, and there is only one allowed per project."); } triLibSettings = preferencesFiles[0]; } return triLibSettings; } public Dictionary.Enumerator GetKvp() { return _boolPreferences.GetEnumerator(); } public static bool GetBool(string key) { var triLibPreferences = GetTriLibPreferences(); if (triLibPreferences._boolPreferences == null || !triLibPreferences._boolPreferences.TryGetValue(key, out var value)) { return false; } return value; } public static void SetBool(string key, bool value) { var triLibPreferences = GetTriLibPreferences(); if (triLibPreferences._boolPreferences == null) { triLibPreferences._boolPreferences = new Dictionary(); } triLibPreferences._boolPreferences[key] = value; #if UNITY_EDITOR if (Application.isPlaying) { Debug.LogWarning("Can't save TriLib settings while in play mode. Please refer to the Project Settings/TriLib area."); } EditorUtility.SetDirty(triLibPreferences); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); #endif } public void OnBeforeSerialize() { if (_boolPreferences == null) { return; } _settingsCount = 0; Array.Clear(_dictionaryBoolKeys, 0, MaxSettings); Array.Clear(_dictionaryBoolValues, 0, MaxSettings); foreach (var kvp in _boolPreferences) { _dictionaryBoolKeys[_settingsCount] = kvp.Key; _dictionaryBoolValues[_settingsCount] = kvp.Value; _settingsCount++; } } public void OnAfterDeserialize() { if (_boolPreferences == null) { _boolPreferences = new Dictionary(_settingsCount); } _boolPreferences.Clear(); for (var i = 0; i < _settingsCount; i++) { _boolPreferences.Add(_dictionaryBoolKeys[i], _dictionaryBoolValues[i]); } } } }