Beispiel #1
0
        /// <summary>
        /// Select similar objects related so active (selected) gameobject
        /// </summary>
        static public void OpenSelectLinkedDialog()
        {
            var src = Selection.activeGameObject;

            if (!src)
            {
                return;
            }
            EnumerationPopup.ShowEnumeration <LinkedTypes>(ev.mousePosition, "Select Linked", (x) =>
            {
                var link        = (LinkedTypes)x;
                var gameObjects = UnityEngine.Object.FindObjectsOfType <GameObject>();
                var dest        = new List <GameObject>(16);
                var srcname     = kBaseName.Replace(src.name, "");
                var srctrs      = src.transform;
                var srcprfb     = PrefabUtility.GetPrefabParent(src);
                var srcfilt     = src.GetComponent <MeshFilter>();
                var srcrend     = src.GetComponent <MeshRenderer>();
                var meshObj     = srcfilt ? srcfilt.sharedMesh : null;
                var matObj      = srcrend ? srcrend.sharedMaterial : null;
                var snapIdx     = link == LinkedTypes.Level ? EditorUtility.DisplayDialogComplex("Select similar position level", "On which axis?", "X", "Y", "Z") : 0;
                var snapRange   = EditorPrefs.GetFloat("MoveSnap" + (snapIdx == 0 ? "X" : (snapIdx == 1 ? "Y" : "Z")), 0.1f);

                if (link == LinkedTypes.Prefab && !srcprfb)
                {
                    return;
                }
                if (link == LinkedTypes.Mesh && !meshObj)
                {
                    return;
                }
                if (link == LinkedTypes.Material && !matObj)
                {
                    return;
                }
                foreach (var g in gameObjects)
                {
                    if (g.activeInHierarchy)
                    {
                        switch (link)
                        {
                        case LinkedTypes.Name: if (g.name.Contains(srcname))
                            {
                                dest.Add(g);
                            }
                            break;

                        case LinkedTypes.Prefab: if (PrefabUtility.GetPrefabParent(g) == srcprfb)
                            {
                                dest.Add(g);
                            }
                            break;

                        case LinkedTypes.Layer: if (g.layer == src.layer)
                            {
                                dest.Add(g);
                            }
                            break;

                        case LinkedTypes.Tag: if (g.tag == src.tag)
                            {
                                dest.Add(g);
                            }
                            break;

                        case LinkedTypes.Mesh: if ((srcfilt = g.GetComponent <MeshFilter>()) && srcfilt.sharedMesh == meshObj)
                            {
                                dest.Add(g);
                            }
                            break;

                        case LinkedTypes.Material: if ((srcrend = g.GetComponent <MeshRenderer>()) && srcrend.sharedMaterial == matObj)
                            {
                                dest.Add(g);
                            }
                            break;

                        case LinkedTypes.Sibling: if (g.transform.parent == srctrs.parent)
                            {
                                dest.Add(g);
                            }
                            break;

                        case LinkedTypes.Level: if (Utility.CloseEnough(g.transform.position[snapIdx], srctrs.position[snapIdx], snapRange))
                            {
                                dest.Add(g);
                            }
                            break;
                        }
                    }
                }

                Selection.objects = dest.ToArray();
            });
        }
Beispiel #2
0
        /// <summary>
        /// Select operation (support bulk)
        /// </summary>
        static public void OpenSelectOperationDialog(bool additive)
        {
            var src = Selection.gameObjects;

            if (src.Length == 0)
            {
                return;
            }
            EnumerationPopup.ShowEnumeration <SelectOperation>(ev.mousePosition, "Select Operation" + (additive ? " Additively" : ""), (x) =>
            {
                var op          = (SelectOperation)x;
                var gameObjects = UnityEngine.Object.FindObjectsOfType <GameObject>();
                var dest        = new List <GameObject>(16);

                foreach (var g in gameObjects)
                {
                    var t = g.transform;
                    if (g.activeInHierarchy)
                    {
                        switch (op)
                        {
                        case SelectOperation.Parent:
                            if (src.Any(y => t == y.transform.parent))
                            {
                                dest.Add(g);
                            }
                            break;

                        case SelectOperation.ParentsRecursive:
                            if (src.Any(y => y.transform.IsChildOf(t)))
                            {
                                dest.Add(g);
                            }
                            break;

                        case SelectOperation.Childs:
                            if (src.Any(y => y.transform == t.parent))
                            {
                                dest.Add(g);
                            }
                            break;

                        case SelectOperation.ChildsRecursive:
                            if (src.Any(y => t.IsChildOf(y.transform)))
                            {
                                dest.Add(g);
                            }
                            break;

                        case SelectOperation.Sibling:
                            if (src.Any(y => t.parent == y.transform.parent && y.transform != t))
                            {
                                dest.Add(g);
                            }
                            break;
                        }
                    }
                }

                Selection.objects = additive ? dest.Concat(src).Distinct().ToArray() : dest.ToArray();
            });
        }