Files
Click-PointRPG/Assets/Scripts/SelectionManager.cs
2026-02-10 21:27:46 +00:00

82 lines
2.4 KiB
C#

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<NameplateController>();
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;
}
}
}