using UnityEngine; namespace TKS { /// 씬에 하나만 두면 카메라·전장·전투 관리자·HUD·입력을 코드로 구성하고 첫 스테이지를 시작한다. public class GameBootstrap : MonoBehaviour { public BalanceConfig Config; public bool AutoStart = true; public int StartStageIndex = 0; public BattleManager Battle { get; private set; } void Awake() { if (Config == null) Config = Resources.Load("BalanceConfig"); if (Config == null) { Debug.LogError("[TKS] BalanceConfig 자산이 없습니다. 메뉴 TKS/Setup Project 를 실행하세요."); return; } var cam = Camera.main; if (cam == null) { var cgo = new GameObject("Main Camera"); cgo.tag = "MainCamera"; cam = cgo.AddComponent(); } cam.orthographic = true; cam.clearFlags = CameraClearFlags.SolidColor; cam.backgroundColor = new Color(0.07f, 0.09f, 0.11f); cam.transform.position = new Vector3(0f, 0f, -10f); cam.nearClipPlane = 0.1f; cam.farClipPlane = 100f; var fit = cam.GetComponent(); if (fit == null) fit = cam.gameObject.AddComponent(); var board = new GameObject("Board").AddComponent(); board.Build(Config.boardSize); fit.Board = board; fit.Fit(); Battle = new GameObject("BattleManager").AddComponent(); Battle.Configure(Config, board); var hud = new GameObject("HUD").AddComponent(); hud.Build(Battle, cam); Battle.Hud = hud; var input = new GameObject("SlingshotInput").AddComponent(); input.Init(Battle, cam, hud); Battle.Sling = input; if (AutoStart) Battle.StartStage(StartStageIndex); } } /// 화면 비율이 달라도 전장 전체가 보이도록 직교 카메라 크기를 맞춘다. public class CameraFitter : MonoBehaviour { public Board Board; public float Margin = 0.5f; Camera cam; void Awake() { cam = GetComponent(); } void LateUpdate() { Fit(); } public void Fit() { if (cam == null) cam = GetComponent(); if (Board == null || cam == null) return; float halfW = Board.Size.x * 0.5f + Margin; float halfH = Board.Size.y * 0.5f + Margin + 1.2f; // 위아래 HUD 여유 float aspect = Mathf.Max(0.1f, cam.aspect); cam.orthographicSize = Mathf.Max(halfH, halfW / aspect); } } }