using System; using System.Collections; using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading; using UnityEngine; namespace UnityEditor.AdaptivePerformance.Editor { internal static class EditorUtilities { internal static readonly string[] s_DefaultGeneralSettingsPath = {"Adaptive Performance"}; internal static readonly string[] s_DefaultLoaderPath = {"Adaptive Performance", "Provider"}; internal static readonly string[] s_DefaultSettingsPath = {"Adaptive Performance", "Settings"}; internal static bool AssetDatabaseHasInstanceOfType(string type) { var assets = AssetDatabase.FindAssets(String.Format("t:{0}", type)); return assets.Any(); } internal static T GetInstanceOfTypeFromAssetDatabase() where T : class { var assets = AssetDatabase.FindAssets(String.Format("t:{0}", typeof(T).Name)); if (assets.Any()) { string assetPath = AssetDatabase.GUIDToAssetPath(assets[0]); var asset = AssetDatabase.LoadAssetAtPath(assetPath, typeof(T)); return asset as T; } return null; } internal static ScriptableObject GetInstanceOfTypeWithNameFromAssetDatabase(string typeName) { var assets = AssetDatabase.FindAssets(String.Format("t:{0}", typeName)); if (assets.Any()) { string assetPath = AssetDatabase.GUIDToAssetPath(assets[0]); var asset = AssetDatabase.LoadAssetAtPath(assetPath, typeof(ScriptableObject)); return asset as ScriptableObject; } return null; } internal static string GetAssetPathForComponents(string[] pathComponents, string root = "Assets") { if (pathComponents.Length <= 0) return null; string path = root; foreach (var pc in pathComponents) { string subFolder = Path.Combine(path, pc); bool shouldCreate = true; foreach (var f in AssetDatabase.GetSubFolders(path)) { if (String.Compare(Path.GetFullPath(f), Path.GetFullPath(subFolder), true) == 0) { shouldCreate = false; break; } } if (shouldCreate) AssetDatabase.CreateFolder(path, pc); path = subFolder; } return path; } internal static string TypeNameToString(Type type) { return type == null ? "" : TypeNameToString(type.FullName); } internal static string TypeNameToString(string type) { string[] typeParts = type.Split(new char[] { '.' }); if (!typeParts.Any()) return String.Empty; string[] words = Regex.Matches(typeParts.Last(), "(^[a-z]+|[A-Z]+(?![a-z])|[A-Z][a-z]+)") .OfType() .Select(m => m.Value) .ToArray(); return string.Join(" ", words); } internal static ScriptableObject CreateScriptableObjectInstance(string typeName, string path) { ScriptableObject obj = ScriptableObject.CreateInstance(typeName) as ScriptableObject; if (obj != null) { if (!string.IsNullOrEmpty(path)) { string fileName = String.Format("{0}.asset", EditorUtilities.TypeNameToString(typeName)); string targetPath = Path.Combine(path, fileName); obj.hideFlags = HideFlags.HideInInspector; AssetDatabase.CreateAsset(obj, targetPath); return obj; } } Debug.LogError($"We were unable to create an instance of the requested type {typeName}. Please make sure that all packages are updated to support this version of Adaptive Performance Provider Management. See the Unity documentation for Adaptive Performance Provider Management for information on resolving this issue."); return null; } } }