private static bool ScanProjectFiles(ICollection <CleanerRecord> results, bool showProgress = true) { currentPhase++; var ignoredScenes = new List <string>(); if (ProjectSettings.Cleaner.ignoreScenesInBuild) { ignoredScenes.AddRange(CSSceneTools.GetScenesInBuild(!ProjectSettings.Cleaner.ignoreOnlyEnabledScenesInBuild)); } foreach (var sceneFilter in ProjectSettings.Cleaner.sceneIgnoresFilters) { if (!sceneFilter.enabled) { continue; } if (ignoredScenes.IndexOf(sceneFilter.value) == -1) { ignoredScenes.Add(sceneFilter.value); } } CheckScenesForExistence(results, ignoredScenes); if (ignoredScenes.Count == 0) { if (!UserSettings.Cleaner.muteNoIgnoredScenesWarning) { var dialogResult = EditorUtility.DisplayDialogComplex( "No ignored scenes!", "No scenes were added to the build settings or to the Filters > Scenes Ignores.\n" + "All not ignored scenes are treated as unused if not referenced somewhere in other ignored assets.", "Proceed anyway", "Proceed and never show again", "Cancel"); if (dialogResult == 1) { UserSettings.Cleaner.muteNoIgnoredScenesWarning = true; UserSettings.Save(); } else if (dialogResult == 2) { return(false); } } results.Add(CleanerWarningRecord.Create("No scenes added to the build settings or Filters > Scenes Ignores tab.\n" + "Search may include all assets used in your game scenes!")); } var map = AssetsMap.GetUpdated(); if (map == null) { results.Add(CleanerErrorRecord.Create("Can't get assets map!")); return(false); } EditorUtility.DisplayCancelableProgressBar(string.Format(ProgressCaption, currentPhase, phasesCount, 0, 0), "Analyzing Assets Map for references...", 0); #if UNITY_2019_3_OR_NEWER BuildReportAnalyzer.Init(); #endif var allAssetsInProject = map.assets; var count = allAssetsInProject.Count; #if !UNITY_2020_1_OR_NEWER var updateStep = Math.Max(count / ProjectSettings.UpdateProgressStep, 1); #endif var referencedAssets = new HashSet <AssetInfo>(); for (var i = 0; i < count; i++) { if (showProgress #if !UNITY_2020_1_OR_NEWER && i % updateStep == 0 #endif && i != 0 && EditorUtility.DisplayCancelableProgressBar( string.Format(ProgressCaption, currentPhase, phasesCount, i + 1, count), "Analyzing Assets Map for references...", (float)(i + 1) / count)) { return(true); } var asset = allAssetsInProject[i]; /*if (asset.Path.EndsWith("1.pdf")) * { * Debug.Log(asset.Type); * if (asset.Type == CSReflectionTools.defaultAssetType) * { * var importer = AssetImporter.GetAtPath(asset.Path); * Debug.Log(importer); * } * }*/ if (asset.Kind != AssetKind.Regular) { continue; } if (AssetInIgnores(asset, ignoredScenes)) { referencedAssets.Add(asset); var references = asset.GetReferencesRecursive(); foreach (var reference in references) { referencedAssets.Add(reference); } } #if UNITY_2019_3_OR_NEWER if (BuildReportAnalyzer.IsFileInBuildReport(asset.GUID)) { referencedAssets.Add(asset); var references = asset.GetReferencesRecursive(); foreach (var reference in references) { if (!referencedAssets.Contains(reference)) { referencedAssets.Add(reference); } } } #endif if (AssetInIgnoresSecondPass(asset, referencedAssets)) { referencedAssets.Add(asset); var references = asset.GetReferencesRecursive(); foreach (var reference in references) { if (!referencedAssets.Contains(reference)) { referencedAssets.Add(reference); } } } } var unreferencedAssets = new List <AssetInfo>(count); for (var i = 0; i < count; i++) { if (showProgress #if !UNITY_2020_1_OR_NEWER && i % updateStep == 0 #endif && i != 0 && EditorUtility.DisplayCancelableProgressBar( string.Format(ProgressCaption, currentPhase, phasesCount, i + 1, count), "Filtering out unreferenced assets...", (float)(i + 1) / count)) { return(true); } var asset = allAssetsInProject[i]; if (asset.Kind != AssetKind.Regular) { continue; } if (CSFilterTools.HasEnabledFilters(ProjectSettings.Cleaner.pathIncludesFilters)) { if (!CSFilterTools.IsValueMatchesAnyFilter(asset.Path, ProjectSettings.Cleaner.pathIncludesFilters)) { continue; } } if (!referencedAssets.Contains(asset)) { if (unreferencedAssets.IndexOf(asset) == -1) { unreferencedAssets.Add(asset); } } } count = unreferencedAssets.Count; #if !UNITY_2020_1_OR_NEWER updateStep = Math.Max(count / ProjectSettings.UpdateProgressStep, 1); #endif for (var i = count - 1; i > -1; i--) { if (showProgress #if !UNITY_2020_1_OR_NEWER && i % updateStep == 0 #endif && i != 0) { var index = count - i; if (EditorUtility.DisplayCancelableProgressBar( string.Format(ProgressCaption, currentPhase, phasesCount, index, count), "Populating results...", (float)index / count)) { return(true); } } var unreferencedAsset = unreferencedAssets[i]; results.Add(AssetRecord.Create(RecordType.UnreferencedAsset, unreferencedAsset)); } return(false); }
private static bool LookForAssetsReferences(FilterItem[] selectedAssets, List <ProjectReferenceItem> results) { var canceled = !CSSceneTools.SaveCurrentModifiedScenes(false); if (!canceled) { var map = AssetsMap.GetUpdated(); if (map == null) { return(true); } var count = map.assets.Count; var updateStep = Math.Max(count / ProjectSettings.UpdateProgressStep, 1); var root = new ProjectReferenceItem { id = results.Count, name = "root", depth = -1 }; results.Add(root); for (var i = 0; i < count; i++) { if (i % updateStep == 0 && EditorUtility.DisplayCancelableProgressBar( string.Format(ReferencesFinder.ProgressCaption, 1, ReferencesFinder.PhasesCount), string.Format(ReferencesFinder.ProgressText, "Building references tree", i + 1, count), (float)i / count)) { canceled = true; break; } var assetInfo = map.assets[i]; // excludes settings assets from the list depth 0 items if (assetInfo.Kind == AssetKind.Settings) { continue; } // excludes all assets except selected ones from the list depth 0 items, if any was selected if (selectedAssets != null) { if (!CSFilterTools.IsValueMatchesAnyFilter(assetInfo.Path, selectedAssets)) { continue; } } if (ProjectSettings.References.pathIncludesFilters != null && ProjectSettings.References.pathIncludesFilters.Length > 0) { // excludes all root assets except included ones if (!CSFilterTools.IsValueMatchesAnyFilter(assetInfo.Path, ProjectSettings.References.pathIncludesFilters)) { continue; } } // excludes ignored root asset if (CSFilterTools.IsValueMatchesAnyFilter(assetInfo.Path, ProjectSettings.References.pathIgnoresFilters)) { continue; } var branchElements = new List <ProjectReferenceItem>(); ProjectScopeReferencesTreeBuilder.BuildTreeBranch(assetInfo, 0, results.Count, ConjunctionInfoList, branchElements); results.AddRange(branchElements); } } if (!canceled) { canceled = ProjectEntryFinder.FillProjectScopeReferenceEntries(ConjunctionInfoList, TryAddEntryToMatchedConjunctions); } // TODO: remove this work-around when this bug will be fixed: // https://issuetracker.unity3d.com/issues/assets-used-in-components-of-a-nested-prefab-are-counted-as-direct-dependencies-of-all-higher-level-nested-prefabs for (var i = results.Count - 1; i >= 0; i--) { var result = results[i]; var resultEntries = result.referencingEntries; if (resultEntries == null || resultEntries.Length == 0) { continue; } foreach (var referencingEntry in resultEntries) { if (referencingEntry.Location == Location.NotFound && result.assetTypeName == "GameObject") { results.Remove(result); break; } } } if (!canceled) { AssetsMap.Save(); } if (canceled) { ProjectReferencesTab.AutoSelectPath = null; } return(canceled); }
internal static AssetInfo[] CollectTargetAssets() { var map = AssetsMap.GetUpdated(); if (map == null) { Debug.LogError(Maintainer.LogPrefix + "Can't get updated assets map!"); return(null); } EditorUtility.DisplayProgressBar(IssuesFinder.ModuleName, "Collecting input data...", 0); var supportedKinds = new List <AssetKind> { AssetKind.Regular, AssetKind.Settings }; var assets = CSFilterTools.GetAssetInfosWithKinds(map.assets, supportedKinds); var result = new HashSet <AssetInfo>(); try { var targetAssetTypes = new List <TypeFilter>(); if (ProjectSettings.Issues.lookInScenes) { switch (ProjectSettings.Issues.scenesSelection) { case IssuesFinderSettings.ScenesSelection.AllScenes: { targetAssetTypes.Add(new TypeFilter(CSReflectionTools.sceneAssetType)); break; } case IssuesFinderSettings.ScenesSelection.IncludedScenes: { if (ProjectSettings.Issues.includeScenesInBuild) { var paths = CSSceneTools.GetScenesInBuild(!ProjectSettings.Issues.includeOnlyEnabledScenesInBuild); result.UnionWith(CSFilterTools.GetAssetInfosWithPaths(assets, paths)); } var assetInfos = CSFilterTools.FilterAssetInfos(assets, ProjectSettings.Issues.sceneIncludesFilters); result.UnionWith(assetInfos); break; } case IssuesFinderSettings.ScenesSelection.OpenedScenesOnly: { var paths = CSSceneTools.GetScenesSetup().Select(s => s.path).ToArray(); result.UnionWith(CSFilterTools.GetAssetInfosWithPaths(assets, paths)); break; } default: throw new ArgumentOutOfRangeException(); } } if (ProjectSettings.Issues.lookInAssets) { targetAssetTypes.Add(new TypeFilter(CSReflectionTools.scriptableObjectType, true)); targetAssetTypes.Add(new TypeFilter(null)); #if UNITY_2019_1_OR_NEWER targetAssetTypes.Add(new TypeFilter(CSReflectionTools.shaderType)); #endif if (ProjectSettings.Issues.scanGameObjects) { targetAssetTypes.Add(new TypeFilter(CSReflectionTools.gameObjectType)); } } var filtered = CSFilterTools.FilterAssetInfos( assets, targetAssetTypes, ProjectSettings.Issues.pathIncludesFilters, ProjectSettings.Issues.pathIgnoresFilters ); result.UnionWith(filtered); if (ProjectSettings.Issues.lookInProjectSettings) { result.UnionWith(CSFilterTools.GetAssetInfosWithKind(assets, AssetKind.Settings)); } } catch (Exception e) { Console.WriteLine(e); throw; } var resultArray = new AssetInfo[result.Count]; result.CopyTo(resultArray); return(resultArray); }
private static bool ScanProjectFiles(ICollection <CleanerRecord> results, bool showProgress = true) { currentPhase++; var ignoredScenes = new List <string>(); if (MaintainerSettings.Cleaner.ignoreScenesInBuild) { ignoredScenes.AddRange(CSSceneTools.GetScenesInBuild(!MaintainerSettings.Cleaner.ignoreOnlyEnabledScenesInBuild)); } foreach (var scene in MaintainerSettings.Cleaner.sceneIgnoresFilters) { if (ignoredScenes.IndexOf(scene.value) == -1) { ignoredScenes.Add(scene.value); } } CheckScenesForExistence(results, ignoredScenes); if (ignoredScenes.Count == 0) { results.Add(CleanerErrorRecord.Create("Please tell me what scenes you wish to keep.\n" + "Add them to the build settings and / or configure manually\n" + "at the Manage Filters > Scenes Ignores tab.")); return(false); } var map = AssetsMap.GetUpdated(); if (map == null) { results.Add(CleanerErrorRecord.Create("Can't get assets map!")); return(false); } EditorUtility.DisplayCancelableProgressBar(string.Format(ProgressCaption, currentPhase, phasesCount, 0, 0), "Analyzing Assets Map for references...", 0); var allAssetsInProject = map.assets; var count = allAssetsInProject.Count; var updateStep = Math.Max(count / MaintainerSettings.UpdateProgressStep, 1); var referencedAssets = new HashSet <AssetInfo>(); for (var i = 0; i < count; i++) { if (showProgress && i % updateStep == 0 && i != 0 && EditorUtility.DisplayCancelableProgressBar( string.Format(ProgressCaption, currentPhase, phasesCount, i + 1, count), "Analyzing Assets Map for references...", (float)(i + 1) / count)) { return(true); } var asset = allAssetsInProject[i]; /*if (asset.Path.EndsWith("1.pdf")) * { * Debug.Log(asset.Type); * if (asset.Type == CSReflectionTools.defaultAssetType) * { * var importer = AssetImporter.GetAtPath(asset.Path); * Debug.Log(importer); * } * }*/ if (asset.Kind != AssetKind.Regular) { continue; } if (AssetInIgnores(asset, ignoredScenes)) { referencedAssets.Add(asset); var references = asset.GetReferencesRecursive(); foreach (var reference in references) { referencedAssets.Add(reference); } } if (AssetInIgnoresSecondPass(asset, referencedAssets)) { referencedAssets.Add(asset); var references = asset.GetReferencesRecursive(); foreach (var reference in references) { if (!referencedAssets.Contains(reference)) { referencedAssets.Add(reference); } } } } var unreferencedAssets = new List <AssetInfo>(count); for (var i = 0; i < count; i++) { if (showProgress && i % updateStep == 0 && i != 0 && EditorUtility.DisplayCancelableProgressBar( string.Format(ProgressCaption, currentPhase, phasesCount, i + 1, count), "Filtering out unreferenced assets...", (float)(i + 1) / count)) { return(true); } var asset = allAssetsInProject[i]; if (asset.Kind != AssetKind.Regular) { continue; } if (!referencedAssets.Contains(asset)) { if (unreferencedAssets.IndexOf(asset) == -1) { unreferencedAssets.Add(asset); } } } count = unreferencedAssets.Count; updateStep = Math.Max(count / MaintainerSettings.UpdateProgressStep, 1); for (var i = count - 1; i > -1; i--) { if (showProgress && i % updateStep == 0 && i != 0) { var index = count - i; if (EditorUtility.DisplayCancelableProgressBar( string.Format(ProgressCaption, currentPhase, phasesCount, index, count), "Populating results...", (float)index / count)) { return(true); } } var unreferencedAsset = unreferencedAssets[i]; results.Add(AssetRecord.Create(RecordType.UnreferencedAsset, unreferencedAsset)); } return(false); }