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);
}
}
}