using System.IO; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; namespace TKS.EditorTools { /// /// 프로젝트 자동 구성. 메뉴 TKS/Setup Project 또는 /// CLI: Unity.exe -batchmode -nographics -projectPath <proj> -executeMethod TKS.EditorTools.ProjectSetup.Build -quit /// 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(); 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 기본값 재시드"); } /// CLI 용: 기본값 재시드 + 씬·설정 재생성(기존 자산 수치를 덮어쓴다). public static void BuildFresh() { var cfg = EnsureConfig(true); BuildScene(cfg); ApplySettings(); UnitArtImporter.ReimportAll(); 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(ConfigPath); bool created = false; if (cfg == null) { cfg = ScriptableObject.CreateInstance(); 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(); 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(); var bootGo = new GameObject("GameBootstrap"); var boot = bootGo.AddComponent(); 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; } /// /// 자동 플레이 실측(GUI 에디터 필요 · -batchmode 없이): /// Unity.exe -projectPath <proj> -executeMethod TKS.EditorTools.ProjectSetup.AutoPlayCapture -autoplayDir <dir> [-autoplayTurns N] /// 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; } } }