ThreeKingdomsSlingshot/Assets/Scripts/OutGame/Domestic/DomesticScene.cs

102 lines
4.7 KiB
C#
Raw Normal View History

내정 메뉴 개편(훈련·순찰·개발 배경 장면) + 「책사 → 승병」 게임 전체 - 3탭 배경 = 로비 화풍(연병장·저잣거리·규장각) · 장면 표 Resources/UI/domestic_scene.csv · 연출 LobbyAmbient(Frame 캔버스) - 훈련: 병종별 범용 병사 훈련 동작(UiDrillAnim · 뒷발 고정 · 병종별 박자 · 화면 배율) · 궁병 훈련 전용 클립 drill_ready/drill_action(대기 원화 리그) + 날아가는 화살 · 병종 탭 아이콘 · 카드 = 이름 +수치% - 순찰: 정보 판 1장(시계 + 쌓인 시간 · 게이지 · 시간당 골드·경험치·전리품 오른쪽 정렬 · 금테 안 획득 보상) · 버튼 수확/즉시 수확 · 광고 2배 = 수확 팝업 · 문 앞 순찰 영웅 + 창병 2 · 상인·주민 NPC 5(R22 대기 모션 · 길바닥) - 개발: 양피지 두루마리 위 성장 트리(노드 그림 아이콘 27) · 재화 칩 · 아래 두루마리 = 영웅 배치 + 트리 초기화 - 영웅 파견 3자리(훈련 병종 지휘관 · 순찰 · 개발 · 장면 표시만) · 세이브 필드 3 - 병사 5종 자세·타격 그림 색·크기 대기에 맞춤(전투 그림도 같은 파일) - 승병: UnitTypeInfo 이름/표시 글자 · heroes 병사 3 이름·한자 · 스킬·기믹 설명 · 튜토리얼 팁 + 임포트 자산(HeroDb·SkillInfoDb·GimmickDb·StageGimmickTable) - 테스트 DomesticSceneTests 4 · BattleFlowTests 표시 글자 PD 지시 2026-11-12(대화로그 공유/대화로그/삼국지슬링샷/2026-11-12_내정메뉴_개편.md · 레시피 R23) · QA r1~r12 · 마지막 r11·r12 PASS(B 0) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 13:41:33 +00:00
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace TKS.OutGame
{
/// <summary>
/// 내정 장면 표(Resources/UI/domestic_scene.csv · PD 2026-11-12 「내정 메뉴를 로비 화면과 같이 배경을 구성 · 화풍 통일」) — 형식 = 로비 장면 표(LobbyScene.Load) ·
/// 종류 = &lt;탭&gt;_&lt;종류&gt;(train · patrol · dev) · 좌표 = 그 탭 배경 그림 px. 배경을 바꾸면 이 표만 고친다(C45).
/// </summary>
public static class DomesticScene
{
public const string TablePath = "UI/domestic_scene";
public static readonly string[] Pages = { "train", "patrol", "dev" };
static List<LobbyScene.Row> rows;
public static void Reload()
{
rows = null;
}
/// <summary>탭 줄 = 접두(「train_」 등)를 뗀 종류로 복사 — 로비 연출 코드(LobbyAmbient)에 그대로 넘긴다.</summary>
public static List<LobbyScene.Row> Page(string page)
{
if (rows == null) rows = LobbyScene.Load(TablePath);
var list = new List<LobbyScene.Row>();
string pre = page + "_";
foreach (var r in rows)
{
if (!r.kind.StartsWith(pre)) continue;
var c = r.Clone();
c.kind = r.kind.Substring(pre.Length);
list.Add(c);
}
return list;
}
public static List<LobbyScene.Row> All(List<LobbyScene.Row> src, string kind)
{
var list = new List<LobbyScene.Row>();
foreach (var r in src)
if (r.kind == kind)
list.Add(r);
return list;
}
public static LobbyScene.Row First(List<LobbyScene.Row> src, string kind)
{
foreach (var r in src)
if (r.kind == kind)
return r;
return null;
}
/// <summary>
/// 배경 그림 + 장면 층 — 로비(LobbyScreen.Build)와 같은 방식: 부모를 꽉 채우는 잘림 판 → 그림(폭 맞춤 · view 줄의 그림 줄이 맨 위) → 연출 층(Frame 1장 · 뒤/가운데/앞).
/// 그림이 없으면 null(호출 쪽은 예전 바탕 그대로).
/// </summary>
public static LobbyAmbient Backdrop(RectTransform parent, string name, List<LobbyScene.Row> src, out RectTransform art, out float artW, out float artH)
{
art = null;
artW = artH = 0f;
var view = First(src, "view");
var sp = view != null ? UISkin.Icon(view.sprite) : null;
if (sp == null) return null;
var clip = UiKit.Fill(name, parent);
clip.gameObject.AddComponent<RectMask2D>();
artW = view.w > 0f ? view.w : sp.rect.width; // 표 좌표 기준 = 원본 px(임포트 크기와 무관)
artH = view.h > 0f ? view.h : sp.rect.height;
float zoom = view.scale > 0.01f ? view.scale : 1f;
art = UiKit.Rect("Art", clip, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f - view.y / Mathf.Max(1f, artH)), Vector2.zero, Vector2.zero);
float pad = (zoom - 1f) * 0.5f;
art.anchorMin = new Vector2(-pad, 1f);
art.anchorMax = new Vector2(1f + pad, 1f);
art.sizeDelta = Vector2.zero;
art.anchoredPosition = Vector2.zero;
var img = art.gameObject.AddComponent<Image>();
img.sprite = sp;
img.color = UISkin.Col("lobby_tint", Color.white); // 로비와 같은 색(거의 원색 · PD 2026-11-11 「너무 어둡지 않게」)
img.raycastTarget = false;
var fit = img.gameObject.AddComponent<AspectRatioFitter>();
fit.aspectMode = AspectRatioFitter.AspectMode.WidthControlsHeight;
fit.aspectRatio = artW / Mathf.Max(1f, artH);
var amb = LobbyAmbient.Build(art, artW, artH, src);
// 위 비네트(로비와 같은 그림 · 탭 글자 대비만)
var vg = UiKit.Rect("Vignette", clip, 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");
return amb;
}
/// <summary>그림 px 점 → 장면 층(그림을 꽉 채움) 정규화 앵커.</summary>
public static Vector2 Anchor(float x, float y, float artW, float artH)
{
return new Vector2(x / Mathf.Max(1f, artW), 1f - y / Mathf.Max(1f, artH));
}
}
}