static string GetFirstAssemblyToList(string[] allAssemblies) { return(allAssemblies.FirstOrDefault(a => PathUtils.DllPathsEqual(a, typeof(DllManipulator).Assembly.Location)) ?? allAssemblies.FirstOrDefault()); }
private void DrawOptions(DllManipulatorOptions options) { var guiEnabledStack = new Stack <bool>(); guiEnabledStack.Push(GUI.enabled); if (EditorApplication.isPlaying) { GUI.enabled = false; } options.mockAllNativeFunctions = EditorGUILayout.Toggle(TARGET_ALL_NATIVE_FUNCTIONS_GUI_CONTENT, options.mockAllNativeFunctions); if (EditorGUILayout.Toggle(TARGET_ONLY_EXECUTING_ASSEMBLY_GUI_CONTENT, options.assemblyPaths.Length == 0)) { options.assemblyPaths = new string[0]; } else { var prevIndent1 = EditorGUI.indentLevel; EditorGUI.indentLevel++; if (_allKnownAssemblies == null || _lastKnownAssembliesRefreshTime + ASSEMBLIES_REFRESH_INTERVAL < DateTime.Now) { var playerCompiledAssemblies = CompilationPipeline.GetAssemblies(AssembliesType.Player) .Select(a => PathUtils.NormallizeUnityAssemblyPath(a.outputPath)); var editorCompiledAssemblies = CompilationPipeline.GetAssemblies(AssembliesType.Editor) .Select(a => PathUtils.NormallizeUnityAssemblyPath(a.outputPath)); var assemblyAssets = Resources.FindObjectsOfTypeAll <PluginImporter>() .Where(p => !p.isNativePlugin) .Select(p => PathUtils.NormallizeUnityAssemblyPath(p.assetPath)); string[] defaultAssemblyPrefixes = { "UnityEngine.", "UnityEditor.", "Unity.", "com.unity.", "Mono.", "nunit." }; _allKnownAssemblies = playerCompiledAssemblies .Concat(assemblyAssets) .Concat(editorCompiledAssemblies) .OrderBy(path => Array.FindIndex(defaultAssemblyPrefixes, p => path.Substring(path.LastIndexOf('/') + 1).StartsWith(p))) .ToArray(); _lastKnownAssembliesRefreshTime = DateTime.Now; } if (options.assemblyPaths.Length == 0) { var first = GetFirstAssemblyToList(_allKnownAssemblies); if (first != null) { options.assemblyPaths = new[] { first } } ; } _showTargetAssemblies = EditorGUILayout.Foldout(_showTargetAssemblies, TARGET_ASSEMBLIES_GUI_CONTENT); if (_showTargetAssemblies) { var prevIndent2 = EditorGUI.indentLevel; EditorGUI.indentLevel++; var selectedAssemblies = options.assemblyPaths.Where(p => _allKnownAssemblies.Any(a => PathUtils.DllPathsEqual(a, p))).ToList(); var notSelectedAssemblies = _allKnownAssemblies.Except(selectedAssemblies).ToArray(); DrawList(selectedAssemblies, i => { var values = new[] { selectedAssemblies[i] } .Concat(notSelectedAssemblies) .Select(a => a.Substring(a.LastIndexOf('/') + 1)) .ToArray(); var selectedIndex = EditorGUILayout.Popup(0, values); return(selectedIndex == 0 ? selectedAssemblies[i] : notSelectedAssemblies[selectedIndex - 1]); }, notSelectedAssemblies.Length > 0, () => notSelectedAssemblies[0]); options.assemblyPaths = selectedAssemblies.ToArray(); EditorGUI.indentLevel = prevIndent2; } EditorGUI.indentLevel = prevIndent1; } options.onlyInEditor = EditorGUILayout.Toggle(ONLY_IN_EDITOR, options.onlyInEditor); options.enableInEditMode = EditorGUILayout.Toggle(ENABLE_IN_EDIT_MODE, options.enableInEditMode); options.dllPathPattern = EditorGUILayout.TextField(DLL_PATH_PATTERN_GUI_CONTENT, options.dllPathPattern); options.loadingMode = (DllLoadingMode)EditorGUILayout.EnumPopup(DLL_LOADING_MODE_GUI_CONTENT, options.loadingMode); #if UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX options.posixDlopenFlags = (PosixDlopenFlags)EditorGUILayout.EnumPopup(POSIX_DLOPEN_FLAGS_GUI_CONTENT, options.posixDlopenFlags); #endif guiEnabledStack.Push(GUI.enabled); if (options.loadingMode != DllLoadingMode.Preload) { options.threadSafe = false; GUI.enabled = false; } options.threadSafe = EditorGUILayout.Toggle(THREAD_SAFE_GUI_CONTENT, options.threadSafe); GUI.enabled = guiEnabledStack.Pop(); options.enableCrashLogs = EditorGUILayout.Toggle(CRASH_LOGS_GUI_CONTENT, options.enableCrashLogs); if (options.enableCrashLogs) { var prevIndent = EditorGUI.indentLevel; EditorGUI.indentLevel += 1; options.crashLogsDir = EditorGUILayout.TextField(CRASH_LOGS_DIR_GUI_CONTENT, options.crashLogsDir); options.crashLogsStackTrace = EditorGUILayout.Toggle(CRASH_LOGS_STACK_TRACE_GUI_CONTENT, options.crashLogsStackTrace); EditorGUI.indentLevel = prevIndent; } GUI.enabled = guiEnabledStack.Pop(); }