public static void ShowEnumeration(Vector2 pos, Vector2 size, int columnCount, string header, GUIContent[] enums, Action <int> action) { if (!singleton) { singleton = CreateInstance <EnumerationPopup>(); } singleton.contents = enums; singleton.trigger = action; singleton.header = new GUIContent(header); size.y = (Mathf.Ceil(singleton.contents.Length / (float)columnCount) + 2) * 20; if (Event.current != null) { pos = GUIUtility.GUIToScreenPoint(pos); } singleton.ShowAsDropDown(pos.ToRect(), size); }
/// <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(); }); }
/// <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(); }); }