// Assets/_Project/Scripts/UI/HUDController.cs using System.Collections; using UnityEngine; using UnityEngine.UIElements; using TD.Gameplay; using TD.Towers; namespace TD.UI { /// /// Drives the in-match HUD. Requires a UIDocument on the same GameObject. /// Wires gold display, tower command grid, tooltip, rejection messages, /// and minimap RenderTexture to their UI Toolkit counterparts. /// [RequireComponent(typeof(UIDocument))] public class HUDController : MonoBehaviour { // ----- Inspector -------------------------------------------------- [Header("Scene References")] [Tooltip("The local client's TowerPlacementController.")] [SerializeField] private TowerPlacementController placementController; [Tooltip("The TowerPlacementManager NetworkObject in the scene.")] [SerializeField] private TowerPlacementManager placementManager; [Header("Minimap")] [Tooltip("RenderTexture that the minimap camera renders into.")] [SerializeField] private RenderTexture minimapRenderTexture; [Header("Settings")] [SerializeField] private float rejectionMessageDuration = 2.5f; // ----- Cached UI element references ------------------------------- private Label goldLabel; private Label waveLabel; private Label portraitName; private VisualElement commandGrid; private Label ttTitle; private Label ttDesc; private Label ttStats; private Label ttCost; private Label rejectionLabel; // ----- State ------------------------------------------------------ private Coroutine rejectionFadeCoroutine; private bool gridPopulated; private bool uiInitialized; // ----- Lifecycle -------------------------------------------------- private void Start() { // UIDocument creates its panel in OnEnable, which runs after all // Awake() calls. Accessing rootVisualElement in Awake() is too early. // Start() is safe because all OnEnable() calls have completed by then. InitializeUI(); TryPopulateCommandGrid(); } private void InitializeUI() { var doc = GetComponent(); if (doc == null) { Debug.LogError("[HUDController] No UIDocument component found."); return; } var root = doc.rootVisualElement; if (root == null) { Debug.LogError("[HUDController] rootVisualElement is null. " + "Check that Panel Settings and Source Asset are assigned."); return; } // Cache element references — log a warning for any that are missing // so UXML/USS mismatches surface immediately. goldLabel = Require