using System; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEngine; namespace UnityTest { public abstract class ProjectSettingsBase : ScriptableObject { private static readonly string k_SettingsPath = Path.Combine("UnityTestTools", "Common"); const string k_SettingsFolder = "Settings"; public virtual void Save() { EditorUtility.SetDirty(this); } public static T Load() where T : ProjectSettingsBase, new () { var pathsInProject = Directory.GetDirectories("Assets", "*", SearchOption.AllDirectories) .Where(s => s.Contains(k_SettingsPath)); if (pathsInProject.Count() == 0) Debug.LogError("Can't find settings path: " + k_SettingsPath); string pathInProject = Path.Combine(pathsInProject.First(), k_SettingsFolder); var assetPath = Path.Combine(pathInProject, typeof(T).Name) + ".asset"; var settings = AssetDatabase.LoadAssetAtPath(assetPath, typeof(T)) as T; if (settings != null) return settings; settings = CreateInstance(); Directory.CreateDirectory(pathInProject); AssetDatabase.CreateAsset(settings, assetPath); return settings; } } }