Exemple #1
0
        private static bool ScanFolders(ICollection <CleanerRecord> results, bool showProgress = true)
        {
            bool canceled;

            currentPhase++;

            folderIndex = 0;

            if (showProgress)
            {
                EditorUtility.DisplayProgressBar(
                    string.Format(ProgressCaption, currentPhase, phasesCount, folderIndex, foldersCount), "Getting all folders...", (float)folderIndex / foldersCount);
            }

            var emptyFolders = new List <string>();
            var root         = CSPathTools.EnforceSlashes(Application.dataPath);

            foldersCount = Directory.GetDirectories(root, "*", SearchOption.AllDirectories).Length;
            FindEmptyFoldersRecursive(emptyFolders, root, showProgress, out canceled);

            ExcludeSubFoldersOfEmptyFolders(ref emptyFolders);

            foreach (var folder in emptyFolders)
            {
                var newRecord = AssetRecord.CreateEmptyFolderRecord(folder);
                if (newRecord != null)
                {
                    results.Add(newRecord);
                }
            }

            return(canceled);
        }
Exemple #2
0
        private static bool ScanFolders(ICollection <CleanerRecord> results, bool showProgress = true)
        {
            bool canceled;

            currentPhase++;

            folderIndex = 0;

            List <string> emptyFolders = new List <string>();
            string        root         = Application.dataPath;

            foldersCount = Directory.GetDirectories(root, "*", SearchOption.AllDirectories).Length;
            FindEmptyFoldersRecursive(emptyFolders, root, showProgress, out canceled);

            ExcludeSubFoldersOfEmptyFolders(ref emptyFolders);

            foreach (string folder in emptyFolders)
            {
                AssetRecord newRecord = AssetRecord.Create(RecordType.EmptyFolder, folder);
                if (newRecord != null)
                {
                    results.Add(newRecord);
                }
            }

            return(canceled);
        }
        internal static AssetRecord CreateEmptyFolderRecord(string folderPath)
        {
            var newRecord = new AssetRecord(folderPath);

            if (!string.IsNullOrEmpty(newRecord.path))
            {
                return(newRecord);
            }

            return(null);
        }
Exemple #4
0
        internal static AssetRecord Create(RecordType type, string path)
        {
            AssetRecord newRecord = new AssetRecord(type, path);

            if (newRecord.assetType != null)
            {
                return(newRecord);
            }

            return(null);
        }
Exemple #5
0
        private static bool ScanSceneFiles(List <CleanerRecord> results, bool showProgress = true)
        {
            bool canceled = false;

            currentPhase++;

            string[] scenesPaths = CSEditorTools.FindAssetsFiltered("t:Scene", MaintainerSettings.Cleaner.pathIgnores);

            int scenesCount = scenesPaths.Length;

            for (int i = 0; i < scenesCount; i++)
            {
                if (showProgress && EditorUtility.DisplayCancelableProgressBar(string.Format(PROGRESS_CAPTION, currentPhase, phasesCount, i + 1, scenesCount), "Scanning scene files...", (float)i / scenesCount))
                {
                    canceled = true;
                    break;
                }

                string scenePath = scenesPaths[i];

                if (CSSceneTools.GetCurrentScenePath() != scenePath)
                {
                    CSSceneTools.OpenScene(scenePath);
                }

#if UNITY_5_3_PLUS
                // if we're scanning currently opened scene and going to scan more scenes,
                // we need to close all additional scenes to avoid duplicates
                else if (EditorSceneManager.loadedSceneCount > 1 && scenesCount > 1)
                {
                    CSSceneTools.CloseAllScenesButActive();
                }
#endif
                int objectsInScene = 0;

                GameObject[] gameObjects = CSEditorTools.GetAllSuitableGameObjectsInCurrentScene();
                objectsInScene = gameObjects.Length;

                if (objectsInScene == 0)
                {
                    results.Add(AssetRecord.Create(RecordType.EmptyScene, scenePath));
                }
            }

            return(!canceled);
        }
Exemple #6
0
        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);
        }
        internal static AssetRecord Create(RecordType type, AssetInfo assetInfo)
        {
            var newRecord = new AssetRecord(type, assetInfo);

            return(newRecord);
        }
Exemple #8
0
        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);
        }
Exemple #9
0
        private static bool ScanProjectFiles(ICollection <CleanerRecord> results, bool showProgress = true)
        {
            currentPhase++;

            List <string> ignoredScenes = new List <string>();

            if (MaintainerSettings.Cleaner.ignoreScenesInBuild)
            {
                ignoredScenes.AddRange(CSSceneTools.GetScenesInBuild(!MaintainerSettings.Cleaner.ignoreOnlyEnabledScenesInBuild));
            }

            CheckScenesForExistence(results, ignoredScenes, "Scenes in build");

            foreach (string scene in MaintainerSettings.Cleaner.sceneIgnores)
            {
                if (!ignoredScenes.Contains(scene))
                {
                    ignoredScenes.Add(scene);
                }
            }

            CheckScenesForExistence(results, ignoredScenes, "Scene Ignores");

            if (ignoredScenes.Count == 0)
            {
                results.Add(CleanerErrorRecord.Create("No ignored scenes, terminating unused assets search!"));
                return(false);
            }

            List <string> ignores = MaintainerSettings.Cleaner.pathIgnores.ToList();

            ignores.Add("Assets/Editor Default Resources");
            ignores.Add("/Resources/");
            ignores.Add("/StreamingAssets/");
            ignores.Add("/Gizmos/");
            ignores.Add("/Editor/");
            ignores.Add("/Plugins/");
            ignores.Add(".dll");
            ignores.Add(".rsp");
            ignores.AddRange(ignoredScenes);
            ignores.AddRange(CSEditorTools.FindAssetsFiltered("t:Script"));

            List <string> assets                 = new List <string>();
            List <string> usedAssets             = new List <string>();
            List <string> assetsWithDependencies = new List <string>();

            string[] allAssets = CSEditorTools.FindAssetsFiltered("t:Object t:GUISkin", null, ignores.ToArray());
            int      count     = allAssets.Length;

            for (int i = 0; i < count; i++)
            {
                if (showProgress && EditorUtility.DisplayCancelableProgressBar(string.Format(PROGRESS_CAPTION, currentPhase, phasesCount, i + 1, count), "Gathering all assets...", (float)i / count))
                {
                    return(true);
                }

                string asset = allAssets[i];

                if (File.Exists(asset))
                {
                    if (assets.IndexOf(asset) == -1)
                    {
                        assets.Add(asset);
                    }
                }
            }

            assetsWithDependencies.AddRange(ignoredScenes);

            List <string> foldersAddedToBuild = new List <string>();

            foldersAddedToBuild.AddRange(CSEditorTools.FindFoldersFiltered("Resources"));
            foldersAddedToBuild.AddRange(CSEditorTools.FindFoldersFiltered("StreamingAssets"));

            assetsWithDependencies.AddRange(CSEditorTools.FindAssetsInFolders("t:Object t:GUISkin", foldersAddedToBuild.ToArray()));

            count = assetsWithDependencies.Count;

            for (int i = 0; i < count; i++)
            {
                if (showProgress && EditorUtility.DisplayCancelableProgressBar(string.Format(PROGRESS_CAPTION, currentPhase, phasesCount, i + 1, count), "Looking for dependencies...", (float)i / count))
                {
                    return(true);
                }

                string[] dependencies = AssetDatabase.GetDependencies(new [] { assetsWithDependencies[i] });

                foreach (string dependency in dependencies)
                {
                    if (!File.Exists(dependency))
                    {
                        continue;
                    }

                    if (usedAssets.IndexOf(dependency) == -1)
                    {
                        usedAssets.Add(dependency);
                    }
                }
            }

            foreach (string usedAsset in usedAssets)
            {
                if (assets.IndexOf(usedAsset) != -1)
                {
                    assets.Remove(usedAsset);
                }
            }

            foreach (string asset in assets)
            {
                results.Add(AssetRecord.Create(RecordType.UnusedAsset, asset));
            }

            return(false);
        }