로비 비주얼 개선 = Fable 제안서 §4-1 구현(#1104 · PD 2026-11-09)
- 진행 띠(어두운 둥근 판 + 지도 핀 + 「제n장 이름」 + 진행 바 n/m) · 위 비네트(Glow_Panel01) · 아래 버튼 뒤 어두운 띠 - 좌우 세로 버튼 열(Button_Round03_Dark 166×150 · 아이콘 92 · 라벨 28): 임무 · 우편 · 동맹(준비 중 = 흐림 + 자물쇠) / 상점(거래 상점) · 상자(보물 상자 + 보유 수 알림) · 이벤트(준비 중) - 아래 버튼 행: 편성 · 연무장 = Button_Circle122 원(진남) + 아이콘 76 + 라벨 30 · 출정 = Button_Tapered_White1/2/3 3층(붉은 옻칠 + 광택 + 하이라이트) 「출정」 64 + 칩 「챕터 n · n-m」 - 테마 행 17 테스트 117/117 · console error 0 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
323658a91d
commit
4c2692b555
|
|
@ -408,4 +408,21 @@ skin,scroll_fade,Assets/UI/GUIPro/ResourcesData/Sprites/Demo/Demo_Background/Glo
|
||||||
skin,btn_s_green,Button/Button01_s_Green.png,Button/Button01_s_White_Light1.png,1.8,4;3;4;10,0.35,,Secondary 녹(편성 저장) + 광택
|
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,plus_glyph,UI_Etc/ResourceBar_Single_Btn_Yellow2.png,,,,,,플러스 글리프(빈 자리 뱃지)
|
||||||
icon,check_badge,IconMisc/Icon_Check01.png,,,,,,체크(출전 중 뱃지)
|
icon,check_badge,IconMisc/Icon_Check01.png,,,,,,체크(출전 중 뱃지)
|
||||||
|
skin,btn_round03,Button/Button_Round03_Dark.png,,1,,,,로비 측면 버튼(Fable §4-1)
|
||||||
|
skin,circle122,Button/Button_Circle122.png,,1,,,,원형 버튼 124(로비 편성·연무장 · 틴트)
|
||||||
|
skin,tapered1,Button/Button_Tapered_White1.png,,1,,,,출정 버튼 바탕(틴트 붉은)
|
||||||
|
skin,tapered2,Button/Button_Tapered_White2.png,,1,,,,출정 버튼 광택
|
||||||
|
skin,lv_bar_bg,Slider/Slider_Basic01_Bg_Single.png,,2,,,,로비 진행 바 바탕
|
||||||
|
icon,map_point,IconMisc/Icon_MapPoint.png,,,,,,로비 진행 지도 핀
|
||||||
|
icon,tapered3,Button/Button_Tapered_White3.png,,,,,,출정 버튼 하이라이트 점
|
||||||
|
icon,lock_s,IconMisc/Icon_Lock01_s.png,,,,,,잠금(작은)
|
||||||
|
icon,lobby_mission,Icon_PictoIcons/128/PictoIcon_Mission.Png,,,,,,로비 임무(준비 중)
|
||||||
|
icon,lobby_mail,Icon_PictoIcons/128/PictoIcon_Mail_1.Png,,,,,,로비 우편(준비 중)
|
||||||
|
icon,lobby_alliance,Icon_PictoIcons/128/PictoIcon_Friends.Png,,,,,,로비 동맹(준비 중)
|
||||||
|
icon,lobby_shop,Icon_PictoIcons/128/PictoIcon_Shop_1.Png,,,,,,로비 상점(거래 상점)
|
||||||
|
icon,lobby_chest,Icon_PictoIcons/128/PictoIcon_Chest.Png,,,,,,로비 상자(보물 상자)
|
||||||
|
icon,lobby_event,Icon_PictoIcons/128/PictoIcon_Calendar.Png,,,,,,로비 이벤트(준비 중)
|
||||||
|
color,lobby_vignette,,,,,,#1E253599,로비 위 비네트(α 0.6)
|
||||||
|
color,lobby_band,,,,,,#1E24408C,로비 아래 버튼 뒤 띠(α 0.55)
|
||||||
|
color,alert_red,,,,,,#FF243E,알림 원(수량)
|
||||||
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 결정 전)
|
||||||
|
|
|
||||||
|
|
|
@ -491,6 +491,12 @@ MonoBehaviour:
|
||||||
color: {r: 1, g: 1, b: 1, a: 0.078431375}
|
color: {r: 1, g: 1, b: 1, a: 0.078431375}
|
||||||
- id: seat_dim
|
- id: seat_dim
|
||||||
color: {r: 0, g: 0, b: 0, a: 0.34901962}
|
color: {r: 0, g: 0, b: 0, a: 0.34901962}
|
||||||
|
- id: lobby_vignette
|
||||||
|
color: {r: 0.11764706, g: 0.14509805, b: 0.20784314, a: 0.6}
|
||||||
|
- id: lobby_band
|
||||||
|
color: {r: 0.11764706, g: 0.14117648, b: 0.2509804, a: 0.54901963}
|
||||||
|
- id: alert_red
|
||||||
|
color: {r: 1, g: 0.14117648, b: 0.24313726, a: 1}
|
||||||
skins:
|
skins:
|
||||||
- id: card
|
- id: card
|
||||||
pack: {fileID: 21300000, guid: 3070a6f23e6ca4273897acf1b7e8c5ce, type: 3}
|
pack: {fileID: 21300000, guid: 3070a6f23e6ca4273897acf1b7e8c5ce, type: 3}
|
||||||
|
|
@ -1143,6 +1149,41 @@ MonoBehaviour:
|
||||||
ppu: 1.8
|
ppu: 1.8
|
||||||
inset: {x: 4, y: 3, z: 4, w: 10}
|
inset: {x: 4, y: 3, z: 4, w: 10}
|
||||||
overlayAlpha: 0.35
|
overlayAlpha: 0.35
|
||||||
|
- id: btn_round03
|
||||||
|
pack: {fileID: 21300000, guid: 13bb59864f8ee4bd0948e2f4bebb30dd, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
overlay: {fileID: 0}
|
||||||
|
ppu: 1
|
||||||
|
inset: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
overlayAlpha: 1
|
||||||
|
- id: circle122
|
||||||
|
pack: {fileID: 21300000, guid: c8638447d0c4a40fd9a7e32c25783d96, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
overlay: {fileID: 0}
|
||||||
|
ppu: 1
|
||||||
|
inset: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
overlayAlpha: 1
|
||||||
|
- id: tapered1
|
||||||
|
pack: {fileID: 21300000, guid: 7c529ef2aff4e4be290f9a9fc303572d, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
overlay: {fileID: 0}
|
||||||
|
ppu: 1
|
||||||
|
inset: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
overlayAlpha: 1
|
||||||
|
- id: tapered2
|
||||||
|
pack: {fileID: 21300000, guid: 061d65a86429c4eafa1b8edcca19d6f0, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
overlay: {fileID: 0}
|
||||||
|
ppu: 1
|
||||||
|
inset: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
overlayAlpha: 1
|
||||||
|
- id: lv_bar_bg
|
||||||
|
pack: {fileID: 21300000, guid: 6332433fb34294d58bfc835736ee8ac3, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
overlay: {fileID: 0}
|
||||||
|
ppu: 2
|
||||||
|
inset: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
overlayAlpha: 1
|
||||||
icons:
|
icons:
|
||||||
- id: cur_gold
|
- id: cur_gold
|
||||||
pack: {fileID: 21300000, guid: 6d5687fb0dd3a428d9cd26a6f36c6d78, type: 3}
|
pack: {fileID: 21300000, guid: 6d5687fb0dd3a428d9cd26a6f36c6d78, type: 3}
|
||||||
|
|
@ -1452,6 +1493,42 @@ MonoBehaviour:
|
||||||
pack: {fileID: 21300000, guid: 5368592eacfda44c191265e7475562df, type: 3}
|
pack: {fileID: 21300000, guid: 5368592eacfda44c191265e7475562df, type: 3}
|
||||||
samguk: {fileID: 0}
|
samguk: {fileID: 0}
|
||||||
tint: {r: 1, g: 1, b: 1, a: 1}
|
tint: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- id: map_point
|
||||||
|
pack: {fileID: 21300000, guid: 4864baeee50764eea909c546760b7c64, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
tint: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- id: tapered3
|
||||||
|
pack: {fileID: 21300000, guid: 461f4fe6d783646e993c8a7f39d054eb, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
tint: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- id: lock_s
|
||||||
|
pack: {fileID: 21300000, guid: 7a496f5f80b1c41d59f7bd0fc631cdb7, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
tint: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- id: lobby_mission
|
||||||
|
pack: {fileID: 21300000, guid: 924e36c4781e44055a9d539c1160fce2, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
tint: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- id: lobby_mail
|
||||||
|
pack: {fileID: 21300000, guid: add005f288b2e43b7a4772c8f316c598, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
tint: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- id: lobby_alliance
|
||||||
|
pack: {fileID: 21300000, guid: b24f4bd4b10df44d486a526496d3215b, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
tint: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- id: lobby_shop
|
||||||
|
pack: {fileID: 21300000, guid: 7ac6a27f0a991414f99328df090ad855, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
tint: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- id: lobby_chest
|
||||||
|
pack: {fileID: 21300000, guid: 3654b5c84fc0440f786a4918b576d3bb, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
tint: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- id: lobby_event
|
||||||
|
pack: {fileID: 21300000, guid: c0c390b014f3f4b0781cfca1e2ebe6f0, type: 3}
|
||||||
|
samguk: {fileID: 0}
|
||||||
|
tint: {r: 1, g: 1, b: 1, a: 1}
|
||||||
- id: tile_bridge
|
- id: tile_bridge
|
||||||
pack: {fileID: 0}
|
pack: {fileID: 0}
|
||||||
samguk: {fileID: 21300000, guid: 8e5bf7eb1e300474785ff2781eeb5093, type: 3}
|
samguk: {fileID: 21300000, guid: 8e5bf7eb1e300474785ff2781eeb5093, type: 3}
|
||||||
|
|
|
||||||
|
|
@ -4,23 +4,34 @@ using UnityEngine.UI;
|
||||||
namespace TKS.OutGame
|
namespace TKS.OutGame
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 본영 로비(img03 · 기획 S4) — 진행 칩 · 출전 편성 5인 · 중앙 큰 「출정」(→ 챕터 월드맵) · 좌 「편성」 · 우 「연무장」(PD #1093 C) · 하단 탭 5.
|
/// 본영 로비(Fable 제안서 §4-1 · PD 2026-11-09 「카피바라GO·탕탕특공대 참고 상업 수준」) — 키아트 + 위 비네트 · 진행 띠(지도 핀 · 장 이름 · 진행 바 n/m) ·
|
||||||
|
/// 좌우 세로 버튼 열(임무·우편·동맹 / 상점·상자·이벤트 · 미구현 = 잠금 자리) · 출전 편성 5인 · 아래 버튼 행(편성 원 · 출정 3층 · 연무장 원) + 뒤 어두운 띠 · 하단 탭 5.
|
||||||
|
/// 본문 좌표 = 절대 y − 224.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class LobbyScreen : OutGameScreen
|
public class LobbyScreen : OutGameScreen
|
||||||
{
|
{
|
||||||
Text progress;
|
Text progress;
|
||||||
|
Text progressNum;
|
||||||
|
RectTransform progressFill;
|
||||||
|
Text sortieSub;
|
||||||
|
Text chestBadge;
|
||||||
RectTransform field;
|
RectTransform field;
|
||||||
|
|
||||||
|
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()
|
public override void Build()
|
||||||
{
|
{
|
||||||
Header("본영", "로비", false);
|
Header("본영", "", false);
|
||||||
var body = Body();
|
var outer = Body();
|
||||||
|
|
||||||
// 배경 = 테마 bg_lobby(키아트 04 · 어둡게 · 신규 제작 로비 배경이 오면 치환) · 없으면 땅 색 판
|
// 배경 = 테마 bg_lobby(키아트 · 어둡게) · 없으면 땅 색 판
|
||||||
var art = UISkin.Icon("bg_lobby");
|
var art = UISkin.Icon("bg_lobby");
|
||||||
if (art != null)
|
if (art != null)
|
||||||
{
|
{
|
||||||
var clip = UiKit.Fill("LobbyBg", body);
|
var clip = UiKit.Fill("LobbyBg", outer);
|
||||||
clip.gameObject.AddComponent<RectMask2D>();
|
clip.gameObject.AddComponent<RectMask2D>();
|
||||||
// 위쪽 맞춤 × 1.22 — 키아트 아래쪽 아군 5인은 잘라 내고(편성 5인과 겹치지 않게) 전장·적진만 보이게
|
// 위쪽 맞춤 × 1.22 — 키아트 아래쪽 아군 5인은 잘라 내고(편성 5인과 겹치지 않게) 전장·적진만 보이게
|
||||||
var art2 = UiKit.Rect("Art", clip, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), Vector2.zero, Vector2.zero);
|
var art2 = UiKit.Rect("Art", clip, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), Vector2.zero, Vector2.zero);
|
||||||
|
|
@ -35,10 +46,42 @@ namespace TKS.OutGame
|
||||||
fit.aspectMode = AspectRatioFitter.AspectMode.WidthControlsHeight;
|
fit.aspectMode = AspectRatioFitter.AspectMode.WidthControlsHeight;
|
||||||
fit.aspectRatio = art.rect.width / Mathf.Max(1f, art.rect.height);
|
fit.aspectRatio = art.rect.width / Mathf.Max(1f, art.rect.height);
|
||||||
}
|
}
|
||||||
|
// 위 비네트(Glow_Panel01 = 위 불투명 → 아래 투명 · 실측) · 아래 버튼 뒤 어두운 띠
|
||||||
|
var vg = UiKit.Rect("Vignette", outer, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), Vector2.zero, new Vector2(0f, 180f));
|
||||||
|
vg.anchorMin = new Vector2(0f, 1f);
|
||||||
|
vg.anchorMax = new Vector2(1f, 1f);
|
||||||
|
vg.sizeDelta = new Vector2(0f, 180f);
|
||||||
|
UiKit.Skin(vg, "scroll_fade", UiKit.Col("lobby_vignette", Color.clear)).enabled = UISkin.Has("scroll_fade");
|
||||||
|
var body = UiKit.Rect("Mock", outer, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), Vector2.zero, new Vector2(OutGameRoot.Reference.x, OutGameRoot.BodyH));
|
||||||
|
var band = At(body, "BottomBand", -40f, 1236f, 1160f, 330f);
|
||||||
|
UiKit.Skin(band, "card", UiKit.Col("lobby_band", Color.clear));
|
||||||
|
|
||||||
var chip = UiKit.Box("Progress", body, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -28f), new Vector2(760f, 84f), UiKit.Paper);
|
// 진행 띠(절대 236~312) = 지도 핀 + 장 이름 + 진행 바 n/m
|
||||||
UiKit.Border(chip, UiKit.Line, 2f);
|
var pb = At(body, "Progress", 24f, 12f, 1032f, 76f);
|
||||||
progress = UiKit.FillLabel(chip.transform, "", 34, UiKit.Ink);
|
UiKit.Skin(pb, "card", UiKit.Col("chip_dark", UiKit.Dark));
|
||||||
|
UiKit.DropShadow(UiKit.Icon(pb, "map_point", new Vector2(0f, 0.5f), new Vector2(0f, 0.5f), new Vector2(18f, 2f), 50f), 3f);
|
||||||
|
progress = UiKit.Title(UiKit.Label(pb, "", 34, UiKit.White, TextAnchor.MiddleLeft, new Vector2(0f, 0.5f), new Vector2(0f, 0.5f), new Vector2(78f, 2f), new Vector2(560f, 60f)), true);
|
||||||
|
progress.horizontalOverflow = HorizontalWrapMode.Overflow;
|
||||||
|
var bar = UiKit.Rect("Bar", pb, new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), new Vector2(-104f, 0f), new Vector2(240f, 26f));
|
||||||
|
UiKit.Skin(bar, "lv_bar_bg", UiKit.White);
|
||||||
|
progressFill = UiKit.Rect("Fill", bar, new Vector2(0f, 0.5f), new Vector2(0f, 0.5f), new Vector2(4f, 0f), new Vector2(0f, 16f));
|
||||||
|
UiKit.Skin(progressFill, "lv_fill", UiKit.Col("lv_fill", UiKit.Coin));
|
||||||
|
progressNum = UiKit.Title(UiKit.Label(pb, "", 26, UiKit.White, TextAnchor.MiddleRight, new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), new Vector2(-18f, 2f), new Vector2(80f, 50f)), true);
|
||||||
|
|
||||||
|
// 좌우 세로 버튼 열(166×150 · 미구현 = 잠금 자리)
|
||||||
|
SideButton(body, 24f, 106f, "lobby_mission", "임무", true, () => Root.ComingSoon("임무"));
|
||||||
|
SideButton(body, 24f, 272f, "lobby_mail", "우편", true, () => Root.ComingSoon("우편"));
|
||||||
|
SideButton(body, 24f, 438f, "lobby_alliance", "동맹", true, () => Root.ComingSoon("동맹", true));
|
||||||
|
SideButton(body, 890f, 106f, "lobby_shop", "상점", false, () => Root.Trade.OpenShop());
|
||||||
|
var chest = SideButton(body, 890f, 272f, "lobby_chest", "상자", false, () =>
|
||||||
|
{
|
||||||
|
Root.Show(Root.Treasures);
|
||||||
|
Root.Treasures.SetPage(2);
|
||||||
|
});
|
||||||
|
var cb = UiKit.Skin(UiKit.Rect("Alert", chest, new Vector2(1f, 1f), new Vector2(0.5f, 0.5f), new Vector2(-12f, -12f), new Vector2(44f, 46f)), "badge_circle", UiKit.Col("alert_red", UiKit.Red));
|
||||||
|
cb.preserveAspect = true;
|
||||||
|
chestBadge = UiKit.Title(UiKit.FillLabel(cb.transform, "", 24, UiKit.White), true);
|
||||||
|
SideButton(body, 890f, 438f, "lobby_event", "이벤트", true, () => Root.ComingSoon("이벤트"));
|
||||||
|
|
||||||
// 전장 자리 · 출전 편성 5인
|
// 전장 자리 · 출전 편성 5인
|
||||||
var ground = UiKit.Fill("Field", body, 24f, 24f, 140f, 520f);
|
var ground = UiKit.Fill("Field", body, 24f, 24f, 140f, 520f);
|
||||||
|
|
@ -48,49 +91,82 @@ namespace TKS.OutGame
|
||||||
shadow.type = Image.Type.Simple;
|
shadow.type = Image.Type.Simple;
|
||||||
field = UiKit.Fill("Lineup", ground, 20f, 20f, 40f, 40f);
|
field = UiKit.Fill("Lineup", ground, 20f, 20f, 40f, 40f);
|
||||||
|
|
||||||
float y = 40f;
|
// 아래 버튼 행(절대 1500~1740) = 편성 원 · 출정 3층 · 연무장 원
|
||||||
var sortie = UiKit.Btn("Sortie", body, "", 40, UiKit.Red, UiKit.White, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(0f, y), new Vector2(440f, 400f), () => Root.OpenWorldMap());
|
RoundButton(body, 160f, "btn_formation", "편성", () => Root.Show(Root.Formation));
|
||||||
UiKit.Border(sortie.GetComponent<Image>(), new Color(0.98f, 0.86f, 0.7f), 5f);
|
RoundButton(body, 920f, "btn_arena", "연무장", () =>
|
||||||
UiKit.LabelOf(sortie).text = "";
|
|
||||||
var si = UiKit.Icon(sortie.transform, "btn_sortie", new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -26f), 92f);
|
|
||||||
if (si != null) UISkin.Stroke(si, UiKit.Stroke, 3f);
|
|
||||||
else UiKit.Label(sortie.transform, "로비 중앙", 28, new Color(1f, 0.85f, 0.8f), TextAnchor.MiddleCenter, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -22f), new Vector2(400f, 50f), false);
|
|
||||||
UiKit.Title(UiKit.Label(sortie.transform, "출정", 120, UiKit.White, TextAnchor.MiddleCenter, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 30f), new Vector2(420f, 170f)), true);
|
|
||||||
int stages = Root.Battle != null ? Root.Battle.Config.stages.Length : 0;
|
|
||||||
UiKit.Title(UiKit.Label(sortie.transform, "챕터 월드맵\n" + stages + " 스테이지", 34, UiKit.White, TextAnchor.MiddleCenter, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(0f, 34f), new Vector2(420f, 100f), false), true);
|
|
||||||
|
|
||||||
SideButton(body, "Formation", "btn_formation", "편", "편성", "출정 좌측", -1, () => Root.Show(Root.Formation));
|
|
||||||
SideButton(body, "Arena", "btn_arena", "연", "연무장", "출정 우측", 1, () =>
|
|
||||||
{
|
{
|
||||||
Root.Arena.SetPage(0);
|
Root.Arena.SetPage(0);
|
||||||
Root.Show(Root.Arena); // 연무장(PD #1093 C)
|
Root.Show(Root.Arena); // 연무장(PD #1093 C)
|
||||||
});
|
});
|
||||||
|
var so = At(body, "Sortie", 310f, 1290f, 460f, 160f);
|
||||||
|
var soImg = UiKit.Skin(so, "tapered1", UiKit.Red, true);
|
||||||
|
so.gameObject.AddComponent<Button>().onClick.AddListener(() => Root.OpenWorldMap());
|
||||||
|
var gl = UiKit.Rect("Gloss", so, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -10f), new Vector2(400f, 70f));
|
||||||
|
UiKit.Skin(gl, "tapered2", new Color(1f, 1f, 1f, 0.3f)).enabled = UISkin.Has("tapered2");
|
||||||
|
UiKit.Icon(so, "tapered3", new Vector2(0f, 1f), new Vector2(0.5f, 0.5f), new Vector2(60f, -26f), 24f);
|
||||||
|
UiKit.Title(UiKit.Label(so, "출정", 64, UiKit.White, TextAnchor.MiddleCenter, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 18f), new Vector2(440f, 90f)), true);
|
||||||
|
var chip = UiKit.Skin(UiKit.Rect("Chip", so, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(0f, 14f), new Vector2(300f, 44f)), "chip", UiKit.Col("chip_dark", UiKit.Dark));
|
||||||
|
sortieSub = UiKit.Title(UiKit.FillLabel(chip.transform, "", 26, UiKit.White), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SideButton(RectTransform body, string name, string icon, string mark, string title, string sub, int side, System.Action onClick)
|
/// <summary>측면 버튼(팩 Button_Round03_Dark 166×150 · 아이콘 96 · 라벨 28 · 잠금 = 흐림 + 자물쇠).</summary>
|
||||||
|
Transform SideButton(RectTransform body, float x, float y, string icon, string label, bool locked, System.Action onClick)
|
||||||
{
|
{
|
||||||
float x = side * (220f + 160f);
|
var b = At(body, "Side_" + label, x, y, 166f, 150f);
|
||||||
var b = UiKit.Btn(name, body, "", 30, UiKit.Paper, UiKit.Ink, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(x, 70f), new Vector2(290f, 340f), onClick);
|
UiKit.Skin(b, "btn_round03", UiKit.White, true);
|
||||||
UiKit.Border(b.GetComponent<Image>(), UiKit.Line, 3f);
|
b.gameObject.AddComponent<Button>().onClick.AddListener(() => onClick());
|
||||||
var dot = UiKit.Dot("Mark", b.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -36f), 110f, UiKit.Dark);
|
var ic = UiKit.Icon(b, icon, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -10f), 92f);
|
||||||
if (UiKit.Icon(dot.transform, icon, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), Vector2.zero, 66f) == null) UiKit.FillLabel(dot.transform, mark, 50, UiKit.White);
|
if (ic != null)
|
||||||
UiKit.Title(UiKit.Label(b.transform, title, 52, UiKit.Ink, TextAnchor.MiddleCenter, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, -40f), new Vector2(280f, 80f)));
|
{
|
||||||
UiKit.Label(b.transform, sub, 28, UiKit.InkSoft, TextAnchor.MiddleCenter, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(0f, 34f), new Vector2(280f, 50f), false);
|
UiKit.DropShadow(ic, 3f);
|
||||||
|
if (locked) ic.color = UiKit.Col("tab_locked", UiKit.InkSoft);
|
||||||
|
}
|
||||||
|
UiKit.Title(UiKit.Label(b, label, 28, locked ? UiKit.InkSoft : UiKit.White, TextAnchor.MiddleCenter, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(0f, 4f), new Vector2(160f, 40f)), true);
|
||||||
|
if (locked) UiKit.Icon(b, "lock_s", new Vector2(1f, 1f), new Vector2(0.5f, 0.5f), new Vector2(-24f, -28f), 40f);
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>원형 버튼(팩 Button_Circle122 124 · 진남 틴트 · 아이콘 72 · 라벨 30 아래).</summary>
|
||||||
|
void RoundButton(RectTransform body, float cx, string icon, string label, System.Action onClick)
|
||||||
|
{
|
||||||
|
var b = At(body, "Round_" + label, cx - 62f, 1290f, 124f, 124f);
|
||||||
|
var img = UiKit.Skin(b, "circle122", UiKit.Col("menu_btn", UiKit.Dark), true);
|
||||||
|
img.preserveAspect = true;
|
||||||
|
b.gameObject.AddComponent<Button>().onClick.AddListener(() => onClick());
|
||||||
|
UiKit.DropShadow(UiKit.Icon(b, icon, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 4f), 76f), 3f);
|
||||||
|
UiKit.Title(UiKit.Label(body, label, 30, UiKit.White, TextAnchor.MiddleCenter, new Vector2(0f, 1f), new Vector2(0.5f, 1f), new Vector2(cx, -1420f), new Vector2(200f, 44f)), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Refresh()
|
public override void Refresh()
|
||||||
{
|
{
|
||||||
var map = Root.Map;
|
var map = Root.Map;
|
||||||
var cfg = Root.Battle.Config;
|
var cfg = Root.Battle.Config;
|
||||||
|
float pct = 0f;
|
||||||
if (map != null && map.HasData)
|
if (map != null && map.HasData)
|
||||||
{
|
{
|
||||||
int ch = Root.CurrentChapter();
|
int ch = Root.CurrentChapter();
|
||||||
int node = Mathf.Min(WorldProgress.Cleared(ch), Mathf.Max(0, map.NodesIn(ch) - 1));
|
int nodes = map.NodesIn(ch);
|
||||||
|
int done = WorldProgress.Cleared(ch);
|
||||||
|
int node = Mathf.Min(done, Mathf.Max(0, nodes - 1));
|
||||||
int si = map.StageIndexOf(ch, node);
|
int si = map.StageIndexOf(ch, node);
|
||||||
var def = cfg.chapters[ch];
|
var def = cfg.chapters[ch];
|
||||||
progress.text = "현재 진행: 제" + def.no + "장 " + def.title + (si >= 0 ? " · " + def.no + "-" + cfg.stages[si].stage : "");
|
progress.text = "제" + def.no + "장 " + def.title;
|
||||||
|
progressNum.text = Mathf.Min(done, nodes) + "/" + nodes;
|
||||||
|
pct = nodes > 0 ? Mathf.Clamp01(done / (float)nodes) : 0f;
|
||||||
|
sortieSub.text = si >= 0 ? "챕터 " + def.no + " · " + def.no + "-" + cfg.stages[si].stage : "챕터 " + def.no;
|
||||||
}
|
}
|
||||||
else progress.text = "현재 진행: —";
|
else
|
||||||
|
{
|
||||||
|
progress.text = "—";
|
||||||
|
progressNum.text = "";
|
||||||
|
sortieSub.text = "챕터 월드맵";
|
||||||
|
}
|
||||||
|
progressFill.sizeDelta = new Vector2(232f * pct, progressFill.sizeDelta.y);
|
||||||
|
progressFill.gameObject.SetActive(pct > 0.01f);
|
||||||
|
int chests = 0;
|
||||||
|
foreach (var c in S.Db.Chests.chests) chests += TreasureRules.ChestCount(S.Save, c.id);
|
||||||
|
chestBadge.text = chests.ToString();
|
||||||
|
chestBadge.transform.parent.gameObject.SetActive(chests > 0);
|
||||||
|
|
||||||
UiKit.Clear(field);
|
UiKit.Clear(field);
|
||||||
var lineup = S.BuildLineup();
|
var lineup = S.BuildLineup();
|
||||||
|
|
@ -100,7 +176,7 @@ namespace TKS.OutGame
|
||||||
{
|
{
|
||||||
var h = S.Def(lineup[i].id);
|
var h = S.Def(lineup[i].id);
|
||||||
float x = (i - (n - 1) / 2f) * w;
|
float x = (i - (n - 1) / 2f) * w;
|
||||||
UiKit.Portrait("Hero" + i, field, h, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(x, 20f), new Vector2(w, 340f), false, 1f, new Color(1f, 1f, 1f, 0f));
|
UiKit.Portrait("Hero" + i, field, h, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(x, 20f), new Vector2(w, 340f), false, 1f, Color.clear);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue