87 lines
2.9 KiB
C#
87 lines
2.9 KiB
C#
using UnityEngine;
|
|
|
|
namespace TKS
|
|
{
|
|
/// <summary>씬에 하나만 두면 카메라·전장·전투 관리자·HUD·입력을 코드로 구성하고 첫 스테이지를 시작한다.</summary>
|
|
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>("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<Camera>();
|
|
}
|
|
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<CameraFitter>();
|
|
if (fit == null) fit = cam.gameObject.AddComponent<CameraFitter>();
|
|
|
|
var board = new GameObject("Board").AddComponent<Board>();
|
|
board.Build(Config.boardSize);
|
|
fit.Board = board;
|
|
fit.Fit();
|
|
|
|
Battle = new GameObject("BattleManager").AddComponent<BattleManager>();
|
|
Battle.Configure(Config, board);
|
|
|
|
var hud = new GameObject("HUD").AddComponent<BattleHUD>();
|
|
hud.Build(Battle, cam);
|
|
Battle.Hud = hud;
|
|
|
|
var input = new GameObject("SlingshotInput").AddComponent<SlingshotInput>();
|
|
input.Init(Battle, cam, hud);
|
|
Battle.Sling = input;
|
|
|
|
if (AutoStart) Battle.StartStage(StartStageIndex);
|
|
}
|
|
}
|
|
|
|
/// <summary>화면 비율이 달라도 전장 전체가 보이도록 직교 카메라 크기를 맞춘다.</summary>
|
|
public class CameraFitter : MonoBehaviour
|
|
{
|
|
public Board Board;
|
|
public float Margin = 0.5f;
|
|
Camera cam;
|
|
|
|
void Awake()
|
|
{
|
|
cam = GetComponent<Camera>();
|
|
}
|
|
|
|
void LateUpdate()
|
|
{
|
|
Fit();
|
|
}
|
|
|
|
public void Fit()
|
|
{
|
|
if (cam == null) cam = GetComponent<Camera>();
|
|
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);
|
|
}
|
|
}
|
|
}
|