// *********************************************************************** // Assembly : Unity // Author : Kimch // Created : // // Last Modified By : Kimch // Last Modified On : // *********************************************************************** // // // *********************************************************************** using UnityEngine; using UnityEngine.UI; static class CustomControls { public struct Resources { public Sprite standard; public Sprite background; public Sprite inputField; public Sprite knob; public Sprite checkmark; public Sprite dropdown; public Sprite mask; public Material emojimaterial; } 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.sizeDelta = size; return child; } static GameObject CreateUIObject(string name, GameObject parent) { GameObject go = new GameObject(name); go.AddComponent(); 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; lbl.font = UnityEngine.Resources.GetBuiltinResource("Arial.ttf"); // Reset() is not called when playing. We still want the default font to be assigned //lbl.AssignDefaultFont(); } 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 CreateImage(Resources resources) { GameObject go = CreateUIElementRoot("Image", s_ImageElementSize); go.AddComponent(); return go; } public static GameObject CreateSwitch(Resources resources) { // Set up hierarchy GameObject switchRoot = CreateUIElementRoot("Switch", s_ThinElementSize); GameObject background = CreateUIObject("Background", switchRoot); GameObject on = CreateUIObject("On", background); GameObject off = CreateUIObject("Off", background); GameObject childLabel = CreateUIObject("Label", switchRoot); // Set up components var @switch = switchRoot.AddComponent(); @switch.transition = Selectable.Transition.None; @switch.isOn = true; Image bgImage = background.AddComponent(); bgImage.sprite = resources.standard; bgImage.type = Image.Type.Sliced; bgImage.color = s_DefaultSelectableColor; Image onImage = on.AddComponent(); //onImage.sprite = resources.checkmark; Image offImage = off.AddComponent(); Text label = childLabel.AddComponent(); label.text = "Switch"; SetDefaultTextValues(label); @switch.onGraphic = onImage; @switch.offGraphic = offImage; @switch.targetGraphic = bgImage; SetDefaultColorTransitionValues(@switch); RectTransform bgRect = background.GetComponent(); 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 onRect = on.GetComponent(); onRect.anchorMin = new Vector2(0.5f, 0.5f); onRect.anchorMax = new Vector2(0.5f, 0.5f); onRect.anchoredPosition = Vector2.zero; onRect.sizeDelta = new Vector2(20f, 20f); RectTransform offRect = on.GetComponent(); offRect.anchorMin = new Vector2(0.5f, 0.5f); offRect.anchorMax = new Vector2(0.5f, 0.5f); offRect.anchoredPosition = Vector2.zero; offRect.sizeDelta = new Vector2(20f, 20f); RectTransform labelRect = childLabel.GetComponent(); 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 switchRoot; } public static GameObject CreateScrollbar(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(); bgImage.sprite = resources.background; bgImage.type = Image.Type.Sliced; bgImage.color = s_DefaultSelectableColor; Image handleImage = handle.AddComponent(); handleImage.sprite = resources.standard; handleImage.type = Image.Type.Sliced; handleImage.color = s_DefaultSelectableColor; RectTransform sliderAreaRect = sliderArea.GetComponent(); sliderAreaRect.sizeDelta = new Vector2(-20, -20); sliderAreaRect.anchorMin = Vector2.zero; sliderAreaRect.anchorMax = Vector2.one; RectTransform handleRect = handle.GetComponent(); handleRect.sizeDelta = new Vector2(20, 20); Scrollbar scrollbar = scrollbarRoot.AddComponent(); scrollbar.handleRect = handleRect; scrollbar.targetGraphic = handleImage; SetDefaultColorTransitionValues(scrollbar); return scrollbarRoot; } public static GameObject CreateScrollView(Resources resources) { GameObject root = CreateUIElementRoot("Scroll View", new Vector2(200, 200)); GameObject viewport = CreateUIObject("Viewport", root); GameObject content = CreateUIObject("Content", viewport); GameObject template = CreateUIObject("Template", content); // Sub controls. GameObject hScrollbar = CreateScrollbar(resources); hScrollbar.name = "Scrollbar Horizontal"; SetParentAndAlign(hScrollbar, root); RectTransform hScrollbarRT = hScrollbar.GetComponent(); 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().SetDirection(Scrollbar.Direction.BottomToTop, true); RectTransform vScrollbarRT = vScrollbar.GetComponent(); 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(); 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(); contentRT.anchorMin = Vector2.up; contentRT.anchorMax = Vector2.one; contentRT.sizeDelta = new Vector2(0, 300); contentRT.pivot = Vector2.up; // Setup UI components. var scrollRect = root.AddComponent(); scrollRect.content = contentRT; scrollRect.viewport = viewportRT; scrollRect.horizontal = false; scrollRect.vertical = false; scrollRect.horizontalScrollbar = hScrollbar.GetComponent(); scrollRect.verticalScrollbar = vScrollbar.GetComponent(); scrollRect.horizontalScrollbarVisibility = KUIGrid.ScrollbarVisibility.AutoHideAndExpandViewport; scrollRect.verticalScrollbarVisibility = KUIGrid.ScrollbarVisibility.AutoHideAndExpandViewport; scrollRect.horizontalScrollbarSpacing = -3; scrollRect.verticalScrollbarSpacing = -3; //Image rootImage = root.AddComponent(); //rootImage.sprite = resources.background; //rootImage.type = Image.Type.Sliced; //rootImage.color = s_PanelColor; //viewport.AddComponent(); Mask viewportMask = viewport.AddComponent(); viewportMask.showMaskGraphic = false; Image viewportImage = viewport.AddComponent(); viewportImage.sprite = resources.mask; viewportImage.type = Image.Type.Sliced; scrollRect.uiPool = content.AddComponent(); content.AddComponent(); content.AddComponent(); return root; } public static GameObject CreateEmojiText(Resources resources) { GameObject go = CreateUIElementRoot("EmojiText", s_ThickElementSize); return go; } }