Esempio n. 1
0
        private void MakeRefineryItemList()
        {
            UInt32     characterID = ((TextItemWithUInt32)TlbCmbCharacter.SelectedItem).Data;
            ItemAssets container   = (ItemAssets)TextItemWithObject.GetData(TlbCmbContainer.SelectedItem);

            m_SelectedAssets = null;
            if (character_AllItems != characterID)
            {
                AssetFilter assetFilter = 0;
                if (TlbChkIgnoreContainers.Checked)
                {
                    assetFilter |= AssetFilter.NoAssembledContainers;
                }

                if (TlbChkIgnoreShips.Checked)
                {
                    assetFilter |= AssetFilter.NoAssembledShips;
                }

                if (TlbChkIgnoreAssembled.Checked)
                {
                    assetFilter |= AssetFilter.NoAssembled;
                }

                m_SelectedAssets = m_Assets.GetAssetsList(container, assetFilter);
            }

            ItemFilter filter = new ItemFilter();

            filter.Published      = TristateFilter.Yes;
            filter.PlainMaterials = TristateFilter.Yes;
            if (m_SelectedAssets != null)
            {
                filter.AssetsFilter = m_SelectedAssets;
            }

            SetupListItemsData(m_ItemsDB.FilterItems(filter), m_SelectedAssets);
            UpdateTotalsRow();

            // Optimization: pre-fill all column data (saves around 1 sec)
            Hashtable columnData = new Hashtable();

            foreach (MainListItem listItem in m_ItemList)
            {
                Object[] columnValues = GetListItemColumnData(listItem);
                columnData.Add(listItem.TypeID, columnValues);
            }

            CompareItemBase comparer = new CompareColumn(m_SortType, columnData);

            comparer.SetParameters(m_SortDirection);
            Array.Sort(m_ItemList, comparer);

            LstRefinery.VirtualListSize = m_ItemList.Count();
            UpdateLstRefinery();
        }
Esempio n. 2
0
        private void DrawFooter()
        {
            using (new GUILayout.HorizontalScope())
            {
                GUILayout.Space(5);

                if (SearchResultsStorage.ReferencesFinderLastSearched.Length == 0)
                {
                    GUI.enabled = false;
                }
                if (UIHelpers.ImageButton("Refresh", "Restarts references search for the previous results.", CSIcons.Repeat))
                {
                    if (Event.current.control && Event.current.shift)
                    {
                        ReferencesFinder.debugMode = true;
                        AssetsMap.Delete();
                        Event.current.Use();
                    }
                    else
                    {
                        ReferencesFinder.debugMode = false;
                    }

                    EditorApplication.delayCall += () =>
                    {
                        //ReferencesFinder.FindAssetsReferences(SearchResultsStorage.ReferencesFinderLastSearched, false, true);
                        ReferencesFinder.GetReferences(SearchResultsStorage.ReferencesFinderLastSearched, null);
                    };
                }
                GUI.enabled = true;

                if (UIHelpers.ImageButton("Collapse all", "Collapses all tree items.", CSIcons.Collapse))
                {
                    treePanel.CollapseAll();
                }

                if (UIHelpers.ImageButton("Expand all", "Expands all tree items.", CSIcons.Expand))
                {
                    treePanel.ExpandAll();
                }

                if (UIHelpers.ImageButton("Clear results", "Clears results tree and empties cache.", CSIcons.Clear))
                {
                    SearchResultsStorage.ReferencesSearchResults      = null;
                    SearchResultsStorage.ReferencesFinderLastSearched = null;
                    Refresh(true);
                }
                GUILayout.Space(5);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Fills m_ItemList with data
        /// </summary>
        /// <param name="a_ListTypeIDs">TypeIDs of items to be filled into list</param>
        /// <param name="a_Assets">Null or Assets to be listed</param>
        private void SetupListItemsData(UInt32[] a_ListTypeIDs, AssetsMap a_Assets)
        {
            m_TotalsItem = null;

            List <MainListItem> specialItems = new List <MainListItem>();

            if (a_Assets != null)
            {
                m_TotalsItem          = new MainListItem();
                m_TotalsItem.TypeID   = SpecialTypeID_Totals;
                m_TotalsItem.ItemData = CreateSpecialItem_Totals();
                m_TotalsItem.Quantity = 0;

                specialItems.Add(m_TotalsItem);
            }

            m_ItemList = new MainListItem[specialItems.Count + a_ListTypeIDs.Count()];
            for (int i = 0; i < specialItems.Count; i++)
            {
                m_ItemList[i] = specialItems[i];
            }

            for (int i = 0; i < a_ListTypeIDs.Count(); i++)
            {
                UInt32       currTypeID = a_ListTypeIDs[i];
                MainListItem currItem   = new MainListItem();
                m_ItemList[specialItems.Count + i] = currItem;

                ItemAssets currAssets = null;
                if ((a_Assets != null) && a_Assets.ContainsKey(currTypeID))
                {
                    currAssets = (ItemAssets)a_Assets[currTypeID];
                }

                currItem.TypeID   = currTypeID;
                currItem.ItemData = m_ItemsDB.GetItemByTypeID(currTypeID);

                if (currAssets == null)
                {
                    currItem.Quantity = 1;
                }
                else
                {
                    currItem.Quantity = currAssets.Quantity;
                }
            }
        }
Esempio n. 4
0
        public void DrawLeftColumnHeader()
        {
            using (new GUILayout.HorizontalScope())
            {
                GUILayout.Space(10);
                using (new GUILayout.VerticalScope())
                {
                    GUILayout.Space(10);
                    GUILayout.Label("<size=16><b>Search references of:</b></size>", UIHelpers.richLabel);
                    UIHelpers.Separator();
                    GUILayout.Space(10);

                    if (UIHelpers.ImageButton("All assets",
                                              "Traverses whole project to find where all assets are referenced.", CSIcons.Find))
                    {
                        if (Event.current.control && Event.current.shift)
                        {
                            ReferencesFinder.debugMode = true;
                            AssetsMap.Delete();
                            Event.current.Use();
                        }
                        else
                        {
                            ReferencesFinder.debugMode = false;
                        }

                        EditorApplication.delayCall += StartProjectReferencesScan;
                    }

                    if (ProjectScopeReferencesFinder.GetSelectedAssets().Length == 0)
                    {
                        GUI.enabled = false;
                    }

                    if (UIHelpers.ImageButton("Selected assets",
                                              "Adds selected Project View assets to the current search results.", CSIcons.Find))
                    {
                        EditorApplication.delayCall += () => ReferencesFinder.FindSelectedAssetsReferences();
                    }
                }
                GUILayout.Space(10);
            }

            GUI.enabled = true;
        }
Esempio n. 5
0
        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 (MaintainerSettings.Issues.lookInScenes)
                {
                    switch (MaintainerSettings.Issues.scenesSelection)
                    {
                    case IssuesFinderSettings.ScenesSelection.AllScenes:
                    {
                        targetAssetTypes.Add(new TypeFilter(CSReflectionTools.sceneAssetType));

                        break;
                    }

                    case IssuesFinderSettings.ScenesSelection.IncludedScenes:
                    {
                        if (MaintainerSettings.Issues.includeScenesInBuild)
                        {
                            var paths = CSSceneTools.GetScenesInBuild(!MaintainerSettings.Issues.includeOnlyEnabledScenesInBuild);
                            result.UnionWith(CSFilterTools.GetAssetInfosWithPaths(assets, paths));
                        }

                        var assetInfos = CSFilterTools.FilterAssetInfos(assets, MaintainerSettings.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 (MaintainerSettings.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 (MaintainerSettings.Issues.scanGameObjects)
                    {
                        targetAssetTypes.Add(new TypeFilter(CSReflectionTools.gameObjectType));
                    }
                }

                var filtered = CSFilterTools.FilterAssetInfos(
                    assets,
                    targetAssetTypes,
                    MaintainerSettings.Issues.pathIncludesFilters,
                    MaintainerSettings.Issues.pathIgnoresFilters
                    );

                result.UnionWith(filtered);

                if (MaintainerSettings.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);
        }
Esempio n. 6
0
        private void DrawHeader()
        {
            using (new GUILayout.HorizontalScope())
            {
                using (new GUILayout.VerticalScope())
                {
                    GUILayout.Label("<size=13>Here you may check any project assets for all project references.</size>", UIHelpers.richWordWrapLabel);

                    if (UIHelpers.ImageButton("Find all assets references",
                                              "Traverses whole project to find where all assets are referenced.", CSIcons.Find))
                    {
                        if (Event.current.control && Event.current.shift)
                        {
                            ReferencesFinder.debugMode = true;
                            AssetsMap.Delete();
                            Event.current.Use();
                        }
                        else
                        {
                            ReferencesFinder.debugMode = false;
                        }
                        EditorApplication.delayCall += StartProjectReferencesScan;
                    }

                    if (ReferencesFinder.GetSelectedAssets().Length == 0)
                    {
                        GUI.enabled = false;
                    }
                    if (UIHelpers.ImageButton("Find selected assets references",
                                              "Adds selected Project View assets to the current search results.", CSIcons.Find))
                    {
                        EditorApplication.delayCall += () => ReferencesFinder.AddSelectedToSelectionAndRun();
                    }
                    GUI.enabled = true;
                }

                GUILayout.Space(30);

                using (new GUILayout.VerticalScope(UIHelpers.panelWithBackground, GUILayout.Width(250)))
                {
                    GUILayout.Space(5);
                    using (new GUILayout.HorizontalScope())
                    {
                        GUILayout.Space(3);
                        if (UIHelpers.ImageButton("Manage Filters... (" + MaintainerSettings.References.pathIgnoresFilters.Length + ")",
                                                  CSIcons.Gear, GUILayout.ExpandWidth(false)))
                        {
                            ReferencesFiltersWindow.Create();
                        }
                        GUILayout.FlexibleSpace();
                        if (UIHelpers.ImageButton(null, "Show some extra info and notes about " + ReferencesFinder.ModuleName + ".", CSIcons.HelpOutline, GUILayout.ExpandWidth(false)))
                        {
                            EditorUtility.DisplayDialog(ReferencesFinder.ModuleName + " Extra Info",
                                                        "Except buttons on this tab, you may use these commands to search for references:\n\n" +
                                                        "Search for asset references from the Project Browser context menu:\n" +
                                                        MaintainerMenu.ProjectBrowserContextReferencesFinderName + "\n\n" +
                                                        "Look for the MonoBehaviour and ScriptableObject references from the Components' or ScriptableObjects' context menus\n" +
                                                        MaintainerMenu.ScriptReferencesContextMenuName + "\n\n" +
                                                        "Or just drag && drop items from Project Browser or Inspector to the list." + "\n\n" +
                                                        "Note #1: you'll see only those references which Maintainer was able to figure out. " +
                                                        "Some kinds of references can't be statically found or not supported yet." + "\n\n" +
                                                        "Note #2: not referenced assets still may be used at runtime or from Editor scripting.", "OK");
                        }

                        GUILayout.Space(3);
                    }

                    MaintainerPersonalSettings.References.showAssetsWithoutReferences = GUILayout.Toggle(
                        MaintainerPersonalSettings.References.showAssetsWithoutReferences,
                        new GUIContent("Add assets without found references", "Check to see all scanned assets in the list even if there was no any references to the asset found in project."), GUILayout.ExpandWidth(false));

                    MaintainerPersonalSettings.References.selectedFindClearsResults = GUILayout.Toggle(
                        MaintainerPersonalSettings.References.selectedFindClearsResults,
                        new GUIContent(@"Clear results on selected assets search", "Check to automatically clear last results on selected assets find both from context menu and main window.\nUncheck to add new results to the last results."), GUILayout.ExpandWidth(false));

                    GUILayout.Space(3);
                }
            }
        }
Esempio n. 7
0
        public void Draw()
        {
            using (new GUILayout.HorizontalScope())
            {
                /* logo */

                using (new GUILayout.VerticalScope(UIHelpers.panelWithBackground, GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true)))
                {
                    GUILayout.FlexibleSpace();

                    using (new GUILayout.HorizontalScope())
                    {
                        GUILayout.FlexibleSpace();

                        var logo = CSImages.Logo;
                        if (logo != null)
                        {
                            logo.wrapMode = TextureWrapMode.Clamp;
                            var logoRect = EditorGUILayout.GetControlRect(GUILayout.Width(logo.width), GUILayout.Height(logo.height));
                            GUI.DrawTexture(logoRect, logo);
                            GUILayout.Space(5);
                        }

                        GUILayout.FlexibleSpace();
                    }

                    GUILayout.FlexibleSpace();
                }

                /* buttons and stuff */

                using (new GUILayout.VerticalScope(UIHelpers.panelWithBackground, GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true)))
                {
                    GUILayout.Space(10);
                    GUILayout.Label("<size=18>Maintainer v.<b>" + Maintainer.Version + "</b></size>", UIHelpers.centeredLabel);
                    GUILayout.Space(5);
                    GUILayout.Label("Developed by Dmitriy Yukhanov\n" +
                                    "Logo by Daniele Giardini\n" +
                                    "Icons by Google, Austin Andrews, Cody", UIHelpers.centeredLabel);
                    GUILayout.Space(10);
                    UIHelpers.Separator();
                    GUILayout.Space(5);
                    if (UIHelpers.ImageButton("Homepage", CSIcons.Home))
                    {
                        Application.OpenURL(Homepage);
                    }
                    GUILayout.Space(5);
                    if (UIHelpers.ImageButton("Support contacts", CSIcons.Support))
                    {
                        Application.OpenURL(SupportLink);
                    }
                    GUILayout.Space(5);
                    if (UIHelpers.ImageButton("Full changelog (online)", CSIcons.Log))
                    {
                        Application.OpenURL(ChangelogLink);
                    }
                    GUILayout.Space(5);

                    //GUILayout.Space(10);
                    //GUILayout.Label("Asset Store links", UIHelpers.centeredLabel);
                    UIHelpers.Separator();
                    GUILayout.Space(5);
                    if (UIHelpers.ImageButton("Plugin at Unity Asset Store", "Hold CTRL / CMD to open in built-in Asset Store browser.", CSIcons.AssetStore))
                    {
                        if (!Event.current.control)
                        {
                            Application.OpenURL(UasLink);
                        }
                        else
                        {
                            UnityEditorInternal.AssetStore.Open(UasLinkShort);
                        }
                    }
                    GUILayout.Label("It's really important to know your opinion,\n rates & reviews are <b>greatly appreciated!</b>", UIHelpers.centeredLabel);
                    GUILayout.Space(5);
                    if (UIHelpers.ImageButton("My profile at Unity Asset Store", CSIcons.Publisher))
                    {
                        Application.OpenURL(UasProfileLink);
                    }
                    GUILayout.Label("Check all my plugins!", UIHelpers.centeredLabel);

#if UNITY_2018_3_OR_NEWER
                    if (Event.current.isKey && Event.current.type == EventType.KeyDown && Event.current.control && Event.current.keyCode == KeyCode.D)
#else
                    if (Event.current.isKey && Event.current.control && Event.current.keyCode == KeyCode.D)
#endif
                    {
                        showDebug = !showDebug;
                        Event.current.Use();
                    }

                    if (showDebug)
                    {
                        GUILayout.Space(5);
                        UIHelpers.Separator();
                        GUILayout.Space(5);
                        GUILayout.Label("Welcome to secret debug mode =D");
                        if (GUILayout.Button("Remove Assets Map"))
                        {
                            AssetsMap.Delete();
                        }

                        if (GUILayout.Button("Measure Assets Map build time"))
                        {
                            var sw = Stopwatch.StartNew();
                            AssetsMap.CreateNew();
                            sw.Stop();
                            Debug.Log("Asset Map build took " + sw.Elapsed.TotalSeconds.ToString("0.000", CultureInfo.InvariantCulture) + " seconds");
                        }

                        if (GUILayout.Button("Remove Settings and Close"))
                        {
                            window.Close();
                            MaintainerSettings.Delete();
                        }

                        if (GUILayout.Button("Re-save all scenes in project"))
                        {
                            CSSceneTools.ReSaveAllScenes();
                        }
                    }
                }
            }
        }
Esempio n. 8
0
        private static bool LookForReferences(FilterItem[] selectedAssets, List <ReferencesTreeElement> 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 / MaintainerSettings.UpdateProgressStep, 1);

                var root = new ReferencesTreeElement
                {
                    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(ProgressCaption, 1, PhasesCount),
                            string.Format(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 (MaintainerSettings.References.pathIncludesFilters != null &&
                        MaintainerSettings.References.pathIncludesFilters.Length > 0)
                    {
                        // excludes all root assets except included ones
                        if (!CSFilterTools.IsValueMatchesAnyFilter(assetInfo.Path, MaintainerSettings.References.pathIncludesFilters))
                        {
                            continue;
                        }
                    }

                    // excludes ignored root asset
                    if (CSFilterTools.IsValueMatchesAnyFilter(assetInfo.Path, MaintainerSettings.References.pathIgnoresFilters))
                    {
                        continue;
                    }

                    var branchElements = new List <ReferencesTreeElement>();
                    TreeBuilder.BuildTreeBranch(assetInfo, 0, results.Count, branchElements);
                    results.AddRange(branchElements);
                }
            }

            if (!canceled)
            {
                canceled = ReferenceEntryFinder.FillReferenceEntries();
            }

            if (!canceled)
            {
                AssetsMap.Save();
            }

            if (canceled)
            {
                ReferencesTab.AutoShowExistsNotification = false;
                ReferencesTab.AutoSelectPath             = null;
            }

            return(canceled);
        }
Esempio n. 9
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);
        }
        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;

#if !UNITY_2020_1_OR_NEWER
                var updateStep = Math.Max(count / ProjectSettings.UpdateProgressStep, 1);
#endif
                var root = new ProjectReferenceItem
                {
                    id    = results.Count,
                    name  = "root",
                    depth = -1
                };
                results.Add(root);

                for (var i = 0; i < count; i++)
                {
                    if (
#if !UNITY_2020_1_OR_NEWER
                        i % updateStep == 0 &&
#endif
                        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);
        }
Esempio n. 11
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);
        }