using System.Collections; using System.Collections.Generic; using UnityEngine; using SHINT.UI; using WI; using UnityEngine.Rendering; using System.Linq; namespace SHINT { [DefaultExecutionOrder(int.MinValue+1)] public class NameTagManager : MonoBehaviour, ISingle { UI_NameTag nameTag_Prefab; public Camera cam; List nameTags = new(); List facilities = new(); public float defaultNameHeight; public float nameTagMaxScale; public float nameTagMinScale; public void GenerateNameTags(FacilityManager fm) { OrbitalController controller = FindSingle(); cam = controller.camera; nameTag_Prefab = Resources.Load("Prefabs/PRF_UI_NameTag"); facilities = fm.FacilityList(); foreach (Facility facility in facilities) { UI_NameTag newNameTag = Instantiate(nameTag_Prefab, transform); nameTags.Add(newNameTag); newNameTag.Initialize(); newNameTag.ShowData(facility); newNameTag.isTagActivate = true; facility.SetNameTag(newNameTag); } } private void Start() { GraphicsSettings.transparencySortMode = TransparencySortMode.Perspective; } private void Update() { SettingPos(); SettingScale(); SortbyCamera(); } void SettingPos() { foreach (Facility facility in facilities) { Vector3 screenPos = cam.WorldToScreenPoint(new Vector3(facility.centerPos.x, facility.height + defaultNameHeight, facility.centerPos.z)); if (screenPos.z > 0) { facility.nameTag.transform.position = screenPos; } } } void SettingScale() { foreach (Facility facility in facilities) { float distance = Vector3.Distance(cam.transform.position, facility.centerPos); float scale = Mathf.Clamp(6f / distance, nameTagMinScale, nameTagMaxScale); facility.nameTag.myScale = scale; if (facility.nameTag.isTagActivate) { facility.nameTag.transform.localScale = new Vector3(scale, scale, scale); } } } void SortbyCamera() { //nameTags.Sort((a, b) => Vector3.Distance(a.transform.position, cam.transform.position) // .CompareTo(Vector3.Distance(b.transform.position, cam.transform.position))); //nameTags.Reverse(); nameTags = nameTags .OrderByDescending(n => Vector3.Distance(n.transform.position, cam.transform.position)).ToList(); for (int i = 0; i < nameTags.Count; i++) { nameTags[i].transform.SetSiblingIndex(i); } } public void ActiveNameTags_Animation() { foreach(UI_NameTag tags in nameTags) { tags.Activate_Animation(); } } public void ActiveNameTags_NonAnimation() { foreach (UI_NameTag tags in nameTags) { tags.Activate_NonAnimation(); } } } }