ThreeKingdomsSlingshot/Assets/Scripts/Editor/ProjectSetup.cs

134 lines
5.3 KiB
C#
Raw Permalink Normal View History

using System.IO;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
namespace TKS.EditorTools
{
/// <summary>
/// 프로젝트 자동 구성. 메뉴 TKS/Setup Project 또는
/// CLI: Unity.exe -batchmode -nographics -projectPath &lt;proj&gt; -executeMethod TKS.EditorTools.ProjectSetup.Build -quit
/// </summary>
public static class ProjectSetup
{
public const string ConfigPath = "Assets/Resources/BalanceConfig.asset";
public const string ScenePath = "Assets/Scenes/Battle.unity";
[MenuItem("TKS/Setup Project (설정 자산·씬 생성)")]
public static void Build()
{
var cfg = EnsureConfig(false);
BuildScene(cfg);
ApplySettings();
UnitArtImporter.ReimportAll();
UI 리뉴얼 A-2~A-4 화면 적용(PD #1100) — 팩 부품 + UI 테마(id 치환) · 화면 10종 · 인박스 ui kind - 테마: SOT Assets/Data/UI/ui_theme.csv(색 57 · 스킨 32 · 아이콘 63 · 제목 폰트) → 메뉴 TKS/Import UI Theme → Resources/UI/UITheme.asset (Runtime/UI/UITheme · UISkin · Editor/UIThemeImporter · ProjectSetup 에서도 임포트) · 화면 코드는 id 로만 묻는다(스프라이트 경로 0) - 신규 제작(B) 치환: Assets/UI/Samguk/**/<id>.png → 임포트 시 같은 id 스킨·아이콘 자동 치환(팩 보존 · 새 id = 아이콘 추가) · Tools/apply_delivery.py ui kind(md5 → Samguk/<group> · gim_* → Resources/Gimmicks/Art · ui_delivered.csv) - 공통: UiKit(카드 = BorderFrame_Round20 틴트 · 버튼 = Button01_s + 광택 · 원 · 진행 바 = Slider_Basic01 · 초상 틀 · 등급 칸 ItemFrame02 · 별 줄 · 병종 배지) · 재화 바(ResourceBar + cur_* 아이콘) · 하단 탭(선택 판 + PictoIcon) · 제목 띠 · 팝업(Popup Topber + 닫기 X) · 토스트 - 화면: 로비(키아트 04 배경 위쪽 ×1.22 · 출정·편성·연무장 아이콘) · 영웅(등급 칸 + 장비 아이콘 · 체크/알림 점 · 별 아이콘) · 편성 · 거래(배너 · 상자 아이콘) · 보물(상자 아이콘 · 포인트 배지) · 내정(보상 줄 · 도면·골드 아이콘) · 연무장 · 결과(리본 · 별) · 월드맵 스테이지 팝업만 팩(거점 kit 유지) - 전투: HUD 칩 · 턴 띠 · 원형 스킬 버튼 + 쿨 라디얼 · 유닛 체력 바 · 기믹 내구 핍 = 팩 슬라이더(월드 9-slice 사본 · 가운데 2 px) · 조준선 색 유지 - 3:4(1536×2048): 본문 비율 축소(UiFitHeight · 1080×1920 = 그대로) - 검증: 플레이모드 116/116(기존 115 + UIThemeTests 1) · 컴파일 0 · error 0 · 캡처 = DataImporter.CaptureUI(UICaptureDriver · 15장) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:20:57 +00:00
UIThemeImporter.Import();
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Debug.Log("[TKS] Setup 완료 · " + ConfigPath + " · " + ScenePath);
}
[MenuItem("TKS/Reset Balance Defaults (기본값 재시드)")]
public static void ResetDefaults()
{
EnsureConfig(true);
AssetDatabase.SaveAssets();
Debug.Log("[TKS] BalanceConfig 기본값 재시드");
}
/// <summary>CLI 용: 기본값 재시드 + 씬·설정 재생성(기존 자산 수치를 덮어쓴다).</summary>
public static void BuildFresh()
{
var cfg = EnsureConfig(true);
BuildScene(cfg);
ApplySettings();
UnitArtImporter.ReimportAll();
UI 리뉴얼 A-2~A-4 화면 적용(PD #1100) — 팩 부품 + UI 테마(id 치환) · 화면 10종 · 인박스 ui kind - 테마: SOT Assets/Data/UI/ui_theme.csv(색 57 · 스킨 32 · 아이콘 63 · 제목 폰트) → 메뉴 TKS/Import UI Theme → Resources/UI/UITheme.asset (Runtime/UI/UITheme · UISkin · Editor/UIThemeImporter · ProjectSetup 에서도 임포트) · 화면 코드는 id 로만 묻는다(스프라이트 경로 0) - 신규 제작(B) 치환: Assets/UI/Samguk/**/<id>.png → 임포트 시 같은 id 스킨·아이콘 자동 치환(팩 보존 · 새 id = 아이콘 추가) · Tools/apply_delivery.py ui kind(md5 → Samguk/<group> · gim_* → Resources/Gimmicks/Art · ui_delivered.csv) - 공통: UiKit(카드 = BorderFrame_Round20 틴트 · 버튼 = Button01_s + 광택 · 원 · 진행 바 = Slider_Basic01 · 초상 틀 · 등급 칸 ItemFrame02 · 별 줄 · 병종 배지) · 재화 바(ResourceBar + cur_* 아이콘) · 하단 탭(선택 판 + PictoIcon) · 제목 띠 · 팝업(Popup Topber + 닫기 X) · 토스트 - 화면: 로비(키아트 04 배경 위쪽 ×1.22 · 출정·편성·연무장 아이콘) · 영웅(등급 칸 + 장비 아이콘 · 체크/알림 점 · 별 아이콘) · 편성 · 거래(배너 · 상자 아이콘) · 보물(상자 아이콘 · 포인트 배지) · 내정(보상 줄 · 도면·골드 아이콘) · 연무장 · 결과(리본 · 별) · 월드맵 스테이지 팝업만 팩(거점 kit 유지) - 전투: HUD 칩 · 턴 띠 · 원형 스킬 버튼 + 쿨 라디얼 · 유닛 체력 바 · 기믹 내구 핍 = 팩 슬라이더(월드 9-slice 사본 · 가운데 2 px) · 조준선 색 유지 - 3:4(1536×2048): 본문 비율 축소(UiFitHeight · 1080×1920 = 그대로) - 검증: 플레이모드 116/116(기존 115 + UIThemeTests 1) · 컴파일 0 · error 0 · 캡처 = DataImporter.CaptureUI(UICaptureDriver · 15장) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:20:57 +00:00
UIThemeImporter.Import();
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Debug.Log("[TKS] BuildFresh 완료 · 기본값 재시드 · " + ScenePath);
}
public static BalanceConfig EnsureConfig(bool overwrite)
{
if (!AssetDatabase.IsValidFolder("Assets/Resources")) AssetDatabase.CreateFolder("Assets", "Resources");
var cfg = AssetDatabase.LoadAssetAtPath<BalanceConfig>(ConfigPath);
bool created = false;
if (cfg == null)
{
cfg = ScriptableObject.CreateInstance<BalanceConfig>();
AssetDatabase.CreateAsset(cfg, ConfigPath);
created = true;
}
if (created || overwrite)
{
BalanceDefaults.Apply(cfg);
StageImporter.ImportInto(cfg); // 챕터·스테이지 = Assets/Data/Stages/*.csv
EditorUtility.SetDirty(cfg);
}
return cfg;
}
static void BuildScene(BalanceConfig cfg)
{
if (!AssetDatabase.IsValidFolder("Assets/Scenes")) AssetDatabase.CreateFolder("Assets", "Scenes");
var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
var camGo = new GameObject("Main Camera");
camGo.tag = "MainCamera";
var cam = camGo.AddComponent<Camera>();
cam.orthographic = true;
cam.orthographicSize = 9.7f;
cam.clearFlags = CameraClearFlags.SolidColor;
cam.backgroundColor = new Color(0.07f, 0.09f, 0.11f);
cam.transform.position = new Vector3(0f, 0f, -10f);
camGo.AddComponent<AudioListener>();
var bootGo = new GameObject("GameBootstrap");
var boot = bootGo.AddComponent<GameBootstrap>();
boot.Config = cfg;
boot.AutoStart = true;
EditorSceneManager.SaveScene(scene, ScenePath);
EditorBuildSettings.scenes = new[] { new EditorBuildSettingsScene(ScenePath, true) };
}
static void ApplySettings()
{
PlayerSettings.companyName = "NerdNavis";
PlayerSettings.productName = "ThreeKingdomsSlingshot";
PlayerSettings.defaultInterfaceOrientation = UIOrientation.Portrait;
PlayerSettings.runInBackground = true;
EditorSettings.defaultBehaviorMode = EditorBehaviorMode.Mode2D;
}
/// <summary>
/// 자동 플레이 실측(GUI 에디터 필요 · -batchmode 없이):
/// Unity.exe -projectPath &lt;proj&gt; -executeMethod TKS.EditorTools.ProjectSetup.AutoPlayCapture -autoplayDir &lt;dir&gt; [-autoplayTurns N]
/// </summary>
public static void AutoPlayCapture()
{
string dir = GetArg("-autoplayDir");
if (string.IsNullOrEmpty(dir)) dir = Path.Combine(Directory.GetCurrentDirectory(), "Logs", "autoplay");
int turns;
if (!int.TryParse(GetArg("-autoplayTurns"), out turns)) turns = 3;
if (!File.Exists(ScenePath)) Build();
EditorSceneManager.OpenScene(ScenePath, OpenSceneMode.Single);
SessionState.SetString("TKS_AUTOPLAY_DIR", dir);
SessionState.SetInt("TKS_AUTOPLAY_TURNS", turns);
Debug.Log("[TKS] AutoPlay 시작 → " + dir + " · turns=" + turns);
EditorApplication.EnterPlaymode();
}
static string GetArg(string name)
{
var args = System.Environment.GetCommandLineArgs();
for (int i = 0; i < args.Length - 1; i++)
{
if (args[i] == name) return args[i + 1];
}
return null;
}
}
}