#if UNITY_EDITOR using UnityEngine; using UnityEditor; using UnityEngine.UI; using TMPro; using Invector.vItemManager; using System.Collections.Generic; namespace Beyond { public class TrinketUIGenerator : MonoBehaviour { [MenuItem("Beyond/Generate Trinket UI")] public static void CreateTrinketUI() { try { // 1. Create Dedicated Canvas GameObject canvasObj = new GameObject("Trinket_UI_Canvas"); Canvas c = canvasObj.AddComponent(); c.renderMode = RenderMode.ScreenSpaceOverlay; c.sortingOrder = 99; CanvasScaler scaler = canvasObj.AddComponent(); scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; scaler.referenceResolution = new Vector2(1920, 1080); scaler.matchWidthOrHeight = 0.5f; // Balanced scaling canvasObj.AddComponent(); // Add Controller TrinketUIController uiController = canvasObj.AddComponent(); uiController.mainCanvas = c; //uiController.trinketType = bItemType.Trinkets; // 2. Main Panel Background GameObject mainPanel = CreateUIObject("Main_Panel", canvasObj.transform); Image panelImg = mainPanel.AddComponent(); panelImg.color = new Color(0.05f, 0.05f, 0.05f, 0.95f); StretchToFill(mainPanel.GetComponent()); // 3. Layout Container (The Parent of Left/Right) GameObject contentContainer = CreateUIObject("Content_Container", mainPanel.transform); StretchToFill(contentContainer.GetComponent()); RectTransform containerRect = contentContainer.GetComponent(); // Add margins so it doesn't touch screen edges containerRect.offsetMin = new Vector2(100, 100); containerRect.offsetMax = new Vector2(-100, -100); HorizontalLayoutGroup hLayout = contentContainer.AddComponent(); hLayout.childControlWidth = true; hLayout.childControlHeight = true; hLayout.childForceExpandWidth = true; // FORCE 50/50 SPLIT hLayout.childForceExpandHeight = true; hLayout.spacing = 50; // ========================================================= // LEFT SIDE: EQUIP AREA // ========================================================= GameObject leftPanel = CreateUIObject("Left_EquipArea", contentContainer.transform); leftPanel.AddComponent().color = new Color(1, 1, 1, 0.05f); bEquipArea equipArea = leftPanel.AddComponent(); equipArea.equipSlots = new List(); equipArea.itemTypes = new List() { bItemType.Trinkets }; // Vertical Layout for the Left Panel itself VerticalLayoutGroup leftVL = leftPanel.AddComponent(); leftVL.padding = new RectOffset(20, 20, 20, 20); leftVL.spacing = 20; leftVL.childControlHeight = true; leftVL.childControlWidth = true; leftVL.childForceExpandHeight = false; // Title TMP_Text titleTxt = CreateTMPObject("Equip_Title", leftPanel.transform, "Equipped Trinkets"); titleTxt.rectTransform.sizeDelta = new Vector2(0, 60); // Fixed height for title // References (Hidden Text) equipArea.displayNameText = CreateTextObject("EA_Name", "", leftPanel.transform); equipArea.displayDescriptionText = CreateTextObject("EA_Desc", "", leftPanel.transform); // Slot Container (Centered) GameObject slotsContainer = CreateUIObject("Slots_Container", leftPanel.transform); // Make slots container take up remaining space but center its children LayoutElement slotsLE = slotsContainer.AddComponent(); slotsLE.flexibleHeight = 1; HorizontalLayoutGroup slotsLayout = slotsContainer.AddComponent(); slotsLayout.childAlignment = TextAnchor.MiddleCenter; slotsLayout.spacing = 40; slotsLayout.childControlWidth = false; // Don't stretch slots slotsLayout.childControlHeight = false; // Create 3 Equip Slots for (int i = 0; i < 3; i++) { GameObject slotObj = CreateUIObject($"EquipSlot_{i}", slotsContainer.transform); Image slotImg = slotObj.AddComponent(); slotImg.color = new Color(0.2f, 0.2f, 0.2f, 1f); slotObj.GetComponent().sizeDelta = new Vector2(120, 120); slotObj.AddComponent(); bEquipSlot equipSlot = slotObj.AddComponent(); equipSlot.itemType = new List() { bItemType.Trinkets }; GameObject iconObj = CreateUIObject("Icon", slotObj.transform); StretchToFill(iconObj.GetComponent()); Image iconImg = iconObj.AddComponent(); iconImg.raycastTarget = false; iconImg.color = Color.clear; // Relies on bItemSlot to turn alpha back to 1 equipSlot.icon = iconImg; equipArea.equipSlots.Add(equipSlot); } // ========================================================= // RIGHT SIDE: ITEM WINDOW // ========================================================= GameObject rightPanel = CreateUIObject("Right_ItemWindow", contentContainer.transform); rightPanel.AddComponent().color = new Color(1, 1, 1, 0.05f); bItemWindow itemWindow = rightPanel.AddComponent(); // Vertical Layout for Right Panel VerticalLayoutGroup rightVL = rightPanel.AddComponent(); rightVL.padding = new RectOffset(20, 20, 20, 20); rightVL.spacing = 20; rightVL.childControlWidth = true; rightVL.childControlHeight = true; // 1. Scroll View (Takes up flexible space) GameObject scrollView = CreateUIObject("Scroll_View", rightPanel.transform); LayoutElement svLE = scrollView.AddComponent(); svLE.flexibleHeight = 1; // Take available space ScrollRect scrollRect = scrollView.AddComponent(); GameObject viewport = CreateUIObject("Viewport", scrollView.transform); StretchToFill(viewport.GetComponent()); viewport.AddComponent(); viewport.AddComponent().color = new Color(1,1,1,0.01f); GameObject content = CreateUIObject("Content", viewport.transform); RectTransform contentRT = content.GetComponent(); contentRT.anchorMin = new Vector2(0, 1); contentRT.anchorMax = new Vector2(1, 1); contentRT.pivot = new Vector2(0.5f, 1); GridLayoutGroup grid = content.AddComponent(); grid.cellSize = new Vector2(100, 100); grid.spacing = new Vector2(15, 15); ContentSizeFitter csf = content.AddComponent(); csf.verticalFit = ContentSizeFitter.FitMode.PreferredSize; scrollRect.content = contentRT; scrollRect.viewport = viewport.GetComponent(); itemWindow.contentWindow = contentRT; // 2. Details Panel (Fixed Height at bottom) GameObject detailsPanel = CreateUIObject("Details_Panel", rightPanel.transform); LayoutElement detailsLE = detailsPanel.AddComponent(); detailsLE.minHeight = 300; detailsLE.preferredHeight = 300; VerticalLayoutGroup detailsLayout = detailsPanel.AddComponent(); detailsLayout.spacing = 5; detailsLayout.childControlHeight = true; detailsLayout.childForceExpandHeight = false; // Details Components (Auto-Sizing Text) itemWindow.displayNameText = CreateTMPObject("Name_Text", detailsPanel.transform, "Item Name"); itemWindow.displayNameText.fontStyle = FontStyles.Bold; itemWindow.displayTypeText = CreateTextObject("Type_Text", "Item Type", detailsPanel.transform); itemWindow.displayAttributesText = CreateTextObject("Attributes_Text", "Stats...", detailsPanel.transform); itemWindow.displayAmountText = CreateTextObject("Amount_Text", "", detailsPanel.transform); // Description GameObject descContainer = CreateUIObject("Desc_Container", detailsPanel.transform); LayoutElement descLE = descContainer.AddComponent(); descLE.flexibleHeight = 1; // Description expands to fill gap descContainer.AddComponent(); itemWindow.displayDescriptionText = CreateTMPObject("Desc_Text", descContainer.transform, "Description..."); itemWindow.displayDescriptionText.alignment = TextAlignmentOptions.TopLeft; itemWindow.descriptionTransform = descContainer.GetComponent(); // Submit Button GameObject btnObj = CreateUIObject("Submit_Button", detailsPanel.transform); LayoutElement btnLE = btnObj.AddComponent(); btnLE.minHeight = 50; btnLE.preferredHeight = 50; btnObj.AddComponent().color = new Color(0, 0.6f, 0, 1); Button submitBtn = btnObj.AddComponent