public AssetObjectInfo(string path, AHSerializableSystemType type) { this.m_Path = path; string[] parts = path.Split('/'); this.m_Name = parts[parts.Length - 1]; this.m_Type = type; System.IO.FileInfo fileInfo = new System.IO.FileInfo(path); this.m_FileSize = fileInfo.Length; this.m_FileSizeString = AHHelper.BytesToString(m_FileSize); }
public static void ExcludeType(AHSerializableSystemType newtype) { AHSettings settings = LoadSettings(); if (!settings.m_AssetTypeExcludes.Contains(newtype)) { settings.m_AssetTypeExcludes.Add(newtype); setDirty(settings); } }
internal void SetAssetInfo(UnityEngine.Object obj, string path) { long fileSize; #if UNITY_2017_1_OR_NEWER fileSize = Profiler.GetRuntimeMemorySizeLong(obj); #else fileSize = Profiler.GetRuntimeMemorySize(obj); #endif SetSize(fileSize); this.m_path = path; //string[] parts = path.Split('/'); this.m_name = obj.name;// parts[parts.Length - 1]; m_assetGUID = UnityEditor.AssetDatabase.AssetPathToGUID(path); m_type = new AHSerializableSystemType(obj.GetType()); AHHelper.UnloadUnused(); }
private void OnGUI() { if (settings == null) { settings = AHSettings.LoadSettings(); } scrollPos = EditorGUILayout.BeginScrollView(scrollPos); //Show all used types EditorGUILayout.BeginVertical(); string selectedPath = AssetDatabase.GetAssetPath(Selection.activeObject); //Make sure this window has focus to update contents AHSettingsWindow.Instance.Repaint(); EditorGUILayout.Separator(); GUILayout.Label("This is the settingswindow for Asset Helper! " + System.Environment.NewLine + "-Choose folders, types or filenames to exclude when scanning the project", EditorStyles.boldLabel); GUILayout.Label("NB: If your project window is in \"Two column layout\" you need to select folders in the right hand side of that window", EditorStyles.miniLabel); GUILayout.Label("----------------------------------------------------------------------------", EditorStyles.boldLabel); //Force memorycleanup settings.m_MemoryCleanupActive = GUILayout.Toggle(settings.m_MemoryCleanupActive, "Force memory cleanup"); GUILayout.Label("Enable this if you experience memory crashes (Much slower)", EditorStyles.miniLabel); GUILayout.Label("----------------------------------------------------------------------------", EditorStyles.boldLabel); EditorGUILayout.Separator(); EditorGUILayout.Separator(); //Do we have a folder selected bool bFolderSelected = System.IO.Directory.Exists(selectedPath); //Is it valid bool validSelection = (/*bFolderSelected && */ settings.ValidateDirectory(Selection.activeObject)); //Select folder to exclude EditorGUILayout.BeginHorizontal(); GUI.color = (validSelection ? AHHelper.AH_BLUE : AHHelper.AH_GREY); if (GUILayout.Button(validSelection ? "Exclude selected folder" : "No valid folder selected", GUILayout.Width(btnMinWidthLarge))) { if (validSelection) { AHSettings.ExcludeDirectory(Selection.activeObject); } } GUI.color = m_IntialGUIColor; if (validSelection) { GUILayout.Label(selectedPath, EditorStyles.miniBoldLabel); } GUI.color = m_IntialGUIColor; GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); //Select type to exclude EditorGUILayout.BeginHorizontal(); AHSerializableSystemType selectedType = null; if (Selection.activeObject) { selectedType = new AHSerializableSystemType(Selection.activeObject.GetType()); } //Do we have a valid asset selected validSelection = (selectedType != null && !bFolderSelected && settings.ValidateType(selectedType)); GUI.color = (validSelection ? AHHelper.AH_BLUE : AHHelper.AH_GREY); if (GUILayout.Button(validSelection ? "Exclude selected type" : "No valid type selected", GUILayout.Width(btnMinWidthLarge))) { if (validSelection) { AHSettings.ExcludeType(selectedType); } } if (validSelection) { GUILayout.Label(selectedType.SystemType.ToString(), EditorStyles.miniBoldLabel); } GUI.color = m_IntialGUIColor; GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); //Exluded filename substrings EditorGUILayout.BeginHorizontal(); validSelection = !string.IsNullOrEmpty(m_excludeSubstringInput) && settings.ValidateSubstring(m_excludeSubstringInput); GUI.color = (validSelection ? AHHelper.AH_BLUE : AHHelper.AH_GREY); bool bHasHitEnter = false; Event e = Event.current; if (e.keyCode == KeyCode.Return) { bHasHitEnter = true; } if (bHasHitEnter || GUILayout.Button(validSelection ? "Exclude substring" : "No valid search string", GUILayout.Width(btnMinWidthLarge))) { if (validSelection) { AHSettings.ExcludeSubstring(m_excludeSubstringInput); //settings.ExcludeSubstring(m_excludeSubstringInput); m_excludeSubstringInput = string.Empty; } } GUI.color = m_IntialGUIColor; m_excludeSubstringInput = GUILayout.TextField(m_excludeSubstringInput); //GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); if (validSelection) { GUILayout.Label(string.Format("Will exclude any asset with \"{0}\" in its path/name (might make asset Helper perform slower)", m_excludeSubstringInput)); } EditorGUILayout.Separator(); EditorGUILayout.Separator(); //Select type to exclude EditorGUILayout.BeginHorizontal(); //Do we have a valid asset selected validSelection = Selection.activeObject != null && (settings.ValidateAssetGUID(Selection.activeObject)); GUI.color = (validSelection ? AHHelper.AH_BLUE : AHHelper.AH_GREY); if (GUILayout.Button(validSelection ? "Exclude selected asset" : "No project asset selected", GUILayout.Width(btnMinWidthLarge))) { if (validSelection) { AHSettings.ExcludeIndividualAssetWithObject(Selection.activeObject); } } if (validSelection) { GUILayout.Label(Selection.activeObject.name, EditorStyles.miniBoldLabel); } GUI.color = m_IntialGUIColor; GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); GUILayout.Label("---------------------------Excluded Folders------------------------------", EditorStyles.boldLabel); if (settings.m_DirectoryExcludes.Count >= 1) { for (int i = settings.m_DirectoryExcludes.Count - 1; i >= 0; i--) { EditorGUILayout.BeginHorizontal(); GUI.color = AHHelper.AH_RED; if (GUILayout.Button("Remove", GUILayout.Width(btnMinWidthSmall))) { settings.RemoveDirectoryAtIndex(i); continue; } GUI.color = m_IntialGUIColor; EditorGUILayout.ObjectField(settings.m_DirectoryExcludes[i], typeof(UnityEngine.Object), false); EditorGUILayout.EndHorizontal(); } } else { EditorGUILayout.LabelField("No folders are currently excluded"); } EditorGUILayout.Separator(); GUILayout.Label("---------------------------Excluded Types--------------------------------", EditorStyles.boldLabel); if (settings.m_AssetTypeExcludes.Count >= 1) { for (int i = settings.m_AssetTypeExcludes.Count - 1; i >= 0; i--) { EditorGUILayout.BeginHorizontal(); GUI.color = AHHelper.AH_RED; if (GUILayout.Button("Remove", GUILayout.Width(btnMinWidthSmall))) { settings.RemoveTypeAtIndex(i); continue; } GUI.color = m_IntialGUIColor; GUILayout.Label(settings.m_AssetTypeExcludes[i].Name); EditorGUILayout.EndHorizontal(); } } else { EditorGUILayout.LabelField("No types are currently excluded"); } EditorGUILayout.Separator(); GUILayout.Label("---------------------------Excluded Substrings---------------------------", EditorStyles.boldLabel); if (settings.m_AssetSubstringExcludes.Count >= 1) { for (int i = settings.m_AssetSubstringExcludes.Count - 1; i >= 0; i--) { EditorGUILayout.BeginHorizontal(); GUI.color = AHHelper.AH_RED; if (GUILayout.Button("Remove", GUILayout.Width(btnMinWidthSmall))) { settings.RemoveSubstringAtIndex(i); continue; } GUI.color = m_IntialGUIColor; GUILayout.Label(string.Format("\"{0}\"", settings.m_AssetSubstringExcludes[i])); EditorGUILayout.EndHorizontal(); } } else { EditorGUILayout.LabelField("No substrings are currently excluded"); } GUILayout.Label("-----------------------Individually excluded assets----------------------", EditorStyles.boldLabel); if (settings.m_AssetGUIDExcludes.Count >= 1) { bool isDirty = false; for (int i = settings.m_AssetGUIDExcludes.Count - 1; i >= 0; i--) { EditorGUILayout.BeginHorizontal(); GUI.color = AHHelper.AH_RED; if (GUILayout.Button("Remove", GUILayout.Width(btnMinWidthSmall))) { settings.RemoveAssetIDAtIndex(i); continue; } GUI.color = m_IntialGUIColor; string path = AssetDatabase.GUIDToAssetPath(settings.m_AssetGUIDExcludes[i]); Object obj = AssetDatabase.LoadAssetAtPath(path, typeof(Object)); if (obj != null) { EditorGUILayout.ObjectField(obj, typeof(UnityEngine.Object), false); } else { isDirty = true; } //GUILayout.Label(string.Format("\"{0}\"", "Asset cannot be found")); EditorGUILayout.EndHorizontal(); } if (Event.current.type != EventType.Layout && isDirty) { settings.CleanExcludedAssets(); } } else { EditorGUILayout.LabelField("No project assets are currently excluded"); } EditorGUILayout.EndVertical(); EditorGUILayout.EndScrollView(); }
internal bool ValidateType(AHSerializableSystemType newtype) { return(!m_AssetTypeExcludes.Contains(newtype)); }
private static void traverseDirectory(int parentIndex, string path, List <BuildReportAsset> usedAssets, int heirarchyDepth, ref int directoriesTraversed, SortedDictionary <AHSerializableSystemType, bool> validTypeList) { directoriesTraversed++; EditorUtility.DisplayProgressBar( "Traversing Directories", "(" + directoriesTraversed + " of " + m_NumberOfDirectories + ") Analyzing " + path.Substring(path.IndexOf("/Assets") + 1), (float)directoriesTraversed / (float)m_NumberOfDirectories); //Get the settings to exclude certain folders or suffixes foreach (UnityEngine.Object dir in AHMainWindow.Instance.settings.m_DirectoryExcludes) { //TODO Can this be done more elegantly int startingIndex = Application.dataPath.Length - 6; string relativePath = path.Substring(startingIndex, path.Length - startingIndex); UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath(relativePath, typeof(UnityEngine.Object)); if (dir == obj) { //This folder was exluded return; } } //Exclude types and folders that should not be reviewed //TODO perhaps improve performance of this step (Also use String.Contains(excluder, StringComparison.OrdinalIgnoreCase)) might be better not to use LINQ string[] assetsInDirectory = Directory.GetFiles(path, "*.*", SearchOption.TopDirectoryOnly) .Where(name => !name.EndsWith(".meta", StringComparison.OrdinalIgnoreCase) && (!name.EndsWith(".unity", StringComparison.OrdinalIgnoreCase)) && (!name.EndsWith("thumbs.db", StringComparison.OrdinalIgnoreCase)) && (!name.EndsWith(".orig", StringComparison.OrdinalIgnoreCase)) && (!name.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) && (!name.EndsWith(".mdb", StringComparison.OrdinalIgnoreCase)) && (!name.Contains(Path.DirectorySeparatorChar + "helper" + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase)) && (!name.Contains(Path.DirectorySeparatorChar + "plugins" + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase)) && (!name.Contains(Path.DirectorySeparatorChar + "streamingassets" + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase)) && (!name.Contains(Path.DirectorySeparatorChar + "resources" + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase)) && (!name.Contains(Path.DirectorySeparatorChar + "editor default resources" + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase)) && (!name.Contains(Path.DirectorySeparatorChar + "editor" + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase)) && (!name.EndsWith(@".ds_store", StringComparison.OrdinalIgnoreCase)) && (!name.EndsWith(@".workspace.mel", StringComparison.OrdinalIgnoreCase)) && (!name.EndsWith(@".mayaswatches", StringComparison.OrdinalIgnoreCase))) .ToArray(); //TODO this could also be improved for performance for (int i = 0; i < assetsInDirectory.Length; i++) { assetsInDirectory[i] = assetsInDirectory[i].Substring(assetsInDirectory[i].IndexOf("/Assets") + 1); assetsInDirectory[i] = assetsInDirectory[i].Replace(@"\", "/"); } //Remove the assets we ignore through settings && Find any assets that does not live in UsedAssets List //TODO for performance reasons, perhaps dont to this for each folder, but just once, when finished? //That would mean to do folder creation and populating unused assets lists after all folders are traversed var result = assetsInDirectory.Where(p => (!AHMainWindow.Instance.settings.m_AssetGUIDExcludes.Any(p2 => UnityEditor.AssetDatabase.GUIDToAssetPath(p2) == p)) && !usedAssets.Any(p2 => UnityEditor.AssetDatabase.GUIDToAssetPath(p2.GUID) == p)); //Create new folder object AHProjectFolderInfo afInfo = new AHProjectFolderInfo(); //TODO this could also be improved for performance afInfo.DirectoryName = path.Substring(path.IndexOf("/Assets") + 1).Replace(@"\", "/"); afInfo.ParentIndex = parentIndex; if (heirarchyDepth == 0) { afInfo.FoldOut = true; } //Add to static list AHMainWindow.Instance.AddProjectFolderInfo(afInfo); if (parentIndex != -1) { AHMainWindow.Instance.GetFolderList()[parentIndex].AddChildFolder(afInfo); } UnityEngine.Object objToFind; foreach (string assetName in result) { bool bExclude = false; foreach (string excluder in AHMainWindow.Instance.settings.m_AssetSubstringExcludes) { //Exlude Asset Exclude substrings from settings //If we find an excluded asset just continue to next iteration in loop if (assetName.Contains(excluder, StringComparison.OrdinalIgnoreCase)) { bExclude = true; } } if (bExclude) { continue; } objToFind = AssetDatabase.LoadAssetAtPath(assetName, typeof(UnityEngine.Object)); if (objToFind == null) { Debug.LogWarning("Couldnt find " + assetName); continue; } AHSerializableSystemType assetType = new AHSerializableSystemType(objToFind.GetType()); if (assetType.SystemType != typeof(MonoScript) && (!AHMainWindow.Instance.settings.m_AssetTypeExcludes.Contains(assetType))) { AssetObjectInfo newAssetInfo = new AssetObjectInfo(assetName, assetType); afInfo.AddAsset(newAssetInfo); } objToFind = null; //Memory leak safeguard //This have heavy performance implications if (AHMainWindow.Instance.settings.m_MemoryCleanupActive) { UnloadUnused(); } } string[] nextLevelDirectories = System.IO.Directory.GetDirectories(path, "*.*", System.IO.SearchOption.TopDirectoryOnly); //Memory leak safeguard per folder if (!AHMainWindow.Instance.settings.m_MemoryCleanupActive) { UnloadUnused(); } foreach (string nld in nextLevelDirectories) { traverseDirectory(AHMainWindow.Instance.GetFolderList().IndexOf(afInfo), nld, usedAssets, (heirarchyDepth + 1), ref directoriesTraversed, validTypeList); } }