diff --git a/Assets/Data/UI/ui_theme.csv b/Assets/Data/UI/ui_theme.csv index ee1188db..d1781758 100644 --- a/Assets/Data/UI/ui_theme.csv +++ b/Assets/Data/UI/ui_theme.csv @@ -382,4 +382,30 @@ color,subtab_off,,,,,,#36364E,서브탭 꺼짐(팩) color,row_front,,,,,,#D8412F,편성 전열 칩 color,row_back,,,,,,#2C6CE0,편성 후열 칩 color,select_line,,,,,,#FFE45C,편성 자리 선택 테두리 +color,panel_frame,,,,,,#3F4262,섹션 패널 프레임(바탕보다 밝게 · Fable 제안서 §3-6) +color,panel_field,,,,,,#262840,섹션 패널 안쪽 필드(바탕보다 어둡게) +color,panel_light,,,,,,#FFFFFF1A,섹션 패널 윗면 광택(흰 10 %) +color,panel_shadow,,,,,,#14121A59,섹션 패널 그림자(α 0.35 · 아래 6) +color,panel_pattern,,,,,,#FFFFFF0D,섹션 패널 문양 타일(흰 5 %) +color,panel_ground,,,,,,#0000002E,섹션 패널 바닥 그라데이션(검정 18 %) +color,band_title,,,,,,#121A33,섹션 제목 띠(Title_Tapered02 틴트) +color,row_band,,,,,,#FFFFFF0F,편성 전열·후열 밴드(흰 6 %) +color,divider,,,,,,#FFFFFF40,구분선(흰 25 %) +color,seat_plate,,,,,,#1A1C2EE6,편성 자리 받침(α 0.9) +color,seat_light,,,,,,#FFFFFF14,편성 자리 받침 윗면 광택(흰 8 %) +color,seat_dim,,,,,,#00000059,출전 중 카드 덮개(35 %) +skin,panel_frame,Frame/BorderFrame_Round20_White_Bg.png,,1,,,,섹션 패널 프레임(틴트) +skin,panel_field,Frame/BasicFrame_Round20.png,,1,,,,섹션 패널 필드(틴트) +skin,panel_light,Frame/BorderFrame_Round20_White_Light.png,,1,,,,섹션 패널 윗면 광택 +skin,band_title,Label/Title_Tapered02.png,,1,,,,섹션 제목 띠(틴트) +skin,row_band,Frame/BasicFrame_Round12.png,,0.625,,,,편성 열 밴드 +skin,divider,Label/Title_Line03_Divider.png,,1,,,,구분선(틴트) +skin,seat_plate,Frame/BasicFrame_Round12.png,,0.625,,,,편성 자리 받침 +skin,focus_line,Frame/ItemFrame00~03_FocusLine.png,,1,,,,선택 테두리(틴트) +skin,badge_circle,UI_Etc/Alert_Circle_s_Bg.png,,1,,,,작은 원 뱃지(수량·플러스 바탕) +skin,check_circle,Frame/BorderFrame_Circle75_Bg.png,,1,,,,체크 뱃지 원 +skin,scroll_fade,Assets/UI/GUIPro/ResourcesData/Sprites/Demo/Demo_Background/Glow_Panel01.png,,1,,,,스크롤 페이드·바닥 그라데이션(위 불투명 → 아래 투명 · 실측) +skin,btn_s_green,Button/Button01_s_Green.png,Button/Button01_s_White_Light1.png,1.8,4;3;4;10,0.35,,Secondary 녹(편성 저장) + 광택 +icon,plus_glyph,UI_Etc/ResourceBar_Single_Btn_Yellow2.png,,,,,,플러스 글리프(빈 자리 뱃지) +icon,check_badge,IconMisc/Icon_Check01.png,,,,,,체크(출전 중 뱃지) font,title,Assets/UI/GUIPro/ResourcesData/Fonts/Sen-ExtraBold.ttf,,,,,,제목·숫자(라틴 Sen · 한글 = 폴백 Malgun Gothic · PD 결정 전) diff --git a/Assets/Resources/UI/UITheme.asset b/Assets/Resources/UI/UITheme.asset index 516c290c..d4b7c0bc 100644 --- a/Assets/Resources/UI/UITheme.asset +++ b/Assets/Resources/UI/UITheme.asset @@ -467,6 +467,30 @@ MonoBehaviour: color: {r: 0.17254902, g: 0.42352942, b: 0.8784314, a: 1} - id: select_line color: {r: 1, g: 0.89411765, b: 0.36078432, a: 1} + - id: panel_frame + color: {r: 0.24705882, g: 0.25882354, b: 0.38431373, a: 1} + - id: panel_field + color: {r: 0.14901961, g: 0.15686275, b: 0.2509804, a: 1} + - id: panel_light + color: {r: 1, g: 1, b: 1, a: 0.101960786} + - id: panel_shadow + color: {r: 0.078431375, g: 0.07058824, b: 0.101960786, a: 0.34901962} + - id: panel_pattern + color: {r: 1, g: 1, b: 1, a: 0.050980393} + - id: panel_ground + color: {r: 0, g: 0, b: 0, a: 0.18039216} + - id: band_title + color: {r: 0.07058824, g: 0.101960786, b: 0.2, a: 1} + - id: row_band + color: {r: 1, g: 1, b: 1, a: 0.05882353} + - id: divider + color: {r: 1, g: 1, b: 1, a: 0.2509804} + - id: seat_plate + color: {r: 0.101960786, g: 0.10980392, b: 0.18039216, a: 0.9019608} + - id: seat_light + color: {r: 1, g: 1, b: 1, a: 0.078431375} + - id: seat_dim + color: {r: 0, g: 0, b: 0, a: 0.34901962} skins: - id: card pack: {fileID: 21300000, guid: 3070a6f23e6ca4273897acf1b7e8c5ce, type: 3} @@ -1035,6 +1059,90 @@ MonoBehaviour: ppu: 1 inset: {x: 6, y: 4, z: 6, w: 34} overlayAlpha: 0.2 + - id: panel_frame + pack: {fileID: 21300000, guid: 3070a6f23e6ca4273897acf1b7e8c5ce, type: 3} + samguk: {fileID: 0} + overlay: {fileID: 0} + ppu: 1 + inset: {x: 0, y: 0, z: 0, w: 0} + overlayAlpha: 1 + - id: panel_field + pack: {fileID: 21300000, guid: 6c9211bc1d90b4e35a3a080121e93d05, type: 3} + samguk: {fileID: 0} + overlay: {fileID: 0} + ppu: 1 + inset: {x: 0, y: 0, z: 0, w: 0} + overlayAlpha: 1 + - id: panel_light + pack: {fileID: 21300000, guid: d332162b7f97a44c8968e3570e42e325, type: 3} + samguk: {fileID: 0} + overlay: {fileID: 0} + ppu: 1 + inset: {x: 0, y: 0, z: 0, w: 0} + overlayAlpha: 1 + - id: band_title + pack: {fileID: 21300000, guid: f902adce59d3b4e8f993d11ba251e7d2, type: 3} + samguk: {fileID: 0} + overlay: {fileID: 0} + ppu: 1 + inset: {x: 0, y: 0, z: 0, w: 0} + overlayAlpha: 1 + - id: row_band + pack: {fileID: 21300000, guid: ae11cdefb6cd4436393f83b724ceb984, type: 3} + samguk: {fileID: 0} + overlay: {fileID: 0} + ppu: 0.625 + inset: {x: 0, y: 0, z: 0, w: 0} + overlayAlpha: 1 + - id: divider + pack: {fileID: 21300000, guid: 0c18e637bc71d4fc887d62f484000575, type: 3} + samguk: {fileID: 0} + overlay: {fileID: 0} + ppu: 1 + inset: {x: 0, y: 0, z: 0, w: 0} + overlayAlpha: 1 + - id: seat_plate + pack: {fileID: 21300000, guid: ae11cdefb6cd4436393f83b724ceb984, type: 3} + samguk: {fileID: 0} + overlay: {fileID: 0} + ppu: 0.625 + inset: {x: 0, y: 0, z: 0, w: 0} + overlayAlpha: 1 + - id: focus_line + pack: {fileID: 21300000, guid: d3ed2cc3ba43a449ca414493c0c2b8ae, type: 3} + samguk: {fileID: 0} + overlay: {fileID: 0} + ppu: 1 + inset: {x: 0, y: 0, z: 0, w: 0} + overlayAlpha: 1 + - id: badge_circle + pack: {fileID: 21300000, guid: fe62dbba2502e4766a8150113c51bef0, type: 3} + samguk: {fileID: 0} + overlay: {fileID: 0} + ppu: 1 + inset: {x: 0, y: 0, z: 0, w: 0} + overlayAlpha: 1 + - id: check_circle + pack: {fileID: 21300000, guid: 5a25a392cf93544beb9c3d76420b92ef, type: 3} + samguk: {fileID: 0} + overlay: {fileID: 0} + ppu: 1 + inset: {x: 0, y: 0, z: 0, w: 0} + overlayAlpha: 1 + - id: scroll_fade + pack: {fileID: 21300000, guid: c75fde6c7cc1847fcbe1fac91002ce1f, type: 3} + samguk: {fileID: 0} + overlay: {fileID: 0} + ppu: 1 + inset: {x: 0, y: 0, z: 0, w: 0} + overlayAlpha: 1 + - id: btn_s_green + pack: {fileID: 21300000, guid: 2d734a17e89824d30b1f014a9c1f5f60, type: 3} + samguk: {fileID: 0} + overlay: {fileID: 21300000, guid: 1047c0bcbda25440faf8332b872b3529, type: 3} + ppu: 1.8 + inset: {x: 4, y: 3, z: 4, w: 10} + overlayAlpha: 0.35 icons: - id: cur_gold pack: {fileID: 21300000, guid: 6d5687fb0dd3a428d9cd26a6f36c6d78, type: 3} @@ -1336,6 +1444,14 @@ MonoBehaviour: pack: {fileID: 21300000, guid: 30dce27e256a74aa797da5e70d1c9a08, type: 3} samguk: {fileID: 0} tint: {r: 1, g: 1, b: 1, a: 1} + - id: plus_glyph + pack: {fileID: 21300000, guid: a707b1e1252f042c58519d2882ee2651, type: 3} + samguk: {fileID: 0} + tint: {r: 1, g: 1, b: 1, a: 1} + - id: check_badge + pack: {fileID: 21300000, guid: 5368592eacfda44c191265e7475562df, type: 3} + samguk: {fileID: 0} + tint: {r: 1, g: 1, b: 1, a: 1} - id: tile_bridge pack: {fileID: 0} samguk: {fileID: 21300000, guid: 8e5bf7eb1e300474785ff2781eeb5093, type: 3} diff --git a/Assets/Scripts/OutGame/UI/FormationScreen.cs b/Assets/Scripts/OutGame/UI/FormationScreen.cs index 8fd02b72..758a2e48 100644 --- a/Assets/Scripts/OutGame/UI/FormationScreen.cs +++ b/Assets/Scripts/OutGame/UI/FormationScreen.cs @@ -39,14 +39,29 @@ namespace TKS.OutGame get { return dirty; } } - // 자리 카드 = 영웅 목록 카드(320×431) × SeatScale · 보유 목록 카드 × ListScale(PD 2026-11-09 「변경된 영웅 리스트 반영 · 편성 유닛 정보를 목록·상세 UI 참고해 깔끔하게」) - const float SeatScale = 0.70f; + // Fable 제안서 §3(2026-11-09 · PD 「편성 메뉴와 영웅 목록 프레임 구분 · 디자인 요소 · 카드 목록 완성도」) — 본문 좌표 = 절대 y − 224 + // 섹션 A 「출전 편성」 패널(절대 236~1010) · 홈 16 · 섹션 B 「보유 영웅」 패널(1026~1760) · 자리 = 목록 카드 × SeatScale · 보유 = × ListScale + const float SeatScale = 0.62f; const float ListScale = 0.72f; - const float SeatGap = 24f; - const float BoardTop = 122f; - const float BoardH = 680f; + const float SeatPitch = 222f; // 자리 중심 간격(198 + 24) + const float SeatCenterX = 608f; // 자리 줄 가운데(절대 x · 왼쪽 라벨 칸만큼 오른쪽) + const float PanelX = 24f, PanelW = 1032f; + const float PanelA_Y = 12f, PanelA_H = 774f; // 절대 236~1010 + const float PanelB_Y = 802f, PanelB_H = 734f; // 절대 1026~1760 + const float FrontY = 180f, BackY = 483f; // 자리 위 끝(패널 A 기준 · 절대 416 / 719) Text countText; Text filterText; + Text ownedCount; + Text powerText; + Image saveImg; + Text saveText; + Image saveDot; + readonly List presetTails = new List(); + + static RectTransform At(Transform p, string name, float x, float y, float w, float h) + { + return UiKit.Rect(name, p, new Vector2(0f, 1f), new Vector2(0f, 1f), new Vector2(x, -y), new Vector2(w, h)); + } public override void Build() { @@ -55,37 +70,68 @@ namespace TKS.OutGame // 바탕 = 영웅 목록과 같음(진남 + 재화 바 뒤 띠) · 헤더 오른쪽 사선 칸 = 출전 n / 칸 수 UiKit.Paint(UiKit.Fill("ListBg", Rt), UiKit.Col("list_bg", UiKit.Bg), false); UiKit.Paint(UiKit.TopBand("ListTop", Rt, 0f, OutGameRoot.TopBarH), UiKit.Col("band_top", UiKit.Bg), false); - var head = Header("편성", "", true); // 부제 삭제(설계서 §2-5) + var head = Header("편성", "", true); var ob = UiKit.Rect("Oblique", head, new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), Vector2.zero, new Vector2(239f, OutGameRoot.HeaderH - 7f)); UiKit.Skin(ob, "oblique", UiKit.Col("oblique", UiKit.White)); countText = UiKit.Title(UiKit.Label(ob, "", 40, UiKit.Col("count_text", UiKit.Dark), TextAnchor.MiddleCenter, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(12f, 0f), new Vector2(220f, 80f))); countText.horizontalOverflow = HorizontalWrapMode.Overflow; - var body = Body(); + // 본문 = 1080 폭 틀(낮은 화면에서도 가운데) + var body = UiKit.Rect("Mock", Body(), new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), Vector2.zero, new Vector2(OutGameRoot.Reference.x, OutGameRoot.BodyH)); - // 프리셋 3(팩 서브탭) + 제약 칩 + // ===== 섹션 A 「출전 편성」 ===== + RectTransform a; + UiKit.SectionPanel(body, "PanelA", PanelX, PanelA_Y, PanelW, PanelA_H, true, true, out a); + UiKit.SectionTitle(a, "출전 편성"); + // 제약 칩(ⓘ = 편성 안내 팝업 · 안내 문장 이관) + var lim = At(a, "Limit", 592f, 8f, 230f, 56f); + UiKit.Skin(lim, "chip", UiKit.Col("chip_dark", UiKit.Dark), true); + UiKit.Layer(lim, "Line", "chip_line", UiKit.Col("chip_line", Color.clear), 4f, 4f, 4f, 4f); + UiKit.Label(lim, "편성 제약 없음", 26, UiKit.Col("text_soft", UiKit.InkSoft), TextAnchor.MiddleLeft, new Vector2(0f, 0.5f), new Vector2(0f, 0.5f), new Vector2(18f, 0f), new Vector2(170f, 50f)).horizontalOverflow = HorizontalWrapMode.Overflow; + UiKit.Icon(lim, "info", new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), new Vector2(-16f, 0f), 32f); + lim.gameObject.AddComponent