ThreeKingdomsSlingshot/Assets/Scripts/Runtime/GameBootstrap.cs

81 lines
3.3 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; }
public CameraController CameraCtrl { 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 board = new GameObject("Board").AddComponent<Board>();
board.Build(Config.boardSize);
CameraCtrl = cam.GetComponent<CameraController>();
if (CameraCtrl == null) CameraCtrl = cam.gameObject.AddComponent<CameraController>();
CameraCtrl.Init(board, Config.cameraViewHeight, Config.cameraMinViewHeight, Config.cameraMaxViewHeight);
Battle = new GameObject("BattleManager").AddComponent<BattleManager>();
Battle.Configure(Config, board);
var hud = new GameObject("HUD").AddComponent<BattleHUD>();
hud.Build(Battle, cam, CameraCtrl);
Battle.Hud = hud;
var input = new GameObject("SlingshotInput").AddComponent<SlingshotInput>();
input.Init(Battle, cam, hud, CameraCtrl);
Battle.Sling = input;
// 카메라 연동: 행동 중인 유닛 추적 · 아군 턴 시작 시 아군 쪽으로
var camCtrl = CameraCtrl;
var battle = Battle;
battle.UnitActing += u => camCtrl.Follow(u.transform);
battle.PhaseChanged += phase =>
{
if (phase == BattlePhase.PlayerTurn) camCtrl.FocusOn(PlayerFocusPoint(battle));
else if (phase == BattlePhase.StageClear || phase == BattlePhase.Defeat) camCtrl.StopFollow();
};
battle.StageStarted += () => camCtrl.SnapTo(PlayerFocusPoint(battle));
if (AutoStart) Battle.StartStage(StartStageIndex);
}
/// <summary>아군 무게중심에서 적 쪽으로 조금 올린 지점.</summary>
static Vector2 PlayerFocusPoint(BattleManager battle)
{
var players = battle.AliveUnits(Faction.Player);
if (players.Count == 0) return Vector2.zero;
Vector2 sum = Vector2.zero;
foreach (var p in players) sum += p.Position;
return sum / players.Count + new Vector2(0f, battle.Config.cameraViewHeight * 0.2f);
}
}
}