This repository has been archived on 2026-01-20. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
SH-INT/Assets/Scripts/NameTagManager.cs
정영민 f4cf556cde update
2025-02-20 10:30:18 +09:00

111 lines
3.4 KiB
C#

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<UI_NameTag> nameTags = new();
List<Facility> facilities = new();
public float defaultNameHeight;
public float nameTagMaxScale;
public float nameTagMinScale;
public void GenerateNameTags(FacilityManager fm)
{
OrbitalController controller = FindSingle<OrbitalController>();
cam = controller.camera;
nameTag_Prefab = Resources.Load<UI_NameTag>("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();
}
}
}
}