using UnityEngine; using UnityEngine.UI; using TMPro; using System.Collections.Generic; /// /// Programmatically builds the complete in-game HUD inside the InGame canvas (Client.unity). /// /// Call BuildNow() from GameManager.OnSceneLoaded BEFORE BindClientScene so GameManager_UI /// can locate named children. /// /// Named elements expected by GameManager_UI (Transform.Find / FindTMP): /// ActionButton – proxim action button /// SabotagePanel – top-of-screen sabotage banner /// SabotageTimer – TMP countdown text inside SabotagePanel /// MeetingPanel – full-screen voting overlay /// MeetingHeader – TMP title /// MeetingPlayerList – TMP player list (text fallback) /// SkipButton – skip-vote button /// VoteResultPanel – sub-panel shown after voting /// VoteResult – TMP result text /// GameEndPanel – full-screen end-of-game overlay /// GameEndText – TMP result text /// KillCooldown – TMP kill-cooldown label /// TaskList – TMP task name list /// TaskProgress – TMP global task progress /// Toast – TMP toast notification /// public class InGameHUDBuilder : MonoBehaviour { // ── Palette ─────────────────────────────────────────────────────────────── static Color H(string hex) { ColorUtility.TryParseHtmlString(hex, out var c); return c; } static readonly Color C_BG = H("#0D0F1A"); static readonly Color C_BAR = H("#141927"); static readonly Color C_ACCENT = H("#3399FF"); static readonly Color C_GREEN = H("#2DB84B"); static readonly Color C_RED = H("#C43232"); static readonly Color C_ORANGE = H("#F08C1A"); static readonly Color C_YELLOW = H("#FFB800"); static readonly Color C_MUTED = new Color(0.47f, 0.53f, 0.67f); static readonly Color C_ROW_A = H("#1A2035"); static readonly Color C_ROW_B = H("#161C2E"); private bool _built; public void BuildNow() { if (!_built) { _built = true; Build(); } } void Start() { if (!_built) Build(); } void Build() { var rt = GetComponent(); if (rt == null) return; BuildTopBar(rt); BuildTaskPanel(rt); BuildTaskProgress(rt); BuildBottomBar(rt); BuildActionButton(rt); BuildSabotagePanel(rt); BuildMeetingPanel(rt); BuildGameEndPanel(rt); BuildToast(rt); } // ── Top bar ─────────────────────────────────────────────────────────────── void BuildTopBar(RectTransform parent) { var bar = Child("_TopBar", parent); Anchor(bar, new Vector2(0,1), new Vector2(1,1), new Vector2(0,-90f), Vector2.zero); bar.pivot = new Vector2(0.5f,1f); Img(bar, C_BAR); // Kill cooldown – right half, hidden by default var cd = Child("KillCooldown", bar); cd.anchorMin = new Vector2(0.5f, 0); cd.anchorMax = Vector2.one; cd.offsetMin = new Vector2(0, 6); cd.offsetMax = new Vector2(-12, -6); var cdTmp = cd.gameObject.AddComponent(); cdTmp.text = ""; cdTmp.fontSize = 32; cdTmp.color = C_ORANGE; cdTmp.fontStyle = FontStyles.Bold; cdTmp.alignment = TextAlignmentOptions.MidlineRight; cd.gameObject.SetActive(false); } // ── Task panel (right side) ─────────────────────────────────────────────── void BuildTaskPanel(RectTransform parent) { var panel = Child("_TaskPanel", parent); panel.anchorMin = new Vector2(1,0.35f); panel.anchorMax = new Vector2(1,0.88f); panel.pivot = new Vector2(1,0.5f); panel.sizeDelta = new Vector2(280,0); Img(panel, new Color(0.05f,0.06f,0.12f,0.85f)); var hdr = Child("_Hdr", panel); Anchor(hdr, new Vector2(0,1), new Vector2(1,1), new Vector2(0,-44), Vector2.zero); hdr.pivot = new Vector2(0.5f,1f); Img(hdr, new Color(0.2f,0.6f,1f,0.5f)); TxtChild(hdr,"MY TASKS",26,Color.white,TextAlignmentOptions.Center,bold:true); var body = Child("TaskList", panel); body.anchorMin = Vector2.zero; body.anchorMax = Vector2.one; body.offsetMin = new Vector2(8,8); body.offsetMax = new Vector2(-8,-48); var t = body.gameObject.AddComponent(); t.text = ""; t.fontSize = 22; t.color = Color.white; t.alignment = TextAlignmentOptions.TopLeft; t.enableWordWrapping = true; } // ── Task progress (above bottom bar) ───────────────────────────────────── void BuildTaskProgress(RectTransform parent) { var prog = Child("TaskProgress", parent); Anchor(prog, new Vector2(0,0), new Vector2(1,0), new Vector2(-20,120), new Vector2(20,160)); var t = prog.gameObject.AddComponent(); t.text = ""; t.fontSize = 28; t.color = Color.white; t.fontStyle = FontStyles.Bold; t.alignment = TextAlignmentOptions.Center; } // ── Bottom bar ──────────────────────────────────────────────────────────── void BuildBottomBar(RectTransform parent) { var bar = Child("_BottomBar", parent); Anchor(bar, Vector2.zero, new Vector2(1,0), Vector2.zero, new Vector2(0,110)); bar.pivot = new Vector2(0.5f,0); Img(bar, C_BAR); var recBtn = Child("_RecenterBtn", bar); recBtn.anchorMin = new Vector2(0.82f,0.08f); recBtn.anchorMax = new Vector2(0.98f,0.92f); var recBg = Img(recBtn, C_ACCENT); var recButton = recBtn.gameObject.AddComponent