using System; using System.Collections; using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading; using UnityEngine; namespace UnityEditor.XR.Management { internal static class EditorUtilities { internal static readonly string[] s_DefaultGeneralSettingsPath = {"XR"}; internal static readonly string[] s_DefaultLoaderPath = {"XR","Loaders"}; internal static readonly string[] s_DefaultSettingsPath = {"XR","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); AssetDatabase.CreateAsset(obj, targetPath); AssetDatabase.SaveAssets(); 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 XR Plug-In Management. See the Unity documentation for XR Plug-In Management for information on resolving this issue."); return null; } } }