영웅 목록 출전 칩 · 빈 카드 문양 + 편성 화면 = 영웅 목록 카드로 재구성(#1104 · PD 2026-11-09)
- 영웅 목록: 「출전」 = 깃발 아래 왼쪽 가장자리 · 빈 카드 = 팩 CardFrame01_Empty 원본 그대로(Bg #303146 마스크 안 Bg_d_Pattern 타일 #2D2F42 · 테두리 #1A1B27 · 얼굴 #252738) — 이전엔 바탕을 #2E2F43 로 바꿔 무늬가 안 보였음 - 편성: 바탕·헤더 = 영웅 목록과 같음(진남 · 사선 칸 「출전 n/5」) · 프리셋 = 팩 서브탭(Button_Round10 + 광택 · 선택 붉은 옻칠) · 자리 5 = 영웅 목록 카드 × 0.70(빈 자리 = 빈 카드 + 「+ 빈 자리」 · 고른 자리 = 노란 테두리) · 자리 판 #282A3E · 전열/후열 평행사변형 칩 · 보유 목록 = 같은 카드 × 0.72 · 4열 · 레벨 높은 순 · 「장수 ▼」 전환 · 출전 칩 - CollectionCards.CardIn / EmptyIn(원래 크기 카드를 배율로 넣기) - 테마: card_empty · card_empty_face 원본값 · formation_field · 서브탭 스킨 · subtab_off · row_front/back · select_line 테스트 117/117 · console error 0 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
f0d0a90a1f
commit
939275d105
|
|
@ -300,7 +300,7 @@ icon,lv_badge_s,IconMisc/Icon_Badge03_Blue.png,,,,,,작은 레벨 배지(카드)
|
||||||
color,band_top,,,,,,#5461FF,목록형 상단 띠(재화 바 뒤 · 설계서 §2-2 B)
|
color,band_top,,,,,,#5461FF,목록형 상단 띠(재화 바 뒤 · 설계서 §2-2 B)
|
||||||
color,card_bottom,,,,,,#1B1A1FE6,영웅 카드 이름 띠
|
color,card_bottom,,,,,,#1B1A1FE6,영웅 카드 이름 띠
|
||||||
color,card_border,,,,,,#000000,영웅 카드 테두리
|
color,card_border,,,,,,#000000,영웅 카드 테두리
|
||||||
color,card_empty,,,,,,#2E2F43,빈·미보유 카드(레퍼런스 실측)
|
color,card_empty,,,,,,#303146,빈·미보유 카드(팩 CardFrame01_Empty Bg 원본값)
|
||||||
color,card_empty_pattern,,,,,,#2D2F42,빈·미보유 카드 문양
|
color,card_empty_pattern,,,,,,#2D2F42,빈·미보유 카드 문양
|
||||||
color,card_empty_border,,,,,,#1A1B27,빈·미보유 카드 테두리
|
color,card_empty_border,,,,,,#1A1B27,빈·미보유 카드 테두리
|
||||||
color,card_dim,,,,,,#000000A0,미보유 초상 어둡게
|
color,card_dim,,,,,,#000000A0,미보유 초상 어둡게
|
||||||
|
|
@ -354,7 +354,7 @@ color,tre_none_light,,,,,,#1A64C080,보물 칸 미보유 윗면
|
||||||
color,tre_none_glow,,,,,,#00000000,보물 칸 미보유 빛(없음)
|
color,tre_none_glow,,,,,,#00000000,보물 칸 미보유 빛(없음)
|
||||||
color,tre_none_icon,,,,,,#FFFFFF40,보물 칸 미보유 실루엣(흰 25 %)
|
color,tre_none_icon,,,,,,#FFFFFF40,보물 칸 미보유 실루엣(흰 25 %)
|
||||||
icon,face,IconMisc/Icon_Face.png,,,,,,빈 자리 얼굴 실루엣
|
icon,face,IconMisc/Icon_Face.png,,,,,,빈 자리 얼굴 실루엣
|
||||||
color,formation_field,,,,,,#0E7FF2,편성 필드 바탕(팩 Equipment)
|
color,formation_field,,,,,,#282A3E,편성 자리 판(영웅 목록 바탕보다 어둡게)
|
||||||
color,seat_empty,,,,,,#0B69D6,편성 빈 자리 원
|
color,seat_empty,,,,,,#0B69D6,편성 빈 자리 원
|
||||||
color,seat_empty_face,,,,,,#2695E6,편성 빈 자리 얼굴
|
color,seat_empty_face,,,,,,#2695E6,편성 빈 자리 얼굴
|
||||||
skin,card4_bg,Frame/CardFrame04_Bg.png,,1,,,,연무장 카드 바탕(틴트)
|
skin,card4_bg,Frame/CardFrame04_Bg.png,,1,,,,연무장 카드 바탕(틴트)
|
||||||
|
|
@ -376,5 +376,10 @@ icon,lv_badge_max,IconMisc/Icon_Badge03_Yellow.png,,,,,,최고 레벨 배지(카
|
||||||
color,list_bg,,,,,,#34374F,목록 화면 바탕(영웅 목록 · 레퍼런스 = 팩 Collection 실측)
|
color,list_bg,,,,,,#34374F,목록 화면 바탕(영웅 목록 · 레퍼런스 = 팩 Collection 실측)
|
||||||
color,oblique,,,,,,#D8E8FF,헤더 사선 칸
|
color,oblique,,,,,,#D8E8FF,헤더 사선 칸
|
||||||
color,count_text,,,,,,#1E1E2A,사선 칸 수량 글자
|
color,count_text,,,,,,#1E1E2A,사선 칸 수량 글자
|
||||||
color,card_empty_face,,,,,,#262739,빈 카드 얼굴 실루엣
|
color,card_empty_face,,,,,,#252738,빈 카드 얼굴 실루엣(팩 원본값)
|
||||||
|
skin,subtab,Button/Button_Round10_Bg.png,Button/Button_Round10_Light.png,1,6;4;6;34,0.2,,서브탭(프리셋 등 · 틴트 + 윗면 광택)
|
||||||
|
color,subtab_off,,,,,,#36364E,서브탭 꺼짐(팩)
|
||||||
|
color,row_front,,,,,,#D8412F,편성 전열 칩
|
||||||
|
color,row_back,,,,,,#2C6CE0,편성 후열 칩
|
||||||
|
color,select_line,,,,,,#FFE45C,편성 자리 선택 테두리
|
||||||
font,title,Assets/UI/GUIPro/ResourcesData/Fonts/Sen-ExtraBold.ttf,,,,,,제목·숫자(라틴 Sen · 한글 = 폴백 Malgun Gothic · PD 결정 전)
|
font,title,Assets/UI/GUIPro/ResourcesData/Fonts/Sen-ExtraBold.ttf,,,,,,제목·숫자(라틴 Sen · 한글 = 폴백 Malgun Gothic · PD 결정 전)
|
||||||
|
|
|
||||||
|
|
|
@ -328,7 +328,7 @@ MonoBehaviour:
|
||||||
- id: card_border
|
- id: card_border
|
||||||
color: {r: 0, g: 0, b: 0, a: 1}
|
color: {r: 0, g: 0, b: 0, a: 1}
|
||||||
- id: card_empty
|
- id: card_empty
|
||||||
color: {r: 0.18039216, g: 0.18431373, b: 0.2627451, a: 1}
|
color: {r: 0.1882353, g: 0.19215687, b: 0.27450982, a: 1}
|
||||||
- id: card_empty_pattern
|
- id: card_empty_pattern
|
||||||
color: {r: 0.1764706, g: 0.18431373, b: 0.25882354, a: 1}
|
color: {r: 0.1764706, g: 0.18431373, b: 0.25882354, a: 1}
|
||||||
- id: card_empty_border
|
- id: card_empty_border
|
||||||
|
|
@ -434,7 +434,7 @@ MonoBehaviour:
|
||||||
- id: tre_none_icon
|
- id: tre_none_icon
|
||||||
color: {r: 1, g: 1, b: 1, a: 0.2509804}
|
color: {r: 1, g: 1, b: 1, a: 0.2509804}
|
||||||
- id: formation_field
|
- id: formation_field
|
||||||
color: {r: 0.05490196, g: 0.49803922, b: 0.9490196, a: 1}
|
color: {r: 0.15686275, g: 0.16470589, b: 0.24313726, a: 1}
|
||||||
- id: seat_empty
|
- id: seat_empty
|
||||||
color: {r: 0.043137256, g: 0.4117647, b: 0.8392157, a: 1}
|
color: {r: 0.043137256, g: 0.4117647, b: 0.8392157, a: 1}
|
||||||
- id: seat_empty_face
|
- id: seat_empty_face
|
||||||
|
|
@ -458,7 +458,15 @@ MonoBehaviour:
|
||||||
- id: count_text
|
- id: count_text
|
||||||
color: {r: 0.11764706, g: 0.11764706, b: 0.16470589, a: 1}
|
color: {r: 0.11764706, g: 0.11764706, b: 0.16470589, a: 1}
|
||||||
- id: card_empty_face
|
- id: card_empty_face
|
||||||
color: {r: 0.14901961, g: 0.15294118, b: 0.22352941, a: 1}
|
color: {r: 0.14509805, g: 0.15294118, b: 0.21960784, a: 1}
|
||||||
|
- id: subtab_off
|
||||||
|
color: {r: 0.21176471, g: 0.21176471, b: 0.30588236, a: 1}
|
||||||
|
- id: row_front
|
||||||
|
color: {r: 0.84705883, g: 0.25490198, b: 0.18431373, a: 1}
|
||||||
|
- id: row_back
|
||||||
|
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}
|
||||||
skins:
|
skins:
|
||||||
- id: card
|
- id: card
|
||||||
pack: {fileID: 21300000, guid: 3070a6f23e6ca4273897acf1b7e8c5ce, type: 3}
|
pack: {fileID: 21300000, guid: 3070a6f23e6ca4273897acf1b7e8c5ce, type: 3}
|
||||||
|
|
@ -1020,6 +1028,13 @@ MonoBehaviour:
|
||||||
ppu: 1
|
ppu: 1
|
||||||
inset: {x: 0, y: 0, z: 0, w: 0}
|
inset: {x: 0, y: 0, z: 0, w: 0}
|
||||||
overlayAlpha: 1
|
overlayAlpha: 1
|
||||||
|
- id: subtab
|
||||||
|
pack: {fileID: 21300000, guid: ee30b302c44c546158237019ae729a1b, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
overlay: {fileID: 21300000, guid: 1890af01f2abc49128fb21bde6734a57, type: 3}
|
||||||
|
ppu: 1
|
||||||
|
inset: {x: 6, y: 4, z: 6, w: 34}
|
||||||
|
overlayAlpha: 0.2
|
||||||
icons:
|
icons:
|
||||||
- id: cur_gold
|
- id: cur_gold
|
||||||
pack: {fileID: 21300000, guid: 6d5687fb0dd3a428d9cd26a6f36c6d78, type: 3}
|
pack: {fileID: 21300000, guid: 6d5687fb0dd3a428d9cd26a6f36c6d78, type: 3}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ using UnityEngine.UI;
|
||||||
namespace TKS.OutGame
|
namespace TKS.OutGame
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 편성(img08 · 기획 S12 v3) — 프리셋 3 · 전열 3(윗줄)·후열 2(아랫줄) 원형 자리 · 하단 보유 목록(장수|병사 · 2줄 카드 · 출전 중) ·
|
/// 편성(img08 · 기획 S12 v3) — 프리셋 3 · 전열 3(윗줄)·후열 2(아랫줄) 자리 = 영웅 목록 카드(축소) · 하단 보유 목록(장수 ▼ 전환 · 같은 카드 4열 · 출전) ·
|
||||||
/// 탭(자리 고르기 → 카드 탭 = 넣기 · 같은 자리 두 번 = 빼기 · 다른 자리 = 맞바꾸기) · 끌기(자리 ↔ 자리 · 카드 → 자리) · 저장 = 그 프리셋을 출전 편성으로.
|
/// 탭(자리 고르기 → 카드 탭 = 넣기 · 같은 자리 두 번 = 빼기 · 다른 자리 = 맞바꾸기) · 끌기(자리 ↔ 자리 · 카드 → 자리) · 저장 = 그 프리셋을 출전 편성으로.
|
||||||
/// 빈 칸 허용 · 최소 1 · 편성 제약 없음(D4).
|
/// 빈 칸 허용 · 최소 1 · 편성 제약 없음(D4).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -20,8 +20,6 @@ namespace TKS.OutGame
|
||||||
|
|
||||||
readonly List<Button> presetBtns = new List<Button>();
|
readonly List<Button> presetBtns = new List<Button>();
|
||||||
readonly List<RectTransform> slots = new List<RectTransform>();
|
readonly List<RectTransform> slots = new List<RectTransform>();
|
||||||
Button tabHero;
|
|
||||||
Button tabSoldier;
|
|
||||||
RectTransform list;
|
RectTransform list;
|
||||||
ScrollRect scroll;
|
ScrollRect scroll;
|
||||||
RectTransform ghost;
|
RectTransform ghost;
|
||||||
|
|
@ -41,38 +39,55 @@ namespace TKS.OutGame
|
||||||
get { return dirty; }
|
get { return dirty; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 자리 카드 = 영웅 목록 카드(320×431) × SeatScale · 보유 목록 카드 × ListScale(PD 2026-11-09 「변경된 영웅 리스트 반영 · 편성 유닛 정보를 목록·상세 UI 참고해 깔끔하게」)
|
||||||
|
const float SeatScale = 0.70f;
|
||||||
|
const float ListScale = 0.72f;
|
||||||
|
const float SeatGap = 24f;
|
||||||
|
const float BoardTop = 122f;
|
||||||
|
const float BoardH = 680f;
|
||||||
|
Text countText;
|
||||||
|
Text filterText;
|
||||||
|
|
||||||
public override void Build()
|
public override void Build()
|
||||||
{
|
{
|
||||||
int n = Root.Battle.Config.playerSpawnPoints.Length;
|
int n = Root.Battle.Config.playerSpawnPoints.Length;
|
||||||
int front = Mathf.Clamp(S.Db.Economy.FormationFront, 0, n);
|
int front = Mathf.Clamp(S.Db.Economy.FormationFront, 0, n);
|
||||||
Header("편성", "", true); // 부제 삭제(설계서 §2-5)
|
// 바탕 = 영웅 목록과 같음(진남 + 재화 바 뒤 띠) · 헤더 오른쪽 사선 칸 = 출전 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 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();
|
var body = Body();
|
||||||
|
|
||||||
|
// 프리셋 3(팩 서브탭) + 제약 칩
|
||||||
for (int i = 0; i < S.Save.presets.Count; i++)
|
for (int i = 0; i < S.Save.presets.Count; i++)
|
||||||
{
|
{
|
||||||
int k = i;
|
int k = i;
|
||||||
presetBtns.Add(UiKit.Btn("Preset" + i, body, "프리셋 " + (i + 1), 34, UiKit.Paper, UiKit.Ink, new Vector2(0f, 1f), new Vector2(0f, 1f), new Vector2(24f + i * 226f, -18f), new Vector2(210f, 84f), () => LoadPreset(k)));
|
presetBtns.Add(SubTab("Preset" + i, body, "프리셋 " + (i + 1), new Vector2(24f + i * 226f, -18f), new Vector2(210f, 84f), () => LoadPreset(k)));
|
||||||
}
|
}
|
||||||
var chip = UiKit.Box("Free", body, new Vector2(1f, 1f), new Vector2(1f, 1f), new Vector2(-24f, -24f), new Vector2(270f, 72f), UiKit.Dark);
|
var chip = UiKit.Skin(UiKit.Rect("Free", body, new Vector2(1f, 1f), new Vector2(1f, 1f), new Vector2(-24f, -24f), new Vector2(270f, 72f)), "chip", UiKit.Col("chip_dark", UiKit.Dark));
|
||||||
UiKit.FillLabel(chip.transform, "편성 제약 없음", 30, UiKit.White);
|
UiKit.Title(UiKit.FillLabel(chip.transform, "편성 제약 없음", 30, UiKit.White), false);
|
||||||
|
|
||||||
var board = UiKit.TopBand("Board", body, 122f, 600f, 24f, 24f);
|
// 자리 판 = 전열(윗줄) · 후열(아랫줄) · 자리 = 목록과 같은 카드
|
||||||
var bimg = UiKit.Paint(board, UiKit.Col("formation_field", UiKit.Paper)); // 필드 = 팩 Equipment 파랑(설계서 §3③)
|
float sw = CollectionCards.CellSize.x * SeatScale, sh = CollectionCards.CellSize.y * SeatScale;
|
||||||
UiKit.Border(bimg, UiKit.Line, 3f);
|
var board = UiKit.TopBand("Board", body, BoardTop, BoardH, 24f, 24f);
|
||||||
Pill(board, "전열", UiKit.Red, -116f);
|
UiKit.Skin(board, "card", UiKit.Col("formation_field", UiKit.Paper));
|
||||||
Pill(board, "후열", UiKit.Dark, -380f);
|
Pill(board, "전열", UiKit.Col("row_front", UiKit.Red), -(20f + sh / 2f));
|
||||||
UiKit.Label(board, "탭·드래그 = 자리 교체 · 같은 자리 두 번 탭 = 빼기", 24, UiKit.InkSoft, TextAnchor.MiddleLeft, new Vector2(0f, 0f), new Vector2(0f, 0f), new Vector2(24f, 8f), new Vector2(900f, 40f), false);
|
Pill(board, "후열", UiKit.Col("row_back", UiKit.Dark), -(20f + sh + 20f + sh / 2f));
|
||||||
|
UiKit.Label(board, "탭·드래그 = 자리 교체 · 같은 자리 두 번 탭 = 빼기", 24, UiKit.InkSoft, TextAnchor.MiddleLeft, new Vector2(0f, 0f), new Vector2(0f, 0f), new Vector2(24f, 2f), new Vector2(900f, 34f), false);
|
||||||
for (int i = 0; i < n; i++)
|
for (int i = 0; i < n; i++)
|
||||||
{
|
{
|
||||||
bool f = i < front;
|
bool f = i < front;
|
||||||
int col = f ? i : i - front;
|
int col = f ? i : i - front;
|
||||||
int cnt = f ? front : n - front;
|
int cnt = f ? front : n - front;
|
||||||
float gap = 264f;
|
float x = 60f + (col - (cnt - 1) / 2f) * (sw + SeatGap);
|
||||||
float x = 70f + (col - (cnt - 1) / 2f) * gap;
|
float y = f ? -20f : -(20f + sh + 20f);
|
||||||
float y = f ? -30f : -290f;
|
var s = UiKit.Rect("Slot" + i, board, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(x, y), new Vector2(sw, sh));
|
||||||
var s = UiKit.Rect("Slot" + i, board, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(x, y), new Vector2(230f, 250f));
|
|
||||||
var hit = s.gameObject.AddComponent<Image>();
|
var hit = s.gameObject.AddComponent<Image>();
|
||||||
hit.color = new Color(1f, 1f, 1f, 0f);
|
hit.color = Color.clear;
|
||||||
hit.raycastTarget = true;
|
hit.raycastTarget = true;
|
||||||
var td = s.gameObject.AddComponent<TapDrag>();
|
var td = s.gameObject.AddComponent<TapDrag>();
|
||||||
td.AnyDirection = true;
|
td.AnyDirection = true;
|
||||||
|
|
@ -84,17 +99,37 @@ namespace TKS.OutGame
|
||||||
slots.Add(s);
|
slots.Add(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
var row = UiKit.TopBand("ListHead", body, 738f, 84f, 24f, 24f);
|
// 보유 목록 머리 = 제목 · 「장수 ▼」(영웅 목록과 같은 전환) · 저장
|
||||||
UiKit.Label(row, "보유 영웅", 42, UiKit.Ink, TextAnchor.MiddleLeft, new Vector2(0f, 0.5f), new Vector2(0f, 0.5f), Vector2.zero, new Vector2(300f, 70f));
|
var row = UiKit.TopBand("ListHead", body, BoardTop + BoardH + 16f, 74f, 24f, 24f);
|
||||||
tabHero = UiKit.Btn("TabHero", row, "장수", 32, UiKit.Red, UiKit.White, new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), new Vector2(-440f, 0f), new Vector2(190f, 76f), () => { soldiers = false; Refresh(); });
|
UiKit.Title(UiKit.Label(row, "보유 영웅", 40, UiKit.White, TextAnchor.MiddleLeft, new Vector2(0f, 0.5f), new Vector2(0f, 0.5f), new Vector2(4f, 0f), new Vector2(300f, 70f)), true);
|
||||||
tabSoldier = UiKit.Btn("TabSoldier", row, "병사", 32, UiKit.Paper, UiKit.Ink, new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), new Vector2(-240f, 0f), new Vector2(190f, 76f), () => { soldiers = true; Refresh(); });
|
var pick = UiKit.Rect("Filter", row, new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), new Vector2(-244f, 0f), new Vector2(220f, 74f));
|
||||||
UiKit.Btn("Save", row, "저장", 34, UiKit.Red, UiKit.White, new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), Vector2.zero, new Vector2(220f, 76f), SaveNow);
|
pick.gameObject.AddComponent<Image>().color = Color.clear;
|
||||||
list = UiKit.ScrollGrid("List", body, 24f, 24f, 836f, 12f, new Vector2(506f, 150f), new Vector2(20f, 18f), 2, out scroll);
|
pick.gameObject.AddComponent<Button>().onClick.AddListener(() =>
|
||||||
|
{
|
||||||
|
soldiers = !soldiers;
|
||||||
|
Refresh();
|
||||||
|
});
|
||||||
|
filterText = UiKit.Title(UiKit.Label(pick, "", 38, UiKit.InkSoft, TextAnchor.MiddleRight, new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), new Vector2(-50f, 2f), new Vector2(160f, 70f)));
|
||||||
|
UiKit.DropShadow(UiKit.Icon(pick, "arrow_down", new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), new Vector2(-6f, 0f), 38f), 3f);
|
||||||
|
UiKit.Btn("Save", row, "저장", 34, UiKit.Red, UiKit.White, new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), Vector2.zero, new Vector2(210f, 76f), SaveNow);
|
||||||
|
var cell = CollectionCards.CellSize * ListScale;
|
||||||
|
float side = (OutGameRoot.Reference.x - cell.x * 4f - 17f * 3f) / 2f;
|
||||||
|
list = UiKit.ScrollGrid("List", body, side, side, BoardTop + BoardH + 100f, 0f, cell, new Vector2(17f, 16f), 4, out scroll);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>서브탭(팩 Button_Round10 + 윗면 광택 · 선택 = 붉은 옻칠).</summary>
|
||||||
|
static Button SubTab(string name, Transform parent, string label, Vector2 pos, Vector2 size, System.Action onClick)
|
||||||
|
{
|
||||||
|
var img = UiKit.Skin(UiKit.Rect(name, parent, new Vector2(0f, 1f), new Vector2(0f, 1f), pos, size), UISkin.Has("subtab") ? "subtab" : "button", UiKit.Col("subtab_off", UiKit.Paper), true);
|
||||||
|
var b = img.gameObject.AddComponent<Button>();
|
||||||
|
b.onClick.AddListener(() => onClick());
|
||||||
|
UiKit.Title(UiKit.FillLabel(img.transform, label, 34, UiKit.White, TextAnchor.MiddleCenter, true, 8f), true);
|
||||||
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Pill(RectTransform board, string label, Color c, float y)
|
static void Pill(RectTransform board, string label, Color c, float y)
|
||||||
{
|
{
|
||||||
// 전열·후열 라벨 = 평행사변형 칩(설계서 §3③ · 전열 = 붉은 · 후열 = 어두운)
|
// 전열·후열 라벨 = 평행사변형 칩(설계서 §3③)
|
||||||
var p = UISkin.Has("para_orange")
|
var p = UISkin.Has("para_orange")
|
||||||
? UiKit.Skin(UiKit.Rect("Row_" + label, board, new Vector2(0f, 1f), new Vector2(0f, 0.5f), new Vector2(20f, y), new Vector2(140f, 62f)), "para_orange", c)
|
? UiKit.Skin(UiKit.Rect("Row_" + label, board, new Vector2(0f, 1f), new Vector2(0f, 0.5f), new Vector2(20f, y), new Vector2(140f, 62f)), "para_orange", c)
|
||||||
: UiKit.Box("Row_" + label, board, new Vector2(0f, 1f), new Vector2(0f, 0.5f), new Vector2(20f, y), new Vector2(140f, 62f), c);
|
: UiKit.Box("Row_" + label, board, new Vector2(0f, 1f), new Vector2(0f, 0.5f), new Vector2(20f, y), new Vector2(140f, 62f), c);
|
||||||
|
|
@ -278,54 +313,44 @@ namespace TKS.OutGame
|
||||||
for (int i = 0; i < presetBtns.Count; i++)
|
for (int i = 0; i < presetBtns.Count; i++)
|
||||||
{
|
{
|
||||||
bool on = i == preset;
|
bool on = i == preset;
|
||||||
presetBtns[i].GetComponent<Image>().color = on ? UiKit.Red : UiKit.Paper;
|
presetBtns[i].GetComponent<Image>().color = on ? UiKit.Red : UiKit.Col("subtab_off", UiKit.Paper);
|
||||||
var t = UiKit.LabelOf(presetBtns[i]);
|
var t = UiKit.LabelOf(presetBtns[i]);
|
||||||
t.color = on ? UiKit.White : UiKit.Ink;
|
t.color = UiKit.White;
|
||||||
t.text = "프리셋 " + (i + 1) + (i == S.Save.presetIdx ? " <size=22>출전</size>" : "") + (on && dirty ? "*" : "");
|
t.text = "프리셋 " + (i + 1) + (i == S.Save.presetIdx ? " <size=22>출전</size>" : "") + (on && dirty ? "*" : "");
|
||||||
}
|
}
|
||||||
|
countText.text = "출전 " + Filled() + "/" + work.Count;
|
||||||
|
|
||||||
|
// 자리 = 목록과 같은 카드(배율) · 빈 자리 = 빈 카드 · 고른 자리 = 노란 테두리
|
||||||
for (int i = 0; i < slots.Count; i++)
|
for (int i = 0; i < slots.Count; i++)
|
||||||
{
|
{
|
||||||
var s = slots[i];
|
var s = slots[i];
|
||||||
UiKit.Clear(s);
|
UiKit.Clear(s);
|
||||||
var id = i < work.Count ? work[i] : "";
|
var id = i < work.Count ? work[i] : "";
|
||||||
var h = S.Def(id);
|
var h = S.Def(id);
|
||||||
if (i == selected) UiKit.Dot("Select", s, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, 12f), 236f, UiKit.Star);
|
if (i == selected) UiKit.Layer(s, "Select", "card_border", UiKit.Col("select_line", UiKit.Star), -7f, -7f, -7f, -7f);
|
||||||
if (h != null)
|
if (h != null) CollectionCards.CardIn(s, S, h, false, null, SeatScale);
|
||||||
{
|
|
||||||
// 자리(설계서 §3③) = 등급 빛 원 + 등급 색 원 틀 초상 + 병종 원 + 이름 꼬리 칩
|
|
||||||
var hs = S.Save.Hero(id);
|
|
||||||
string g = h.isSoldier || hs == null || string.IsNullOrEmpty(hs.grade) ? "white" : hs.grade;
|
|
||||||
var gc = UiKit.Col("grade_" + g + "_glow", UiKit.White);
|
|
||||||
gc.a *= 0.55f;
|
|
||||||
var glow = UiKit.Skin(UiKit.Rect("Glow", s, new Vector2(0.5f, 1f), new Vector2(0.5f, 0.5f), new Vector2(0f, -106f), new Vector2(290f, 290f)), "glow_circle", gc);
|
|
||||||
glow.enabled = UISkin.Has("glow_circle");
|
|
||||||
UiKit.Portrait("Face", s, h, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -10f), new Vector2(192f, 192f), true, 2.1f, UiKit.Col("grade_" + g + "_bg", UiKit.Paper));
|
|
||||||
var ring = UiKit.Skin(UiKit.Rect("Type", s, new Vector2(0.5f, 1f), new Vector2(0.5f, 0.5f), new Vector2(-78f, -30f), new Vector2(54f, 54f)), "dot", UiKit.White);
|
|
||||||
ring.preserveAspect = true;
|
|
||||||
UiKit.Icon(ring.transform, UiKit.TypeIconId(h.type), new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), Vector2.zero, 38f);
|
|
||||||
var tag = UiKit.Skin(UiKit.Rect("Name", s, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(0f, 4f), new Vector2(170f, 50f)), "tail", UiKit.Col("chip_dark", UiKit.Dark));
|
|
||||||
UiKit.Title(UiKit.FillLabel(tag.transform, h.nameKo, 28, UiKit.White), true);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 빈 자리 = 진청 원 + 얼굴 실루엣
|
CollectionCards.EmptyIn(s, SeatScale);
|
||||||
var e = UiKit.Skin(UiKit.Rect("Empty", s, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -10f), new Vector2(192f, 192f)), "circle_frame", UiKit.Col("seat_empty", UiKit.Slot));
|
UiKit.Title(UiKit.Label(s, "+ 빈 자리", 28, UiKit.InkSoft, TextAnchor.MiddleCenter, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 24f), new Vector2(200f, 50f)));
|
||||||
e.preserveAspect = true;
|
|
||||||
var face = UiKit.Icon(e.transform, "face", new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 6f), 116f);
|
|
||||||
if (face != null) face.color = UiKit.Col("seat_empty_face", UiKit.InkSoft);
|
|
||||||
UiKit.Label(s, "빈 칸", 26, UiKit.InkSoft, TextAnchor.MiddleCenter, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(0f, 8f), new Vector2(200f, 44f));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tabHero.GetComponent<Image>().color = soldiers ? UiKit.Paper : UiKit.Red;
|
// 보유 목록 = 영웅 목록 카드(배율 · 레벨 높은 순 · 출전 = 이 편성에 든 영웅)
|
||||||
UiKit.LabelOf(tabHero).color = soldiers ? UiKit.Ink : UiKit.White;
|
filterText.text = soldiers ? "병사" : "장수";
|
||||||
tabSoldier.GetComponent<Image>().color = soldiers ? UiKit.Red : UiKit.Paper;
|
|
||||||
UiKit.LabelOf(tabSoldier).color = soldiers ? UiKit.White : UiKit.Ink;
|
|
||||||
UiKit.Clear(list);
|
UiKit.Clear(list);
|
||||||
foreach (var h in S.Owned(soldiers))
|
var owned = new List<HeroDb.Hero>(S.Owned(soldiers));
|
||||||
|
owned.Sort((a, b) =>
|
||||||
|
{
|
||||||
|
int la = S.Save.Level(a.id) != null ? S.Save.Level(a.id).lv : 1, lb = S.Save.Level(b.id) != null ? S.Save.Level(b.id).lv : 1;
|
||||||
|
return lb.CompareTo(la);
|
||||||
|
});
|
||||||
|
var cellSize = CollectionCards.CellSize * ListScale;
|
||||||
|
foreach (var h in owned)
|
||||||
{
|
{
|
||||||
var id = h.id;
|
var id = h.id;
|
||||||
var card = HeroCards.Card(list, S, h, work.Contains(id), true, null);
|
var holder = UiKit.Rect("C_" + id, list, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), Vector2.zero, cellSize);
|
||||||
|
var card = CollectionCards.CardIn(holder, S, h, work.Contains(id), null, ListScale);
|
||||||
var td = card.gameObject.AddComponent<TapDrag>();
|
var td = card.gameObject.AddComponent<TapDrag>();
|
||||||
td.OnTap = () => TapCard(id);
|
td.OnTap = () => TapCard(id);
|
||||||
td.OnDragStart = e => StartGhost(id, e);
|
td.OnDragStart = e => StartGhost(id, e);
|
||||||
|
|
|
||||||
|
|
@ -152,7 +152,7 @@ namespace TKS.OutGame
|
||||||
var bt = UiKit.Title(UiKit.Label(badge.transform, lvn.ToString(), 30, UiKit.White, TextAnchor.MiddleCenter, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(1f, -3f), new Vector2(74f, 50f)), true);
|
var bt = UiKit.Title(UiKit.Label(badge.transform, lvn.ToString(), 30, UiKit.White, TextAnchor.MiddleCenter, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(1f, -3f), new Vector2(74f, 50f)), true);
|
||||||
bt.horizontalOverflow = HorizontalWrapMode.Overflow;
|
bt.horizontalOverflow = HorizontalWrapMode.Overflow;
|
||||||
}
|
}
|
||||||
// PD 커스터마이징(2026-11-09): 왼쪽 위 = 진영 깃발 · 그 오른쪽 = 이름(45 · 긴 이름 자동 축소) · 이름 아래 = 출전 · 오른쪽 위 = 병종 원(#35374E 58×60)
|
// PD 커스터마이징(2026-11-09): 왼쪽 위 = 진영 깃발 · 그 오른쪽 = 이름(45 · 긴 이름 자동 축소) · 깃발 아래(왼쪽 가장자리) = 출전 · 오른쪽 위 = 병종 원(#35374E 58×60)
|
||||||
var flag = UiKit.Icon(t, UISkin.Icon("flag_" + h.faction) != null ? "flag_" + h.faction : "flag_other", new Vector2(0f, 1f), new Vector2(0.5f, 0.5f), new Vector2(44f, -42f), 66f);
|
var flag = UiKit.Icon(t, UISkin.Icon("flag_" + h.faction) != null ? "flag_" + h.faction : "flag_other", new Vector2(0f, 1f), new Vector2(0.5f, 0.5f), new Vector2(44f, -42f), 66f);
|
||||||
UiKit.DropShadow(flag, 3f);
|
UiKit.DropShadow(flag, 3f);
|
||||||
var name = UiKit.Title(UiKit.Label(t, h.nameKo, 45, UiKit.White, TextAnchor.MiddleLeft, new Vector2(0f, 1f), new Vector2(0f, 0.5f), new Vector2(80f, -40.5f), new Vector2(172f, 66f)), true);
|
var name = UiKit.Title(UiKit.Label(t, h.nameKo, 45, UiKit.White, TextAnchor.MiddleLeft, new Vector2(0f, 1f), new Vector2(0f, 0.5f), new Vector2(80f, -40.5f), new Vector2(172f, 66f)), true);
|
||||||
|
|
@ -161,7 +161,7 @@ namespace TKS.OutGame
|
||||||
name.resizeTextMaxSize = 45;
|
name.resizeTextMaxSize = 45;
|
||||||
if (deployed)
|
if (deployed)
|
||||||
{
|
{
|
||||||
var tail = UiKit.Skin(UiKit.Rect("Deployed", t, new Vector2(0f, 1f), new Vector2(0f, 0.5f), new Vector2(80f, -90f), new Vector2(84f, 38f)), "tail", UiKit.Col("tail_red", UiKit.Red));
|
var tail = UiKit.Skin(UiKit.Rect("Deployed", t, new Vector2(0f, 1f), new Vector2(0f, 0.5f), new Vector2(10f, -96f), new Vector2(84f, 38f)), "tail", UiKit.Col("tail_red", UiKit.Red));
|
||||||
UiKit.Title(UiKit.FillLabel(tail.transform, "출전", 24, UiKit.White), true);
|
UiKit.Title(UiKit.FillLabel(tail.transform, "출전", 24, UiKit.White), true);
|
||||||
}
|
}
|
||||||
var role = UiKit.Skin(UiKit.Rect("Role", t, new Vector2(1f, 1f), new Vector2(0.5f, 0.5f), new Vector2(-42f, -42f), new Vector2(58f, 60f)), "dot", UiKit.Col("circle_inner", UiKit.Dark));
|
var role = UiKit.Skin(UiKit.Rect("Role", t, new Vector2(1f, 1f), new Vector2(0.5f, 0.5f), new Vector2(-42f, -42f), new Vector2(58f, 60f)), "dot", UiKit.Col("circle_inner", UiKit.Dark));
|
||||||
|
|
@ -172,15 +172,40 @@ namespace TKS.OutGame
|
||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>원래 크기(320×431) 카드를 holder 가운데에 배율 k 로 넣는다(편성 자리 · 편성 보유 목록).</summary>
|
||||||
|
public static Image CardIn(Transform holder, OutGameSession s, HeroDb.Hero h, bool deployed, System.Action onTap, float k)
|
||||||
|
{
|
||||||
|
return Fit(Card(holder, s, h, deployed, onTap), k);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Image EmptyIn(Transform holder, float k)
|
||||||
|
{
|
||||||
|
return Fit(Empty(holder), k);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Image Fit(Image card, float k)
|
||||||
|
{
|
||||||
|
var rt = card.rectTransform;
|
||||||
|
rt.anchorMin = rt.anchorMax = new Vector2(0.5f, 0.5f);
|
||||||
|
rt.pivot = new Vector2(0.5f, 0.5f);
|
||||||
|
rt.sizeDelta = CellSize;
|
||||||
|
rt.anchoredPosition = Vector2.zero;
|
||||||
|
rt.localScale = new Vector3(k, k, 1f);
|
||||||
|
return card;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>빈 카드(미보유 자리) = 어두운 바탕 + 문양 + 테두리 + 오른쪽 아래 얼굴 실루엣(팩 CardFrame01_Empty).</summary>
|
/// <summary>빈 카드(미보유 자리) = 어두운 바탕 + 문양 + 테두리 + 오른쪽 아래 얼굴 실루엣(팩 CardFrame01_Empty).</summary>
|
||||||
public static Image Empty(Transform content)
|
public static Image Empty(Transform content)
|
||||||
{
|
{
|
||||||
var cell = UiKit.Cell(content, "Empty", Color.clear, null);
|
var cell = UiKit.Cell(content, "Empty", Color.clear, null);
|
||||||
cell.sprite = null;
|
cell.sprite = null;
|
||||||
var t = cell.transform;
|
var t = cell.transform;
|
||||||
UiKit.Layer(t, "Bg", "card_bg", UiKit.Col("card_empty", UiKit.Slot), 2f, 2f, 2f, 2f);
|
// 팩 CardFrame01_Empty 그대로: Bg(#303146 · 마스크) 안에 Bg_d_Pattern 타일(#2D2F42) → 테두리 → 얼굴
|
||||||
var pat = UiKit.Layer(t, "Pattern", "card_empty_pattern", UiKit.Col("card_empty_pattern", UiKit.Slot), 8f, 8f, 8f, 8f);
|
var bg = UiKit.Layer(t, "Bg", "card_bg", UiKit.Col("card_empty", UiKit.Slot), 2f, 2f, 2f, 2f);
|
||||||
|
bg.gameObject.AddComponent<Mask>().showMaskGraphic = true;
|
||||||
|
var pat = UiKit.Layer(bg.transform, "Pattern", "card_empty_pattern", UiKit.Col("card_empty_pattern", UiKit.Slot));
|
||||||
pat.type = Image.Type.Tiled;
|
pat.type = Image.Type.Tiled;
|
||||||
|
pat.pixelsPerUnitMultiplier = 1f;
|
||||||
UiKit.Layer(t, "Border", "card_border", UiKit.Col("card_empty_border", UiKit.Line));
|
UiKit.Layer(t, "Border", "card_border", UiKit.Col("card_empty_border", UiKit.Line));
|
||||||
var face = UiKit.Icon(t, "face", new Vector2(1f, 0f), new Vector2(0.5f, 0.5f), new Vector2(-87f, 90.8f), 127f);
|
var face = UiKit.Icon(t, "face", new Vector2(1f, 0f), new Vector2(0.5f, 0.5f), new Vector2(-87f, 90.8f), 127f);
|
||||||
if (face != null) face.color = UiKit.Col("card_empty_face", UiKit.Dark);
|
if (face != null) face.color = UiKit.Col("card_empty_face", UiKit.Dark);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue