Ejemplo n.º 1
0
        public static IEnumerable <ResultRow> InScenePro(SearchTarget target)
        {
            var referencedBy = new List <ResultRow>();

            for (int ii = 0; ii < SceneManager.sceneCount; ii++)
            {
                var currentScene = SceneManager.GetSceneAt(ii);
                if (!currentScene.IsValid() || !currentScene.isLoaded)
                {
                    continue;
                }
                var allObjects = currentScene
                                 .GetRootGameObjects()
                                 .SelectMany(g => g.GetComponentsInChildren <Component>(true).Where(c => c && !(c is Transform)).OfType <Object>()
                                             .Union(AsEnumerable(g as Object))).ToArray();
                var total = allObjects.Length;
                for (int i = 0; i < total; i++)
                {
                    var comp = allObjects[i];
                    var res  = CheckObject(target, comp);
                    if (res == null)
                    {
                        continue;
                    }
                    referencedBy.Add(res);

                    if (EditorUtility.DisplayCancelableProgressBar("Searching for file usages in current scene..", target.Target.name, (float)i / total))
                    {
                        break;
                    }
                }
                EditorUtility.ClearProgressBar();
            }

            return(referencedBy);
        }
Ejemplo n.º 2
0
        public static IEnumerable <ResultRow> GetDependenciesInScene(SearchTarget target)
        {
            var referencedBy = new List <ResultRow>();

            for (int ii = 0; ii < SceneManager.sceneCount; ii++)
            {
                var currentScene = SceneManager.GetSceneAt(ii);

                if (!currentScene.IsValid() || !currentScene.isLoaded)
                {
                    continue;
                }

                var allObjects = currentScene
                                 .GetRootGameObjects()
                                 .SelectMany(g => {
                    if (g != target.Target)
                    {
                        return(g.GetComponentsInChildren <Component>(true).Where(FilterComponents).OfType <Object>().Union(AsEnumerable(g as Object)));
                    }
                    return(g.GetComponentsInChildren <Component>(true).Where(FilterComponents).OfType <Object>());
                }).ToArray();
                var total = allObjects.Length;

                var step = total / 5;

                for (int i = 0; i < total; i++)
                {
                    var comp = allObjects[i];
                    var res  = GenerateResultRowByObject(target, comp);

                    if (res != null && target.Target != res.Main)
                    {
                        referencedBy.Add(res);
                    }

                    foreach (var nested in target.Nested)
                    {
                        var searchTarget = new SearchTarget(nested, FindModeEnum.Scene);
                        var resultNested = GenerateResultRowByObject(searchTarget, comp);
                        if (resultNested != null && searchTarget.Target != resultNested.Main)
                        {
                            referencedBy.Add(resultNested);
                        }
                    }

                    if (i % step == 0)
                    {
                        if (EditorUtility.DisplayCancelableProgressBar("Searching for file usages in current scene..", target.Target.name, (float)i / total))
                        {
                            break;
                        }
                    }
                }

                EditorUtility.ClearProgressBar();
            }

            var distinct = referencedBy.Distinct().ToList();

            return(distinct);
        }
Ejemplo n.º 3
0
        private static ResultRow GenerateResultRowByObject(SearchTarget target, Object c, bool isScene = true)
        {
            if (target.Check(c))
            {
                return(null);
            }
            if (target.Root == c)
            {
                return(null);
            }
            var       so  = new SerializedObject(c);
            var       sp  = so.GetIterator();
            ResultRow row = null;

            while (sp.Next(true))
            {
                string transformPath = string.Empty;
                if (sp.propertyType != SerializedPropertyType.ObjectReference || !target.Check(sp.objectReferenceValue))
                {
                    continue;
                }
                if (row == null)
                {
                    row = new ResultRow
                    {
                        Root             = c,
                        Target           = c,
                        SerializedObject = so
                    };

                    if (isScene)
                    {
                        var component = c as Component;
                        if (component)
                        {
                            row.Main = component.gameObject;
                        }
                        else
                        {
                            var o = c as GameObject;
                            if (o != null)
                            {
                                row.Main = o;
                            }
                        }

                        var go = row.Main as GameObject;
                        Assert.NotNull(go);
                        row.LabelContent.text  = AnimationUtility.CalculateTransformPath(go.transform, null);
                        row.LabelContent.image = AssetPreview.GetMiniThumbnail(go);
                    }
                    else
                    {
                        var path = AssetDatabase.GetAssetPath(c);
                        row.Main = AssetDatabase.LoadMainAssetAtPath(path);

                        var mainType = PrefabUtility.GetPrefabAssetType(row.Main);

                        if (mainType != PrefabAssetType.NotAPrefab)
                        {
                            var comp = row.Target as Component;
                            if (comp)
                            {
                                try
                                {
                                    transformPath = string.Format("{0}/", AnimationUtility.CalculateTransformPath(comp.transform, null)).Replace("/", "/\n");
                                }
                                catch
                                {
                                    // ignored
                                }
                            }
                        }

                        row.LabelContent.text  = path.Replace(AssetsRootPath, string.Empty);
                        row.LabelContent.image = AssetDatabase.GetCachedIcon(path);
                    }
                }

                Texture2D miniTypeThumbnail = row.Main == c ? null : AssetPreview.GetMiniThumbnail(c);

                row.Properties.Add(new ResultRow.PropertyData
                {
                    Property = sp.Copy(),
                    Content  = new GUIContent
                    {
                        image   = miniTypeThumbnail,
                        text    = Nicify(sp, sp.serializedObject.targetObject, row.Main, target),
                        tooltip = string.Format("{2}{0}.{1}", sp.serializedObject.targetObject.GetType().Name, sp.propertyPath, transformPath)
                    }
                });
            }

            if (row == null)
            {
                so.Dispose();
            }
            return(row);
        }
Ejemplo n.º 4
0
        private static string Nicify(SerializedProperty sp, Object o, Object main, SearchTarget target)
        {
            //            return sp.propertyPath;

            string nice = string.Empty;

            switch (o)
            {
            case AnimatorController _:
            {
                return(Nice(sp.propertyPath));

                break;
            }

            case BlendTree blendTree:
            {
                return($"{blendTree.name}({o.GetType().Name})");

                break;
            }

            case AnimatorState animatorState:
            {
                if (main is AnimatorController animatorController)
                {
                    var bread = GetBread(animatorController, animatorState);
                    return($"{bread}{animatorState.name}");
                }

                break;
            }

            case StateMachineBehaviour smb:
            {
                var ctx = AnimatorController.FindStateMachineBehaviourContext(smb);
                if (ctx.Length == 0)
                {
                    break;
                }

                var first = ctx[0];
                var bread = string.Empty;
                switch (first.animatorObject)
                {
                case AnimatorStateMachine _:
                    // nothing
                    break;

                case AnimatorState ast:
                {
                    bread = GetBread(first.animatorController, ast);
                    break;
                }
                }

                return($"{bread}{first.animatorObject.name}");
            }

            case Material _:
                nice = sp.displayName;
                break;

            default:
            {
                nice = Nice(sp.propertyPath);
                break;
            }
            }

            nice = string.Format("{0}.{1}", o.GetType().Name, nice);
            return(nice);
        }