Unity UGUI重写

来源:互联网 发布:ajax如何解析json数据 编辑:程序博客网 时间:2024/06/18 02:41

Unity UGUI重写


 public static class DefaultControlsOverwrite    {        private const float kWidth = 160f;        private const float kThickHeight = 30f;        private const float kThinHeight = 20f;        private static Vector2 s_ThickElementSize = new Vector2(kWidth, kThickHeight);        private static Vector2 s_ThinElementSize = new Vector2(kWidth, kThinHeight);        private static Vector2 s_ImageElementSize = new Vector2(100f, 100f);        private static Color s_DefaultSelectableColor = new Color(1f, 1f, 1f, 1f);        private static Color s_PanelColor = new Color(1f, 1f, 1f, 0.392f);        private static Color s_TextColor = new Color(50f / 255f, 50f / 255f, 50f / 255f, 1f);        // Helper methods at top        private static GameObject CreateUIElementRoot(string name, Vector2 size)        {            GameObject child = new GameObject(name);            RectTransform rectTransform = child.AddComponent<RectTransform>();            rectTransform.sizeDelta = size;            return child;        }        static GameObject CreateUIObject(string name, GameObject parent)        {            GameObject go = new GameObject(name);            go.AddComponent<RectTransform>();            SetParentAndAlign(go, parent);            return go;        }        private static void SetDefaultTextValues(Text lbl)        {            // Set text values we want across UI elements in default controls.            // Don't set values which are the same as the default values for the Text component,            // since there's no point in that, and it's good to keep them as consistent as possible.            lbl.color = s_TextColor;        }        private static void SetDefaultColorTransitionValues(Selectable slider)        {            ColorBlock colors = slider.colors;            colors.highlightedColor = new Color(0.882f, 0.882f, 0.882f);            colors.pressedColor = new Color(0.698f, 0.698f, 0.698f);            colors.disabledColor = new Color(0.521f, 0.521f, 0.521f);        }        private static void SetParentAndAlign(GameObject child, GameObject parent)        {            if (parent == null)                return;            child.transform.SetParent(parent.transform, false);            SetLayerRecursively(child, parent.layer);        }        private static void SetLayerRecursively(GameObject go, int layer)        {            go.layer = layer;            Transform t = go.transform;            for (int i = 0; i < t.childCount; i++)                SetLayerRecursively(t.GetChild(i).gameObject, layer);        }        // Actual controls        public static GameObject CreatePanel(DefaultControls.Resources resources)        {            GameObject panelRoot = CreateUIElementRoot("Panel", s_ThickElementSize);            // Set RectTransform to stretch            RectTransform rectTransform = panelRoot.GetComponent<RectTransform>();            rectTransform.anchorMin = Vector2.zero;            rectTransform.anchorMax = Vector2.one;            rectTransform.anchoredPosition = Vector2.zero;            rectTransform.sizeDelta = Vector2.zero;            panelRoot.AddComponent<Panel>();            //Image image = panelRoot.AddComponent<Image>();            //image.sprite = resources.background;            //image.type = Image.Type.Sliced;            //image.color = s_PanelColor;            //image.raycastTarget = false;            return panelRoot;        }        public static GameObject CreateButton(DefaultControls.Resources resources)        {            GameObject buttonRoot = CreateUIElementRoot("Button", s_ThickElementSize);            GameObject childText = new GameObject("Text");            SetParentAndAlign(childText, buttonRoot);            Image image = buttonRoot.AddComponent<Image>();            image.sprite = resources.standard;            image.type = Image.Type.Sliced;            image.color = s_DefaultSelectableColor;            Button bt = buttonRoot.AddComponent<Button>();            SetDefaultColorTransitionValues(bt);            Text text = childText.AddComponent<Text>();            text.text = "Button";            text.alignment = TextAnchor.MiddleCenter;            SetDefaultTextValues(text);            text.raycastTarget = false;            RectTransform textRectTransform = childText.GetComponent<RectTransform>();            textRectTransform.anchorMin = Vector2.zero;            textRectTransform.anchorMax = Vector2.one;            textRectTransform.sizeDelta = Vector2.zero;            return buttonRoot;        }        public static GameObject CreateText(DefaultControls.Resources resources)        {            GameObject go = CreateUIElementRoot("Text", s_ThickElementSize);            Text lbl = go.AddComponent<Text>();            lbl.text = "New Text";            SetDefaultTextValues(lbl);            lbl.raycastTarget = false;            return go;        }        public static GameObject CreateImage(DefaultControls.Resources resources)        {            GameObject go = CreateUIElementRoot("Image", s_ImageElementSize);            Image img = go.AddComponent<Image>();            img.raycastTarget = false;            return go;        }        public static GameObject CreateRawImage(DefaultControls.Resources resources)        {            GameObject go = CreateUIElementRoot("RawImage", s_ImageElementSize);            go.AddComponent<RawImage>();            return go;        }        public static GameObject CreateSlider(DefaultControls.Resources resources)        {            // Create GOs Hierarchy            GameObject root = CreateUIElementRoot("Slider", s_ThinElementSize);            GameObject background = CreateUIObject("Background", root);            GameObject fillArea = CreateUIObject("Fill Area", root);            GameObject fill = CreateUIObject("Fill", fillArea);            GameObject handleArea = CreateUIObject("Handle Slide Area", root);            GameObject handle = CreateUIObject("Handle", handleArea);            // Background            Image backgroundImage = background.AddComponent<Image>();            backgroundImage.sprite = resources.background;            backgroundImage.type = Image.Type.Sliced;            backgroundImage.color = s_DefaultSelectableColor;            RectTransform backgroundRect = background.GetComponent<RectTransform>();            backgroundRect.anchorMin = new Vector2(0, 0.25f);            backgroundRect.anchorMax = new Vector2(1, 0.75f);            backgroundRect.sizeDelta = new Vector2(0, 0);            // Fill Area            RectTransform fillAreaRect = fillArea.GetComponent<RectTransform>();            fillAreaRect.anchorMin = new Vector2(0, 0.25f);            fillAreaRect.anchorMax = new Vector2(1, 0.75f);            fillAreaRect.anchoredPosition = new Vector2(-5, 0);            fillAreaRect.sizeDelta = new Vector2(-20, 0);            // Fill            Image fillImage = fill.AddComponent<Image>();            fillImage.sprite = resources.standard;            fillImage.type = Image.Type.Sliced;            fillImage.color = s_DefaultSelectableColor;            RectTransform fillRect = fill.GetComponent<RectTransform>();            fillRect.sizeDelta = new Vector2(10, 0);            // Handle Area            RectTransform handleAreaRect = handleArea.GetComponent<RectTransform>();            handleAreaRect.sizeDelta = new Vector2(-20, 0);            handleAreaRect.anchorMin = new Vector2(0, 0);            handleAreaRect.anchorMax = new Vector2(1, 1);            // Handle            Image handleImage = handle.AddComponent<Image>();            handleImage.sprite = resources.knob;            handleImage.color = s_DefaultSelectableColor;            RectTransform handleRect = handle.GetComponent<RectTransform>();            handleRect.sizeDelta = new Vector2(20, 0);            // Setup slider component            Slider slider = root.AddComponent<SliderT>();            slider.fillRect = fill.GetComponent<RectTransform>();            slider.handleRect = handle.GetComponent<RectTransform>();            slider.targetGraphic = handleImage;            slider.direction = Slider.Direction.LeftToRight;            SetDefaultColorTransitionValues(slider);            return root;        }        public static GameObject CreateScrollbar(DefaultControls.Resources resources)        {            // Create GOs Hierarchy            GameObject scrollbarRoot = CreateUIElementRoot("Scrollbar", s_ThinElementSize);            GameObject sliderArea = CreateUIObject("Sliding Area", scrollbarRoot);            GameObject handle = CreateUIObject("Handle", sliderArea);            Image bgImage = scrollbarRoot.AddComponent<Image>();            bgImage.sprite = resources.background;            bgImage.type = Image.Type.Sliced;            bgImage.color = s_DefaultSelectableColor;            Image handleImage = handle.AddComponent<Image>();            handleImage.sprite = resources.standard;            handleImage.type = Image.Type.Sliced;            handleImage.color = s_DefaultSelectableColor;            RectTransform sliderAreaRect = sliderArea.GetComponent<RectTransform>();            sliderAreaRect.sizeDelta = new Vector2(-20, -20);            sliderAreaRect.anchorMin = Vector2.zero;            sliderAreaRect.anchorMax = Vector2.one;            RectTransform handleRect = handle.GetComponent<RectTransform>();            handleRect.sizeDelta = new Vector2(20, 20);            Scrollbar scrollbar = scrollbarRoot.AddComponent<ScrollbarT>();            scrollbar.handleRect = handleRect;            scrollbar.targetGraphic = handleImage;            SetDefaultColorTransitionValues(scrollbar);            return scrollbarRoot;        }        public static GameObject CreateToggle(DefaultControls.Resources resources)        {            // Set up hierarchy            GameObject toggleRoot = CreateUIElementRoot("Toggle", s_ThinElementSize);            GameObject background = CreateUIObject("Background", toggleRoot);            GameObject checkmark = CreateUIObject("Checkmark", background);            GameObject childLabel = CreateUIObject("Label", toggleRoot);            // Set up components            Toggle toggle = toggleRoot.AddComponent<ToggleT>();            toggle.isOn = true;            Image bgImage = background.AddComponent<Image>();            bgImage.sprite = resources.standard;            bgImage.type = Image.Type.Sliced;            bgImage.color = s_DefaultSelectableColor;            Image checkmarkImage = checkmark.AddComponent<Image>();            checkmarkImage.sprite = resources.checkmark;            Text label = childLabel.AddComponent<Text>();            label.text = "Toggle";            SetDefaultTextValues(label);            label.raycastTarget = false;            toggle.graphic = checkmarkImage;            toggle.targetGraphic = bgImage;            SetDefaultColorTransitionValues(toggle);            RectTransform bgRect = background.GetComponent<RectTransform>();            bgRect.anchorMin = new Vector2(0f, 1f);            bgRect.anchorMax = new Vector2(0f, 1f);            bgRect.anchoredPosition = new Vector2(10f, -10f);            bgRect.sizeDelta = new Vector2(kThinHeight, kThinHeight);            RectTransform checkmarkRect = checkmark.GetComponent<RectTransform>();            checkmarkRect.anchorMin = new Vector2(0.5f, 0.5f);            checkmarkRect.anchorMax = new Vector2(0.5f, 0.5f);            checkmarkRect.anchoredPosition = Vector2.zero;            checkmarkRect.sizeDelta = new Vector2(20f, 20f);            RectTransform labelRect = childLabel.GetComponent<RectTransform>();            labelRect.anchorMin = new Vector2(0f, 0f);            labelRect.anchorMax = new Vector2(1f, 1f);            labelRect.offsetMin = new Vector2(23f, 1f);            labelRect.offsetMax = new Vector2(-5f, -2f);            return toggleRoot;        }        public static GameObject CreateInputField(DefaultControls.Resources resources)        {            GameObject root = CreateUIElementRoot("InputField", s_ThickElementSize);            GameObject childPlaceholder = CreateUIObject("Placeholder", root);            GameObject childText = CreateUIObject("Text", root);            Image image = root.AddComponent<Image>();            image.sprite = resources.inputField;            image.type = Image.Type.Sliced;            image.color = s_DefaultSelectableColor;            InputField inputField = root.AddComponent<InputFieldT>();            SetDefaultColorTransitionValues(inputField);            Text text = childText.AddComponent<Text>();            text.text = "";            text.supportRichText = false;            SetDefaultTextValues(text);            text.raycastTarget = false;            Text placeholder = childPlaceholder.AddComponent<Text>();            placeholder.text = "Enter text...";            placeholder.fontStyle = FontStyle.Italic;            // Make placeholder color half as opaque as normal text color.            Color placeholderColor = text.color;            placeholderColor.a *= 0.5f;            placeholder.color = placeholderColor;            placeholder.raycastTarget = false;            RectTransform textRectTransform = childText.GetComponent<RectTransform>();            textRectTransform.anchorMin = Vector2.zero;            textRectTransform.anchorMax = Vector2.one;            textRectTransform.sizeDelta = Vector2.zero;            textRectTransform.offsetMin = new Vector2(10, 6);            textRectTransform.offsetMax = new Vector2(-10, -7);            RectTransform placeholderRectTransform = childPlaceholder.GetComponent<RectTransform>();            placeholderRectTransform.anchorMin = Vector2.zero;            placeholderRectTransform.anchorMax = Vector2.one;            placeholderRectTransform.sizeDelta = Vector2.zero;            placeholderRectTransform.offsetMin = new Vector2(10, 6);            placeholderRectTransform.offsetMax = new Vector2(-10, -7);            inputField.textComponent = text;            inputField.placeholder = placeholder;            return root;        }        public static GameObject CreateDropdown(DefaultControls.Resources resources)        {            GameObject root = CreateUIElementRoot("Dropdown", s_ThickElementSize);            GameObject label = CreateUIObject("Label", root);            GameObject arrow = CreateUIObject("Arrow", root);            GameObject template = CreateUIObject("Template", root);            GameObject viewport = CreateUIObject("Viewport", template);            GameObject content = CreateUIObject("Content", viewport);            GameObject item = CreateUIObject("Item", content);            GameObject itemBackground = CreateUIObject("Item Background", item);            GameObject itemCheckmark = CreateUIObject("Item Checkmark", item);            GameObject itemLabel = CreateUIObject("Item Label", item);            // Sub controls.            GameObject scrollbar = CreateScrollbar(resources);            scrollbar.name = "Scrollbar";            SetParentAndAlign(scrollbar, template);            Scrollbar scrollbarScrollbar = scrollbar.GetComponent<ScrollbarT>();            scrollbarScrollbar.SetDirection(Scrollbar.Direction.BottomToTop, true);            RectTransform vScrollbarRT = scrollbar.GetComponent<RectTransform>();            vScrollbarRT.anchorMin = Vector2.right;            vScrollbarRT.anchorMax = Vector2.one;            vScrollbarRT.pivot = Vector2.one;            vScrollbarRT.sizeDelta = new Vector2(vScrollbarRT.sizeDelta.x, 0);            // Setup item UI components.            Text itemLabelText = itemLabel.AddComponent<Text>();            SetDefaultTextValues(itemLabelText);            itemLabelText.alignment = TextAnchor.MiddleLeft;            itemLabelText.raycastTarget = false;            Image itemBackgroundImage = itemBackground.AddComponent<Image>();            itemBackgroundImage.color = new Color32(245, 245, 245, 255);            Image itemCheckmarkImage = itemCheckmark.AddComponent<Image>();            itemCheckmarkImage.sprite = resources.checkmark;            Toggle itemToggle = item.AddComponent<ToggleT>();            itemToggle.targetGraphic = itemBackgroundImage;            itemToggle.graphic = itemCheckmarkImage;            itemToggle.isOn = true;            // Setup template UI components.            Image templateImage = template.AddComponent<Image>();            templateImage.sprite = resources.standard;            templateImage.type = Image.Type.Sliced;            ScrollRect templateScrollRect = template.AddComponent<ScrollRect>();            templateScrollRect.content = (RectTransform)content.transform;            templateScrollRect.viewport = (RectTransform)viewport.transform;            templateScrollRect.horizontal = false;            templateScrollRect.movementType = ScrollRect.MovementType.Clamped;            templateScrollRect.verticalScrollbar = scrollbarScrollbar;            templateScrollRect.verticalScrollbarVisibility = ScrollRect.ScrollbarVisibility.AutoHideAndExpandViewport;            templateScrollRect.verticalScrollbarSpacing = -3;            Mask scrollRectMask = viewport.AddComponent<Mask>();            scrollRectMask.showMaskGraphic = false;            Image viewportImage = viewport.AddComponent<Image>();            viewportImage.sprite = resources.mask;            viewportImage.type = Image.Type.Sliced;            // Setup dropdown UI components.            Text labelText = label.AddComponent<Text>();            SetDefaultTextValues(labelText);            labelText.text = "Option A";            labelText.alignment = TextAnchor.MiddleLeft;            labelText.raycastTarget = false;            Image arrowImage = arrow.AddComponent<Image>();            arrowImage.sprite = resources.dropdown;            Image backgroundImage = root.AddComponent<Image>();            backgroundImage.sprite = resources.standard;            backgroundImage.color = s_DefaultSelectableColor;            backgroundImage.type = Image.Type.Sliced;            Dropdown dropdown = root.AddComponent<Dropdown>();            dropdown.targetGraphic = backgroundImage;            SetDefaultColorTransitionValues(dropdown);            dropdown.template = template.GetComponent<RectTransform>();            dropdown.captionText = labelText;            dropdown.itemText = itemLabelText;            // Setting default Item list.            itemLabelText.text = "Option A";            dropdown.options.Add(new Dropdown.OptionData { text = "Option A" });            dropdown.options.Add(new Dropdown.OptionData { text = "Option B" });            dropdown.options.Add(new Dropdown.OptionData { text = "Option C" });            // Set up RectTransforms.            RectTransform labelRT = label.GetComponent<RectTransform>();            labelRT.anchorMin = Vector2.zero;            labelRT.anchorMax = Vector2.one;            labelRT.offsetMin = new Vector2(10, 6);            labelRT.offsetMax = new Vector2(-25, -7);            RectTransform arrowRT = arrow.GetComponent<RectTransform>();            arrowRT.anchorMin = new Vector2(1, 0.5f);            arrowRT.anchorMax = new Vector2(1, 0.5f);            arrowRT.sizeDelta = new Vector2(20, 20);            arrowRT.anchoredPosition = new Vector2(-15, 0);            RectTransform templateRT = template.GetComponent<RectTransform>();            templateRT.anchorMin = new Vector2(0, 0);            templateRT.anchorMax = new Vector2(1, 0);            templateRT.pivot = new Vector2(0.5f, 1);            templateRT.anchoredPosition = new Vector2(0, 2);            templateRT.sizeDelta = new Vector2(0, 150);            RectTransform viewportRT = viewport.GetComponent<RectTransform>();            viewportRT.anchorMin = new Vector2(0, 0);            viewportRT.anchorMax = new Vector2(1, 1);            viewportRT.sizeDelta = new Vector2(-18, 0);            viewportRT.pivot = new Vector2(0, 1);            RectTransform contentRT = content.GetComponent<RectTransform>();            contentRT.anchorMin = new Vector2(0f, 1);            contentRT.anchorMax = new Vector2(1f, 1);            contentRT.pivot = new Vector2(0.5f, 1);            contentRT.anchoredPosition = new Vector2(0, 0);            contentRT.sizeDelta = new Vector2(0, 28);            RectTransform itemRT = item.GetComponent<RectTransform>();            itemRT.anchorMin = new Vector2(0, 0.5f);            itemRT.anchorMax = new Vector2(1, 0.5f);            itemRT.sizeDelta = new Vector2(0, 20);            RectTransform itemBackgroundRT = itemBackground.GetComponent<RectTransform>();            itemBackgroundRT.anchorMin = Vector2.zero;            itemBackgroundRT.anchorMax = Vector2.one;            itemBackgroundRT.sizeDelta = Vector2.zero;            RectTransform itemCheckmarkRT = itemCheckmark.GetComponent<RectTransform>();            itemCheckmarkRT.anchorMin = new Vector2(0, 0.5f);            itemCheckmarkRT.anchorMax = new Vector2(0, 0.5f);            itemCheckmarkRT.sizeDelta = new Vector2(20, 20);            itemCheckmarkRT.anchoredPosition = new Vector2(10, 0);            RectTransform itemLabelRT = itemLabel.GetComponent<RectTransform>();            itemLabelRT.anchorMin = Vector2.zero;            itemLabelRT.anchorMax = Vector2.one;            itemLabelRT.offsetMin = new Vector2(20, 1);            itemLabelRT.offsetMax = new Vector2(-10, -2);            template.SetActive(false);            return root;        }        public static GameObject CreateScrollView(DefaultControls.Resources resources)        {            GameObject root = CreateUIElementRoot("Scroll View", new Vector2(200, 200));            GameObject viewport = CreateUIObject("Viewport", root);            GameObject content = CreateUIObject("Content", viewport);            // Sub controls.            GameObject hScrollbar = CreateScrollbar(resources);            hScrollbar.name = "Scrollbar Horizontal";            SetParentAndAlign(hScrollbar, root);            RectTransform hScrollbarRT = hScrollbar.GetComponent<RectTransform>();            hScrollbarRT.anchorMin = Vector2.zero;            hScrollbarRT.anchorMax = Vector2.right;            hScrollbarRT.pivot = Vector2.zero;            hScrollbarRT.sizeDelta = new Vector2(0, hScrollbarRT.sizeDelta.y);            GameObject vScrollbar = CreateScrollbar(resources);            vScrollbar.name = "Scrollbar Vertical";            SetParentAndAlign(vScrollbar, root);            vScrollbar.GetComponent<ScrollbarT>().SetDirection(Scrollbar.Direction.BottomToTop, true);            RectTransform vScrollbarRT = vScrollbar.GetComponent<RectTransform>();            vScrollbarRT.anchorMin = Vector2.right;            vScrollbarRT.anchorMax = Vector2.one;            vScrollbarRT.pivot = Vector2.one;            vScrollbarRT.sizeDelta = new Vector2(vScrollbarRT.sizeDelta.x, 0);            // Setup RectTransforms.            // Make viewport fill entire scroll view.            RectTransform viewportRT = viewport.GetComponent<RectTransform>();            viewportRT.anchorMin = Vector2.zero;            viewportRT.anchorMax = Vector2.one;            viewportRT.sizeDelta = Vector2.zero;            viewportRT.pivot = Vector2.up;            // Make context match viewpoprt width and be somewhat taller.            // This will show the vertical scrollbar and not the horizontal one.            RectTransform contentRT = content.GetComponent<RectTransform>();            contentRT.anchorMin = Vector2.up;            contentRT.anchorMax = Vector2.one;            contentRT.sizeDelta = new Vector2(0, 300);            contentRT.pivot = Vector2.up;            // Setup UI components.            ScrollRect scrollRect = root.AddComponent<ScrollRect>();            scrollRect.content = contentRT;            scrollRect.viewport = viewportRT;            scrollRect.horizontalScrollbar = hScrollbar.GetComponent<ScrollbarT>();            scrollRect.verticalScrollbar = vScrollbar.GetComponent<ScrollbarT>();            scrollRect.horizontalScrollbarVisibility = ScrollRect.ScrollbarVisibility.AutoHideAndExpandViewport;            scrollRect.verticalScrollbarVisibility = ScrollRect.ScrollbarVisibility.AutoHideAndExpandViewport;            scrollRect.horizontalScrollbarSpacing = -3;            scrollRect.verticalScrollbarSpacing = -3;            Image rootImage = root.AddComponent<Image>();            rootImage.sprite = resources.background;            rootImage.type = Image.Type.Sliced;            rootImage.color = s_PanelColor;            Mask viewportMask = viewport.AddComponent<Mask>();            viewportMask.showMaskGraphic = false;            Image viewportImage = viewport.AddComponent<Image>();            viewportImage.sprite = resources.mask;            viewportImage.type = Image.Type.Sliced;            viewportImage.raycastTarget = false;            return root;        }    }


public class MenuOptionOverwrite    {        private const string kUILayerName = "UI";        private const string kStandardSpritePath = "UI/Skin/UISprite.psd";        private const string kBackgroundSpritePath = "UI/Skin/Background.psd";        private const string kInputFieldBackgroundPath = "UI/Skin/InputFieldBackground.psd";        private const string kKnobPath = "UI/Skin/Knob.psd";        private const string kCheckmarkPath = "UI/Skin/Checkmark.psd";        private const string kDropdownArrowPath = "UI/Skin/DropdownArrow.psd";        private const string kMaskPath = "UI/Skin/UIMask.psd";        static private DefaultControls.Resources s_StandardResources;        #region Protected        protected static DefaultControls.Resources GetStandardResources()        {            if (s_StandardResources.standard == null)            {                s_StandardResources.standard = AssetDatabase.GetBuiltinExtraResource<Sprite>(kStandardSpritePath);                s_StandardResources.background = AssetDatabase.GetBuiltinExtraResource<Sprite>(kBackgroundSpritePath);                s_StandardResources.inputField = AssetDatabase.GetBuiltinExtraResource<Sprite>(kInputFieldBackgroundPath);                s_StandardResources.knob = AssetDatabase.GetBuiltinExtraResource<Sprite>(kKnobPath);                s_StandardResources.checkmark = AssetDatabase.GetBuiltinExtraResource<Sprite>(kCheckmarkPath);                s_StandardResources.dropdown = AssetDatabase.GetBuiltinExtraResource<Sprite>(kDropdownArrowPath);                s_StandardResources.mask = AssetDatabase.GetBuiltinExtraResource<Sprite>(kMaskPath);            }            return s_StandardResources;        }        protected static void SetPositionVisibleinSceneView(RectTransform canvasRTransform, RectTransform itemTransform)        {            // Find the best scene view            SceneView sceneView = SceneView.lastActiveSceneView;            if (sceneView == null && SceneView.sceneViews.Count > 0)                sceneView = SceneView.sceneViews[0] as SceneView;            // Couldn't find a SceneView. Don't set position.            if (sceneView == null || sceneView.camera == null)                return;            // Create world space Plane from canvas position.            Vector2 localPlanePosition;            Camera camera = sceneView.camera;            Vector3 position = Vector3.zero;            if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRTransform, new Vector2(camera.pixelWidth / 2, camera.pixelHeight / 2), camera, out localPlanePosition))            {                // Adjust for canvas pivot                localPlanePosition.x = localPlanePosition.x + canvasRTransform.sizeDelta.x * canvasRTransform.pivot.x;                localPlanePosition.y = localPlanePosition.y + canvasRTransform.sizeDelta.y * canvasRTransform.pivot.y;                localPlanePosition.x = Mathf.Clamp(localPlanePosition.x, 0, canvasRTransform.sizeDelta.x);                localPlanePosition.y = Mathf.Clamp(localPlanePosition.y, 0, canvasRTransform.sizeDelta.y);                // Adjust for anchoring                position.x = localPlanePosition.x - canvasRTransform.sizeDelta.x * itemTransform.anchorMin.x;                position.y = localPlanePosition.y - canvasRTransform.sizeDelta.y * itemTransform.anchorMin.y;                Vector3 minLocalPosition;                minLocalPosition.x = canvasRTransform.sizeDelta.x * (0 - canvasRTransform.pivot.x) + itemTransform.sizeDelta.x * itemTransform.pivot.x;                minLocalPosition.y = canvasRTransform.sizeDelta.y * (0 - canvasRTransform.pivot.y) + itemTransform.sizeDelta.y * itemTransform.pivot.y;                Vector3 maxLocalPosition;                maxLocalPosition.x = canvasRTransform.sizeDelta.x * (1 - canvasRTransform.pivot.x) - itemTransform.sizeDelta.x * itemTransform.pivot.x;                maxLocalPosition.y = canvasRTransform.sizeDelta.y * (1 - canvasRTransform.pivot.y) - itemTransform.sizeDelta.y * itemTransform.pivot.y;                position.x = Mathf.Clamp(position.x, minLocalPosition.x, maxLocalPosition.x);                position.y = Mathf.Clamp(position.y, minLocalPosition.y, maxLocalPosition.y);            }            itemTransform.anchoredPosition = position;            itemTransform.localRotation = Quaternion.identity;            itemTransform.localScale = Vector3.one;        }        protected static void PlaceUIElementRoot(GameObject element, MenuCommand menuCommand)        {            GameObject parent = menuCommand.context as GameObject;            if (parent == null || parent.GetComponentInParent<Canvas>() == null)            {                parent = GetOrCreateCanvasGameObject();            }            if (Selection.activeTransform != null)            {                if (Selection.activeTransform is RectTransform)                {                    if (Selection.activeTransform.parent == null)                    {                        parent = Selection.activeTransform.gameObject;                    }                    else                    {                        parent = Selection.activeTransform.parent.gameObject;                    }                }            }            string uniqueName = GameObjectUtility.GetUniqueNameForSibling(parent.transform, element.name);            element.name = uniqueName;            Undo.RegisterCreatedObjectUndo(element, "Create " + element.name);            Undo.SetTransformParent(element.transform, parent.transform, "Parent " + element.name);            GameObjectUtility.SetParentAndAlign(element, parent);            if (parent != menuCommand.context) // not a context click, so center in sceneview                SetPositionVisibleinSceneView(parent.GetComponent<RectTransform>(), element.GetComponent<RectTransform>());            element.GetComponent<RectTransform>().anchoredPosition = new Vector3(0, 0, 0);            Selection.activeGameObject = element;        }        #endregion        // Graphic elements        [MenuItem("GameObject/UI/Text &2", false, 2000)]        static public void AddText(MenuCommand menuCommand)        {            GameObject go = DefaultControlsOverwrite.CreateText(GetStandardResources());            PlaceUIElementRoot(go, menuCommand);        }        [MenuItem("GameObject/UI/Image &1", false, 2001)]        static public void AddImage(MenuCommand menuCommand)        {            GameObject go = DefaultControlsOverwrite.CreateImage(GetStandardResources());            PlaceUIElementRoot(go, menuCommand);        }        [MenuItem("GameObject/UI/Raw Image", false, 2000)]        static public void AddRawImage(MenuCommand menuCommand)        {            GameObject go = DefaultControlsOverwrite.CreateRawImage(GetStandardResources());            PlaceUIElementRoot(go, menuCommand);        }        // Helper methods        static public GameObject CreateNewUI()        {            // Root for the UI            var root = UICreate.CreateNewUI();            Undo.RegisterCreatedObjectUndo(root, "Create " + root.name);            // if there is no event system add one...            CreateEventSystem(false);            return root;        }        private static void CreateEventSystem(bool select)        {            CreateEventSystem(select, null);        }        private static void CreateEventSystem(bool select, GameObject parent)        {            var esys = Object.FindObjectOfType<EventSystem>();            if (esys == null)            {                var eventSystem = UICreate.CreateEventSystem();                GameObjectUtility.SetParentAndAlign(eventSystem, parent);                Undo.RegisterCreatedObjectUndo(eventSystem, "Create " + eventSystem.name);            }            if (select && esys != null)            {                Selection.activeGameObject = esys.gameObject;            }        }        // Controls        // Button and toggle are controls you just click on.        [MenuItem("GameObject/UI/Button &3", false, 2030)]        static public void AddButton(MenuCommand menuCommand)        {            GameObject go = DefaultControlsOverwrite.CreateButton(GetStandardResources());            PlaceUIElementRoot(go, menuCommand);        }        [MenuItem("GameObject/UI/Toggle", false, 2031)]        static public void AddToggle(MenuCommand menuCommand)        {            GameObject go = DefaultControlsOverwrite.CreateToggle(GetStandardResources());            PlaceUIElementRoot(go, menuCommand);        }        // Slider and Scrollbar modify a number        [MenuItem("GameObject/UI/Slider", false, 2033)]        static public void AddSlider(MenuCommand menuCommand)        {            GameObject go = DefaultControlsOverwrite.CreateSlider(GetStandardResources());            PlaceUIElementRoot(go, menuCommand);        }        [MenuItem("GameObject/UI/Scrollbar", false, 2034)]        static public void AddScrollbar(MenuCommand menuCommand)        {            GameObject go = DefaultControlsOverwrite.CreateScrollbar(GetStandardResources());            PlaceUIElementRoot(go, menuCommand);        }        // More advanced controls below        [MenuItem("GameObject/UI/Dropdown", false, 2035)]        static public void AddDropdown(MenuCommand menuCommand)        {            GameObject go = DefaultControlsOverwrite.CreateDropdown(GetStandardResources());            PlaceUIElementRoot(go, menuCommand);        }        [MenuItem("GameObject/UI/Input Field", false, 2036)]        public static void AddInputField(MenuCommand menuCommand)        {            GameObject go = DefaultControlsOverwrite.CreateInputField(GetStandardResources());            PlaceUIElementRoot(go, menuCommand);        }        // Containers        [MenuItem("GameObject/UI/Canvas", false, 2060)]        static public void AddCanvas(MenuCommand menuCommand)        {            var go = CreateNewUI();            GameObjectUtility.SetParentAndAlign(go, menuCommand.context as GameObject);            if (go.transform.parent as RectTransform)            {                RectTransform rect = go.transform as RectTransform;                rect.anchorMin = Vector2.zero;                rect.anchorMax = Vector2.one;                rect.anchoredPosition = Vector2.zero;                rect.sizeDelta = Vector2.zero;            }            Selection.activeGameObject = go;        }        [MenuItem("GameObject/UI/Panel", false, 2061)]        static public void AddPanel(MenuCommand menuCommand)        {            GameObject go = DefaultControlsOverwrite.CreatePanel(GetStandardResources());            PlaceUIElementRoot(go, menuCommand);            // Panel is special, we need to ensure there's no padding after repositioning.            RectTransform rect = go.GetComponent<RectTransform>();            rect.anchoredPosition = Vector2.zero;            rect.sizeDelta = Vector2.zero;        }        [MenuItem("GameObject/UI/Scroll View", false, 2062)]        static public void AddScrollView(MenuCommand menuCommand)        {            GameObject go = DefaultControlsOverwrite.CreateScrollView(GetStandardResources());            PlaceUIElementRoot(go, menuCommand);        }        [MenuItem("GameObject/UI/Event System", false, 2100)]        public static void CreateEventSystem(MenuCommand menuCommand)        {            GameObject parent = menuCommand.context as GameObject;            CreateEventSystem(true, parent);        }        // Helper function that returns a Canvas GameObject; preferably a parent of the selection, or other existing Canvas.        static public GameObject GetOrCreateCanvasGameObject()        {            GameObject selectedGo = Selection.activeGameObject;            // Try to find a gameobject that is the selected GO or one if its parents.            Canvas canvas = (selectedGo != null) ? selectedGo.GetComponentInParent<Canvas>() : null;            if (canvas != null && canvas.gameObject.activeInHierarchy)                return canvas.gameObject;            // No canvas in selection or its parents? Then use just any canvas..            canvas = Object.FindObjectOfType(typeof(Canvas)) as Canvas;            if (canvas != null && canvas.gameObject.activeInHierarchy)                return canvas.gameObject;            // No canvas in the scene at all? Then create a new one.            return MenuOptionOverwrite.CreateNewUI();        }    }