82 lines
2.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|