Files
3d-gangjiegou/Assets/Scripts/SortingIcons/DisplayChosenIcons.cs
2026-05-08 15:34:53 +08:00

140 lines
3.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class DisplayChosenIcons : MonoBehaviour
{
List<string> IconKinds = new List<string>
{
"振动加速度", "沉降监测", "气象监测",
"倾角监测", "应变监测","裂缝监测"
};
// 缓存:每个标签 -> 该标签下的所有物体
private Dictionary<string, List<GameObject>> cachedObjects;
private List<Button> allButtons = new List<Button>();
public Camera cam;
// 飞行锁定时间,固定 1.5 秒
public float flyDuration = 1.5f;
private bool flying = false;
void Start()
{
if (cam == null)
cam = Camera.main;
cachedObjects = new Dictionary<string, List<GameObject>>();
// 为每个标签创建一个空列表,并缓存场景物体
foreach (string tag in IconKinds)
{
cachedObjects[tag] = new List<GameObject>();
GameObject[] found = GameObject.FindGameObjectsWithTag(tag);
cachedObjects[tag].AddRange(found);
}
// 绑定按钮点击
foreach (Transform child in transform)
{
Button btn = child.GetComponent<Button>();
if (btn != null)
{
allButtons.Add(btn);
string btnName = child.gameObject.name;
btn.onClick.AddListener(() => OnClickEvent(btnName));
}
}
}
void OnClickEvent(string selectedName)
{
if (cam.gameObject.activeInHierarchy == false)
{
return;
}
// 飞行过程中,所有点击无效
if (flying)
{
return;
}
flying = true;
SetButtonsInteractable(false);
// 1. 立即切换图标显示
ApplyDisplay(selectedName);
// 2. 开始飞行
if (cam != null)
{
DoubleClickToFocus focus = cam.GetComponent<DoubleClickToFocus>();
if (focus != null)
{
focus.FlyToOverlookAndConvertCore(selectedName);
}
}
// 3. 1.5 秒后解锁
StartCoroutine(UnlockAfterDelay());
}
IEnumerator UnlockAfterDelay()
{
yield return null;
float transitionDuration = cam.transform.GetComponent<DoubleClickToFocus>().transitionDuration;
yield return new WaitForSeconds(transitionDuration+0.01f);
flying = false;
SetButtonsInteractable(true);
}
void ApplyDisplay(string selectedName)
{
if (selectedName == "全部")
{
foreach (var kvp in cachedObjects)
{
foreach (GameObject obj in kvp.Value)
{
if (obj != null)
obj.SetActive(true);
}
}
}
else
{
// 先全部隐藏
foreach (var kvp in cachedObjects)
{
foreach (GameObject obj in kvp.Value)
{
if (obj != null)
obj.SetActive(false);
}
}
// 再显示当前类别
if (cachedObjects.ContainsKey(selectedName))
{
foreach (GameObject obj in cachedObjects[selectedName])
{
if (obj != null)
obj.SetActive(true);
}
}
}
}
void SetButtonsInteractable(bool enable)
{
foreach (Button btn in allButtons)
{
if (btn != null)
btn.interactable = enable;
}
}
}