SGMenuOptions.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using UnityEngine.EventSystems;
  4. using UnityEngine.UI;
  5. namespace UnityEditor.UI
  6. {
  7. internal static class SGMenuOptions
  8. {
  9. #region code from MenuOptions.cs
  10. private const string kUILayerName = "UI";
  11. private const string kStandardSpritePath = "UI/Skin/UISprite.psd";
  12. private const string kBackgroundSpritePath = "UI/Skin/Background.psd";
  13. private const string kInputFieldBackgroundPath = "UI/Skin/InputFieldBackground.psd";
  14. private const string kKnobPath = "UI/Skin/Knob.psd";
  15. private const string kCheckmarkPath = "UI/Skin/Checkmark.psd";
  16. private const string kDropdownArrowPath = "UI/Skin/DropdownArrow.psd";
  17. private const string kMaskPath = "UI/Skin/UIMask.psd";
  18. static private DefaultControls.Resources s_StandardResources;
  19. static private DefaultControls.Resources GetStandardResources()
  20. {
  21. if (s_StandardResources.standard == null)
  22. {
  23. s_StandardResources.standard = AssetDatabase.GetBuiltinExtraResource<Sprite>(kStandardSpritePath);
  24. s_StandardResources.background = AssetDatabase.GetBuiltinExtraResource<Sprite>(kBackgroundSpritePath);
  25. s_StandardResources.inputField = AssetDatabase.GetBuiltinExtraResource<Sprite>(kInputFieldBackgroundPath);
  26. s_StandardResources.knob = AssetDatabase.GetBuiltinExtraResource<Sprite>(kKnobPath);
  27. s_StandardResources.checkmark = AssetDatabase.GetBuiltinExtraResource<Sprite>(kCheckmarkPath);
  28. s_StandardResources.dropdown = AssetDatabase.GetBuiltinExtraResource<Sprite>(kDropdownArrowPath);
  29. s_StandardResources.mask = AssetDatabase.GetBuiltinExtraResource<Sprite>(kMaskPath);
  30. }
  31. return s_StandardResources;
  32. }
  33. private static void SetPositionVisibleinSceneView(RectTransform canvasRTransform, RectTransform itemTransform)
  34. {
  35. // Find the best scene view
  36. SceneView sceneView = SceneView.lastActiveSceneView;
  37. if (sceneView == null && SceneView.sceneViews.Count > 0)
  38. sceneView = SceneView.sceneViews[0] as SceneView;
  39. // Couldn't find a SceneView. Don't set position.
  40. if (sceneView == null || sceneView.camera == null)
  41. return;
  42. // Create world space Plane from canvas position.
  43. Vector2 localPlanePosition;
  44. Camera camera = sceneView.camera;
  45. Vector3 position = Vector3.zero;
  46. if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRTransform, new Vector2(camera.pixelWidth / 2, camera.pixelHeight / 2), camera, out localPlanePosition))
  47. {
  48. // Adjust for canvas pivot
  49. localPlanePosition.x = localPlanePosition.x + canvasRTransform.sizeDelta.x * canvasRTransform.pivot.x;
  50. localPlanePosition.y = localPlanePosition.y + canvasRTransform.sizeDelta.y * canvasRTransform.pivot.y;
  51. localPlanePosition.x = Mathf.Clamp(localPlanePosition.x, 0, canvasRTransform.sizeDelta.x);
  52. localPlanePosition.y = Mathf.Clamp(localPlanePosition.y, 0, canvasRTransform.sizeDelta.y);
  53. // Adjust for anchoring
  54. position.x = localPlanePosition.x - canvasRTransform.sizeDelta.x * itemTransform.anchorMin.x;
  55. position.y = localPlanePosition.y - canvasRTransform.sizeDelta.y * itemTransform.anchorMin.y;
  56. Vector3 minLocalPosition;
  57. minLocalPosition.x = canvasRTransform.sizeDelta.x * (0 - canvasRTransform.pivot.x) + itemTransform.sizeDelta.x * itemTransform.pivot.x;
  58. minLocalPosition.y = canvasRTransform.sizeDelta.y * (0 - canvasRTransform.pivot.y) + itemTransform.sizeDelta.y * itemTransform.pivot.y;
  59. Vector3 maxLocalPosition;
  60. maxLocalPosition.x = canvasRTransform.sizeDelta.x * (1 - canvasRTransform.pivot.x) - itemTransform.sizeDelta.x * itemTransform.pivot.x;
  61. maxLocalPosition.y = canvasRTransform.sizeDelta.y * (1 - canvasRTransform.pivot.y) - itemTransform.sizeDelta.y * itemTransform.pivot.y;
  62. position.x = Mathf.Clamp(position.x, minLocalPosition.x, maxLocalPosition.x);
  63. position.y = Mathf.Clamp(position.y, minLocalPosition.y, maxLocalPosition.y);
  64. }
  65. itemTransform.anchoredPosition = position;
  66. itemTransform.localRotation = Quaternion.identity;
  67. itemTransform.localScale = Vector3.one;
  68. }
  69. private static void PlaceUIElementRoot(GameObject element, MenuCommand menuCommand)
  70. {
  71. GameObject parent = menuCommand.context as GameObject;
  72. if (parent == null || parent.GetComponentInParent<Canvas>() == null)
  73. {
  74. parent = GetOrCreateCanvasGameObject();
  75. }
  76. string uniqueName = GameObjectUtility.GetUniqueNameForSibling(parent.transform, element.name);
  77. element.name = uniqueName;
  78. Undo.RegisterCreatedObjectUndo(element, "Create " + element.name);
  79. Undo.SetTransformParent(element.transform, parent.transform, "Parent " + element.name);
  80. GameObjectUtility.SetParentAndAlign(element, parent);
  81. if (parent != menuCommand.context) // not a context click, so center in sceneview
  82. SetPositionVisibleinSceneView(parent.GetComponent<RectTransform>(), element.GetComponent<RectTransform>());
  83. Selection.activeGameObject = element;
  84. }
  85. static public GameObject CreateNewUI()
  86. {
  87. // Root for the UI
  88. var root = new GameObject("Canvas");
  89. root.layer = LayerMask.NameToLayer(kUILayerName);
  90. Canvas canvas = root.AddComponent<Canvas>();
  91. canvas.renderMode = RenderMode.ScreenSpaceOverlay;
  92. root.AddComponent<CanvasScaler>();
  93. root.AddComponent<GraphicRaycaster>();
  94. Undo.RegisterCreatedObjectUndo(root, "Create " + root.name);
  95. // if there is no event system add one...
  96. // CreateEventSystem(false);
  97. return root;
  98. }
  99. // Helper function that returns a Canvas GameObject; preferably a parent of the selection, or other existing Canvas.
  100. static public GameObject GetOrCreateCanvasGameObject()
  101. {
  102. GameObject selectedGo = Selection.activeGameObject;
  103. // Try to find a gameobject that is the selected GO or one if its parents.
  104. Canvas canvas = (selectedGo != null) ? selectedGo.GetComponentInParent<Canvas>() : null;
  105. if (canvas != null && canvas.gameObject.activeInHierarchy)
  106. return canvas.gameObject;
  107. // No canvas in selection or its parents? Then use just any canvas..
  108. canvas = Object.FindFirstObjectByType(typeof(Canvas)) as Canvas;
  109. if (canvas != null && canvas.gameObject.activeInHierarchy)
  110. return canvas.gameObject;
  111. // No canvas in the scene at all? Then create a new one.
  112. return SGMenuOptions.CreateNewUI();
  113. }
  114. #endregion
  115. //[MenuItem("GameObject/UI/Loop Horizontal Scroll Rect", false, 2151)]
  116. static public void AddLoopHorizontalScrollRect(MenuCommand menuCommand)
  117. {
  118. GameObject go = SGDefaultControls.CreateLoopHorizontalScrollRect(GetStandardResources());
  119. PlaceUIElementRoot(go, menuCommand);
  120. }
  121. //[MenuItem("GameObject/UI/Loop Vertical Scroll Rect", false, 2152)]
  122. static public void AddLoopVerticalScrollRect(MenuCommand menuCommand)
  123. {
  124. GameObject go = SGDefaultControls.CreateLoopVerticalScrollRect(GetStandardResources());
  125. PlaceUIElementRoot(go, menuCommand);
  126. }
  127. }
  128. }
  129. #endif