private void LoadPrefs() { SceneSearchMode sceneSearchMode = (SceneSearchMode)EditorPrefs.GetInt(PREFS_SEARCH_SCENES, (int)(SceneSearchMode.OpenScenes | SceneSearchMode.ScenesInBuildSettingsTickedOnly | SceneSearchMode.AllScenes)); searchInOpenScenes = (sceneSearchMode & SceneSearchMode.OpenScenes) == SceneSearchMode.OpenScenes; searchInScenesInBuild = (sceneSearchMode & SceneSearchMode.ScenesInBuildSettingsAll) == SceneSearchMode.ScenesInBuildSettingsAll || (sceneSearchMode & SceneSearchMode.ScenesInBuildSettingsTickedOnly) == SceneSearchMode.ScenesInBuildSettingsTickedOnly; searchInScenesInBuildTickedOnly = (sceneSearchMode & SceneSearchMode.ScenesInBuildSettingsAll) != SceneSearchMode.ScenesInBuildSettingsAll; searchInAllScenes = (sceneSearchMode & SceneSearchMode.AllScenes) == SceneSearchMode.AllScenes; searchInAssetsFolder = EditorPrefs.GetBool(PREFS_SEARCH_ASSETS, true); searchDepthLimit = EditorPrefs.GetInt(PREFS_SEARCH_DEPTH_LIMIT, 4); // Fetch public, protected and private non-static fields and properties from objects by default fieldModifiers = (BindingFlags)EditorPrefs.GetInt(PREFS_SEARCH_FIELDS, (int)(BindingFlags.Public | BindingFlags.NonPublic)); propertyModifiers = (BindingFlags)EditorPrefs.GetInt(PREFS_SEARCH_PROPERTIES, (int)(BindingFlags.Public | BindingFlags.NonPublic)); try { searchResultDrawParameters.pathDrawingMode = (PathDrawingMode)EditorPrefs.GetInt(PREFS_PATH_DRAWING_MODE, (int)PathDrawingMode.ShortRelevantParts); } catch { searchResultDrawParameters.pathDrawingMode = PathDrawingMode.ShortRelevantParts; } searchResultDrawParameters.showTooltips = EditorPrefs.GetBool(PREFS_SHOW_TOOLTIPS, false); }
private void ParseSceneSearchMode(SceneSearchMode sceneSearchMode) { searchInOpenScenes = (sceneSearchMode & SceneSearchMode.OpenScenes) == SceneSearchMode.OpenScenes; searchInScenesInBuild = (sceneSearchMode & SceneSearchMode.ScenesInBuildSettingsAll) == SceneSearchMode.ScenesInBuildSettingsAll || (sceneSearchMode & SceneSearchMode.ScenesInBuildSettingsTickedOnly) == SceneSearchMode.ScenesInBuildSettingsTickedOnly; searchInScenesInBuildTickedOnly = (sceneSearchMode & SceneSearchMode.ScenesInBuildSettingsAll) != SceneSearchMode.ScenesInBuildSettingsAll; searchInAllScenes = (sceneSearchMode & SceneSearchMode.AllScenes) == SceneSearchMode.AllScenes; }
private void SavePrefs() { SceneSearchMode sceneSearchMode = SceneSearchMode.None; if (searchInOpenScenes) { sceneSearchMode |= SceneSearchMode.OpenScenes; } if (searchInScenesInBuild) { sceneSearchMode |= searchInScenesInBuildTickedOnly ? SceneSearchMode.ScenesInBuildSettingsTickedOnly : SceneSearchMode.ScenesInBuildSettingsAll; } if (searchInAllScenes) { sceneSearchMode |= SceneSearchMode.AllScenes; } EditorPrefs.SetInt(PREFS_SEARCH_SCENES, (int)sceneSearchMode); EditorPrefs.SetBool(PREFS_SEARCH_ASSETS, searchInAssetsFolder); EditorPrefs.SetInt(PREFS_SEARCH_DEPTH_LIMIT, searchDepthLimit); EditorPrefs.SetInt(PREFS_SEARCH_FIELDS, (int)fieldModifiers); EditorPrefs.SetInt(PREFS_SEARCH_PROPERTIES, (int)propertyModifiers); EditorPrefs.SetInt(PREFS_PATH_DRAWING_MODE, (int)searchResultDrawParameters.pathDrawingMode); EditorPrefs.SetBool(PREFS_SHOW_TOOLTIPS, searchResultDrawParameters.showTooltips); }
public Parameters() { objectsToSearch = null; searchInScenes = SceneSearchMode.AllScenes; searchInAssetsFolder = true; searchInAssetsSubset = null; excludedAssetsFromSearch = null; dontSearchInSourceAssets = false; excludedScenesFromSearch = null; searchDepthLimit = 4; fieldModifiers = BindingFlags.Public | BindingFlags.NonPublic; propertyModifiers = BindingFlags.Public | BindingFlags.NonPublic; searchNonSerializableVariables = true; noAssetDatabaseChanges = false; showProgressBar = false; }
private SceneSearchMode GetSceneSearchMode(bool hideOptionsInPlayMode) { SceneSearchMode sceneSearchMode = SceneSearchMode.None; if (searchInOpenScenes) { sceneSearchMode |= SceneSearchMode.OpenScenes; } if (!hideOptionsInPlayMode || !EditorApplication.isPlaying) { if (searchInScenesInBuild) { sceneSearchMode |= searchInScenesInBuildTickedOnly ? SceneSearchMode.ScenesInBuildSettingsTickedOnly : SceneSearchMode.ScenesInBuildSettingsAll; } if (searchInAllScenes) { sceneSearchMode |= SceneSearchMode.AllScenes; } } return(sceneSearchMode); }
private void OnGUI() { // Make the window scrollable scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, Utilities.GL_EXPAND_WIDTH, Utilities.GL_EXPAND_HEIGHT); GUILayout.BeginVertical(); GUILayout.Space(10); // Show the error message, if it is not empty if (errorMessage.Length > 0) { EditorGUILayout.HelpBox(errorMessage, MessageType.Error); } GUILayout.Space(10); if (currentPhase == Phase.Processing) { // If we are stuck at this phase, then we have encountered an exception GUILayout.Label(". . . Something went wrong, check console . . ."); restoreInitialSceneSetup = EditorGUILayout.ToggleLeft("Restore initial scene setup (Recommended)", restoreInitialSceneSetup); if (GUILayout.Button("RETURN", Utilities.GL_HEIGHT_30)) { ReturnToSetupPhase(restoreInitialSceneSetup); } } else if (currentPhase == Phase.Setup) { if (ExposeSearchedObjects()) { errorMessage = string.Empty; } GUILayout.Space(10); GUILayout.Box("SEARCH IN", Utilities.BoxGUIStyle, Utilities.GL_EXPAND_WIDTH); searchInAssetsFolder = EditorGUILayout.ToggleLeft("Project view (Assets folder)", searchInAssetsFolder); if (searchInAssetsFolder) { GUILayout.BeginHorizontal(); GUILayout.Space(35); GUILayout.BeginVertical(); ExposeAssetsToSearch(); GUILayout.EndVertical(); GUILayout.EndHorizontal(); } GUILayout.Space(10); if (EditorApplication.isPlaying) { searchInAllScenes = false; searchInScenesInBuild = false; } else if (searchInAllScenes) { GUI.enabled = false; } searchInOpenScenes = EditorGUILayout.ToggleLeft("Currently open (loaded) scene(s)", searchInOpenScenes); if (EditorApplication.isPlaying) { GUI.enabled = false; } searchInScenesInBuild = EditorGUILayout.ToggleLeft("Scenes in Build Settings", searchInScenesInBuild); if (searchInScenesInBuild) { GUILayout.BeginHorizontal(); GUILayout.Space(35); searchInScenesInBuildTickedOnly = EditorGUILayout.ToggleLeft("Ticked only", searchInScenesInBuildTickedOnly, Utilities.GL_WIDTH_100); searchInScenesInBuildTickedOnly = !EditorGUILayout.ToggleLeft("All", !searchInScenesInBuildTickedOnly, Utilities.GL_WIDTH_100); GUILayout.EndHorizontal(); } if (!EditorApplication.isPlaying) { GUI.enabled = true; } searchInAllScenes = EditorGUILayout.ToggleLeft("All scenes in the project", searchInAllScenes); GUI.enabled = true; GUILayout.Space(10); GUILayout.Box("SEARCH SETTINGS", Utilities.BoxGUIStyle, Utilities.GL_EXPAND_WIDTH); GUILayout.BeginHorizontal(); GUILayout.Label(new GUIContent("> Search depth: " + searchDepthLimit, "Depth limit for recursively searching variables of objects"), Utilities.GL_WIDTH_250); searchDepthLimit = (int)GUILayout.HorizontalSlider(searchDepthLimit, 0, 4); GUILayout.EndHorizontal(); GUILayout.Label("> Search variables:"); GUILayout.BeginHorizontal(); GUILayout.Space(35); if (EditorGUILayout.ToggleLeft("Public", (fieldModifiers & BindingFlags.Public) == BindingFlags.Public, Utilities.GL_WIDTH_100)) { fieldModifiers |= BindingFlags.Public; } else { fieldModifiers &= ~BindingFlags.Public; } if (EditorGUILayout.ToggleLeft("Non-public", (fieldModifiers & BindingFlags.NonPublic) == BindingFlags.NonPublic, Utilities.GL_WIDTH_100)) { fieldModifiers |= BindingFlags.NonPublic; } else { fieldModifiers &= ~BindingFlags.NonPublic; } GUILayout.EndHorizontal(); GUILayout.Label("> Search properties (can be slow):"); GUILayout.BeginHorizontal(); GUILayout.Space(35); if (EditorGUILayout.ToggleLeft("Public", (propertyModifiers & BindingFlags.Public) == BindingFlags.Public, Utilities.GL_WIDTH_100)) { propertyModifiers |= BindingFlags.Public; } else { propertyModifiers &= ~BindingFlags.Public; } if (EditorGUILayout.ToggleLeft("Non-public", (propertyModifiers & BindingFlags.NonPublic) == BindingFlags.NonPublic, Utilities.GL_WIDTH_100)) { propertyModifiers |= BindingFlags.NonPublic; } else { propertyModifiers &= ~BindingFlags.NonPublic; } GUILayout.EndHorizontal(); GUILayout.Space(10); // Don't let the user press the GO button without any valid search location if (!searchInAllScenes && !searchInOpenScenes && !searchInScenesInBuild && !searchInAssetsFolder) { GUI.enabled = false; } noAssetDatabaseChanges = EditorGUILayout.ToggleLeft("I haven't modified any assets/scenes since the last search (faster search)", noAssetDatabaseChanges); if (GUILayout.Button("GO!", Utilities.GL_HEIGHT_30)) { if (objectsToSearch.IsEmpty()) { errorMessage = "ADD AN ASSET TO THE LIST FIRST!"; } else if (!EditorApplication.isPlaying && !Utilities.AreScenesSaved()) { // Don't start the search if at least one scene is currently dirty (not saved) errorMessage = "SAVE OPEN SCENES FIRST!"; } else { errorMessage = string.Empty; currentPhase = Phase.Processing; SceneSearchMode sceneSearchMode = SceneSearchMode.None; if (searchInAllScenes) { sceneSearchMode = SceneSearchMode.AllScenes; } else { if (searchInOpenScenes) { sceneSearchMode = SceneSearchMode.OpenScenes; } if (searchInScenesInBuild) { if (searchInScenesInBuildTickedOnly) { sceneSearchMode |= SceneSearchMode.ScenesInBuildSettingsTickedOnly; } else { sceneSearchMode |= SceneSearchMode.ScenesInBuildSettingsAll; } } } // Start searching searchResult = core.Run(new AssetUsageDetector.Parameters() { objectsToSearch = !objectsToSearch.IsEmpty() ? new ObjectToSearchEnumerator(objectsToSearch) : null, searchInScenes = sceneSearchMode, searchInAssetsFolder = searchInAssetsFolder, searchInAssetsSubset = !searchInAssetsSubset.IsEmpty() ? searchInAssetsSubset : null, fieldModifiers = fieldModifiers, propertyModifiers = propertyModifiers, searchDepthLimit = searchDepthLimit, noAssetDatabaseChanges = noAssetDatabaseChanges }); currentPhase = Phase.Complete; } } } else if (currentPhase == Phase.Complete) { // Draw the results of the search GUI.enabled = false; ExposeSearchedObjects(); GUILayout.Space(10); GUI.enabled = true; restoreInitialSceneSetup = EditorGUILayout.ToggleLeft("Restore initial scene setup after search is reset (Recommended)", restoreInitialSceneSetup); if (GUILayout.Button("Reset Search", Utilities.GL_HEIGHT_30)) { ReturnToSetupPhase(restoreInitialSceneSetup); } if (searchResult == null) { EditorGUILayout.HelpBox("ERROR: searchResult is null", MessageType.Error); return; } else if (!searchResult.SearchCompletedSuccessfully) { EditorGUILayout.HelpBox("ERROR: search was interrupted, check the logs for more info", MessageType.Error); } Color c = GUI.color; GUI.color = Color.green; GUILayout.Box("Don't forget to save scene(s) if you made any changes!", Utilities.BoxGUIStyle, Utilities.GL_EXPAND_WIDTH); GUI.color = c; GUILayout.Space(10); if (searchResult.NumberOfGroups == 0) { GUILayout.Box("No results found...", Utilities.BoxGUIStyle, Utilities.GL_EXPAND_WIDTH); } else { GUILayout.BeginHorizontal(); // Select all the references after filtering them (select only the GameObject's) if (GUILayout.Button("Select All\n(GameObject-wise)", Utilities.GL_HEIGHT_35)) { GameObject[] objects = searchResult.SelectAllAsGameObjects(); if (objects != null && objects.Length > 0) { Selection.objects = objects; } } // Select all the references without filtering them if (GUILayout.Button("Select All\n(Object-wise)", Utilities.GL_HEIGHT_35)) { Object[] objects = searchResult.SelectAllAsObjects(); if (objects != null && objects.Length > 0) { Selection.objects = objects; } } GUILayout.EndHorizontal(); GUILayout.Space(10); searchResultDrawParameters.showTooltips = EditorGUILayout.ToggleLeft("Show tooltips", searchResultDrawParameters.showTooltips); GUILayout.Space(10); GUILayout.Label("Path drawing mode:"); GUILayout.BeginHorizontal(); GUILayout.Space(35); if (EditorGUILayout.ToggleLeft("Full: Draw the complete paths to the references (can be slow with too many references)", searchResultDrawParameters.pathDrawingMode == PathDrawingMode.Full)) { searchResultDrawParameters.pathDrawingMode = PathDrawingMode.Full; } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Space(35); if (EditorGUILayout.ToggleLeft("Shorter: Draw only the most relevant unique parts of the complete paths that start with a UnityEngine.Object", searchResultDrawParameters.pathDrawingMode == PathDrawingMode.ShortRelevantParts)) { searchResultDrawParameters.pathDrawingMode = PathDrawingMode.ShortRelevantParts; } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Space(35); if (EditorGUILayout.ToggleLeft("Shortest: Draw only the last two nodes of complete paths that are unique", searchResultDrawParameters.pathDrawingMode == PathDrawingMode.Shortest)) { searchResultDrawParameters.pathDrawingMode = PathDrawingMode.Shortest; } GUILayout.EndHorizontal(); searchResult.DrawOnGUI(searchResultDrawParameters); } } GUILayout.Space(10); GUILayout.EndVertical(); EditorGUILayout.EndScrollView(); }
public void RefreshSearchResultGroup(SearchResultGroup searchResultGroup, bool noAssetDatabaseChanges) { if (searchResultGroup == null) { Debug.LogError("SearchResultGroup is null!"); return; } int searchResultGroupIndex = -1; for (int i = 0; i < result.Count; i++) { if (result[i] == searchResultGroup) { searchResultGroupIndex = i; break; } } if (searchResultGroupIndex < 0) { Debug.LogError("SearchResultGroup is not a part of SearchResult!"); return; } if (searchResultGroup.Type == SearchResultGroup.GroupType.Scene && EditorApplication.isPlaying && !EditorSceneManager.GetSceneByPath(searchResultGroup.Title).isLoaded) { Debug.LogError("Can't search unloaded scene while in Play Mode!"); return; } if (searchHandler == null) { searchHandler = new AssetUsageDetector(); } SceneSearchMode searchInScenes = m_searchParameters.searchInScenes; Object[] searchInScenesSubset = m_searchParameters.searchInScenesSubset; bool searchInAssetsFolder = m_searchParameters.searchInAssetsFolder; Object[] searchInAssetsSubset = m_searchParameters.searchInAssetsSubset; try { if (searchResultGroup.Type == SearchResultGroup.GroupType.Assets) { m_searchParameters.searchInScenes = SceneSearchMode.None; m_searchParameters.searchInScenesSubset = null; } else if (searchResultGroup.Type == SearchResultGroup.GroupType.Scene) { m_searchParameters.searchInScenes = SceneSearchMode.None; m_searchParameters.searchInScenesSubset = new Object[1] { AssetDatabase.LoadAssetAtPath <SceneAsset>(searchResultGroup.Title) }; m_searchParameters.searchInAssetsFolder = false; m_searchParameters.searchInAssetsSubset = null; } else { m_searchParameters.searchInScenes = (SceneSearchMode)1024; // A unique value to search only the DontDestroyOnLoad scene m_searchParameters.searchInScenesSubset = null; m_searchParameters.searchInAssetsFolder = false; m_searchParameters.searchInAssetsSubset = null; } m_searchParameters.lazySceneSearch = false; m_searchParameters.noAssetDatabaseChanges = noAssetDatabaseChanges; // Make sure the AssetDatabase is up-to-date AssetDatabase.SaveAssets(); List <SearchResultGroup> searchResult = searchHandler.Run(m_searchParameters).result; if (searchResult != null) { int newSearchResultGroupIndex = -1; for (int i = 0; i < searchResult.Count; i++) { if (searchResultGroup.Title == searchResult[i].Title) { newSearchResultGroupIndex = i; break; } } if (newSearchResultGroupIndex >= 0) { result[searchResultGroupIndex] = searchResult[newSearchResultGroupIndex]; } else { searchResultGroup.Clear(); } } } finally { m_searchParameters.searchInScenes = searchInScenes; m_searchParameters.searchInScenesSubset = searchInScenesSubset; m_searchParameters.searchInAssetsFolder = searchInAssetsFolder; m_searchParameters.searchInAssetsSubset = searchInAssetsSubset; } }