#if UNITY_6000_3_OR_NEWER using System.Collections.Generic; using UnityEditor; using UnityEditor.SceneManagement; using UnityEditor.Toolbars; using UnityEditorInternal; using UnityEngine; using UnityEngine.Scripting; using UTools = UnityEditor.Tools; namespace Module.NavigationTool.Editor.Toolbar { internal static class MainToolbarUIElement { [Preserve] [MainToolbarElement("Toolbar/UI", ussName = "", defaultDockIndex = 0, defaultDockPosition = MainToolbarDockPosition.Middle, menuPriority = 500)] public static IEnumerable Draw() { var layer = 1 << LayerMask.NameToLayer("UI"); var toggleValue = (UTools.visibleLayers & layer) != 0; return new List(2) { new MainToolbarToggle(new MainToolbarContent("UI", "Toggles UI visible layer in SceneView"), toggleValue, OnToggleValueChanged), new MainToolbarDropdown(new MainToolbarContent("Select"), OnDropdownOpen) }; } private static void OnToggleValueChanged(bool result) { var layer = 1 << LayerMask.NameToLayer("UI"); if (result) UTools.visibleLayers |= layer; else UTools.visibleLayers &= ~layer; SceneView.RepaintAll(); } private static void OnDropdownOpen(Rect rect) { var prefabStage = PrefabStageUtility.GetCurrentPrefabStage(); var canvases = prefabStage != null ? prefabStage.prefabContentsRoot.GetComponentsInParent() : Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.InstanceID); var list = new List(canvases.Length); var menu = new GenericMenu(); for (var i = 0; i < canvases.Length; i++) { var root = canvases[i].rootCanvas; if (list.Contains(root)) continue; list.Add(root); menu.AddItem(new GUIContent($"{i}: {root.name}"), false, () => Focus(root.GetInstanceID())); } menu.DropDown(rect); } private static void Focus(int instanceId) { var obj = EditorUtility.EntityIdToObject(instanceId); var canvas = obj as Canvas; if (canvas == null) { if (obj != null) Debug.LogWarning("Failed to find Canvas component on object", obj); return; } Selection.activeObject = canvas; var bounds = InternalEditorUtility.CalculateSelectionBounds(false, true, true); var point = bounds.center; var direction = canvas.transform.rotation; var size = Mathf.Max(bounds.extents.x, bounds.extents.y); var ortho = canvas.renderMode == RenderMode.ScreenSpaceOverlay; for (var i = 0; i < SceneView.sceneViews.Count; i++) { var view = (SceneView)SceneView.sceneViews[i]; view.in2DMode = false; view.LookAt(point, direction, size, ortho, false); } } public static void Refresh() { MainToolbar.Refresh("Toolbar/UI"); } } } #endif