using UnityEngine; using TMPro; public class SelectionManager : MonoBehaviour { public static SelectionManager Instance { get; private set; } [Header("Nameplate")] public Canvas worldSpaceCanvas; // a World Space Canvas in scene public GameObject nameplatePrefab; // prefab containing TextMeshProUGUI public Vector3 nameplateOffset = new Vector3(0, 2.2f, 0); [Header("Colors")] public Color friendlyColor = Color.green; public Color neutralColor = Color.cyan; public Color enemyColor = Color.red; Selectable current; GameObject activeNameplate; NameplateController nameplateController; void Awake() { if (Instance != null && Instance != this) Destroy(gameObject); Instance = this; } public void Select(Selectable s) { if (current == s) return; ClearSelection(); current = s; if (nameplatePrefab != null && worldSpaceCanvas != null) { activeNameplate = Instantiate(nameplatePrefab, worldSpaceCanvas.transform, false); nameplateController = activeNameplate.GetComponent(); if (nameplateController != null) nameplateController.Initialize(s, GetColorForAttitude(s.attitude), nameplateOffset); } } public void ClearSelection() { if (current != null) current.OnDeselected(); current = null; if (activeNameplate != null) Destroy(activeNameplate); activeNameplate = null; nameplateController = null; } Color GetColorForAttitude(Attitude a) { switch (a) { case Attitude.Friendly: return friendlyColor; case Attitude.Neutral: return neutralColor; case Attitude.Enemy: return enemyColor; default: return neutralColor; } } void Update() { // If nameplate exists, update its world position to follow the selected target if (nameplateController != null && current != null) { nameplateController.FollowTarget(current.transform, nameplateOffset); } // Optional: clear selection if target destroyed if (current == null && activeNameplate != null) { Destroy(activeNameplate); activeNameplate = null; nameplateController = null; } } }