// ───────────────────────────────────────────────────────────────────────────── // WLEquipGui.RefLayout.cs — PD 레퍼런스 레이아웃(#881 · 2026-10-16) // // PD 원문: 「장비 아이템에 텍스트가 너무 많아. 첨부한 레퍼런스 게임과 같이 장비 UI 팝업의 레이아웃을 수정해줘」 // + 「인벤토리 화면도 예시 이미지와 같이 레이아웃을 개선하도록 해.」 // - 장비 상세 팝업 V2: 등급 리본 · 제목 띠 · 아이콘 + 「레벨: n/max」 · 능력치(+다음 레벨 증가분) + 합성 · 강등 작은 버튼 · 짧은 설명 · // 「등급 스킬」 목록(등급 색 점 · 잠긴 등급 = 자물쇠 + 흐림 · 마지막 줄 = 시너지) · 비용 줄 · 버튼 3(장비 · 레벨업 · 일괄 레벨업). // 예전 긴 글(FR 옵션 · 계산식 · 설명 문단)은 넣지 않는다. // - 인벤토리 머리줄: 부위 탭 대신 「정렬 · 나의 장비 · 합성」(부위 거르기 = 빈 슬롯 누르기 · 제목 누르면 전체). // 치수 · 색 · 글자 · 아이콘 = Resources/WL/WLEquipGui.json itemPopup · hub(C45). // ───────────────────────────────────────────────────────────────────────────── using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; using WL.PartSkill; namespace WL.Equip { public partial class WLEquipGui { WLGuiItemPopup IP; bool IpOn { get { return IP != null && IP.enabled != 0; } } TextMeshProUGUI _ipLevel, _ipStat, _ipDesc, _ipSection, _ipGold, _ipStone; Image _ipStatIcon, _ipGoldIcon, _ipStoneIcon; RectTransform _ipRowsRoot, _ipStoneGroup; sealed class IpRow { public RectTransform root; public Image dot, lockImg; public TextMeshProUGUI text; } readonly List _ipRows = new List(); public static int ItemPopupV2Refreshes; // ── 인벤토리 머리줄 · 정렬 ────────────────────────────────────────── int _sortMode; TextMeshProUGUI _sortLabel, _gridTitle; void BuildGridHeader() { var hdr = NewRT(_hub, "GridHeader"); hdr.anchorMin = new Vector2(0f, 1f); hdr.anchorMax = new Vector2(1f, 1f); hdr.pivot = new Vector2(0.5f, 1f); hdr.anchoredPosition = new Vector2(0f, -H.tabTop); hdr.sizeDelta = new Vector2(0f, H.headerH); var sortBtn = NewButton(hdr, SortLabel(), Spr("btnPrimary"), Color.white, H.headerBtnW, H.headerH, () => { _sortMode = (_sortMode + 1) % Mathf.Max(1, H.sortLabels != null ? H.sortLabels.Length : 1); Refresh(); }, H.headerBtnFontPx, DarkCol()); Place((RectTransform)sortBtn.transform, new Vector2(0f, 0.5f), new Vector2(H.edge, 0f), new Vector2(H.headerBtnW, H.headerH), new Vector2(0f, 0.5f)); _sortLabel = sortBtn.GetComponentInChildren(); _composeOpenBtn = NewButton(hdr, "합성", Spr("btnPrimary"), Color.white, H.headerBtnW, H.headerH, () => OpenCompose(-1), H.headerBtnFontPx, DarkCol()); Place((RectTransform)_composeOpenBtn.transform, new Vector2(1f, 0.5f), new Vector2(-H.edge, 0f), new Vector2(H.headerBtnW, H.headerH), new Vector2(1f, 0.5f)); _gridTitle = NewText(hdr, "Title", H.headerFontPx, TextAlignmentOptions.Midline, TextCol()); _gridTitle.fontStyle = FontStyles.Bold; ApplyOutline(_gridTitle); _gridTitle.raycastTarget = true; var trt = _gridTitle.rectTransform; trt.anchorMin = new Vector2(0f, 0f); trt.anchorMax = new Vector2(1f, 1f); trt.offsetMin = new Vector2(H.edge + H.headerBtnW + 16f, 0f); trt.offsetMax = new Vector2(-(H.edge + H.headerBtnW + 16f), 0f); var tb = _gridTitle.gameObject.AddComponent