using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using Newtonsoft.Json; public class IconDataHolder : MonoBehaviour { public IconData Data; } public class PnlIcon : ActionBase { private Dictionary> iconLists = new Dictionary> { { PageType.Icon01, new List() }, { PageType.Icon02, new List() }, { PageType.Icon03, new List() }, { PageType.Icon04, new List() }, // { PageType.Icon05, new List() } }; private Dictionary> appCacheLists; private void InitializeAppCacheLists() { appCacheLists = new Dictionary> { { PageType.Icon01, AppCache.iconPointList01 }, { PageType.Icon02, AppCache.iconPointList02 }, { PageType.Icon03, AppCache.iconPointList03 }, { PageType.Icon04, AppCache.iconPointList04 }, }; } private Dictionary textPrefixes = new Dictionary { { PageType.Icon01, "gnss监测" }, { PageType.Icon02, "水位" }, { PageType.Icon03, "雨量监测" }, { PageType.Icon04, "渗压计监测" }, }; private Dictionary prefabPaths = new Dictionary { { PageType.Icon01, "Icon2D/iconPrefab" }, { PageType.Icon02, "Icon2D/iconPrefab" }, { PageType.Icon03, "Icon2D/iconPrefab" }, { PageType.Icon04, "Icon2D/iconPrefab" }, }; private static readonly Dictionary IconMapping = new Dictionary { { PageType.Icon01, "MT014" }, { PageType.Icon02, "MT011" }, { PageType.Icon03, "MT002" }, { PageType.Icon04, "MT032" } }; private GameObject Player; private CameraRover cameraRover; void Awake() { Player = GameObject.Find("Player"); if (Player != null) { // 获取 Player 上挂载的 CameraRover 脚本实例 cameraRover = Player.GetComponent(); } } void Update() { } public override void Init() { gameObject.SetActive(true); } public override void RegisterAction() { GameEvent.OpenPage += Open; GameEvent.ClosePage += Close; } public override void RemoveAction() { GameEvent.OpenPage -= Open; GameEvent.ClosePage -= Close; } void Open(PageType type) { // Debug.Log(type); OpenIcon(type); } void Close(PageType type) { CloseIcon(type); } // void OpenIcon(PageType type) // { // 确保 AppCache 列表已初始化 // if (!IsAppCacheInitialized()) // { // // Debug.LogError("AppCache 列表未初始化!"); // return; // } // // 确保 appCacheLists 已初始化 // if (appCacheLists == null) // { // InitializeAppCacheLists(); // } // if (!appCacheLists.ContainsKey(type) || appCacheLists[type] == null) // { // // Debug.LogError($"类型 {type} 的列表为空或不存在!"); // return; // } // List iconDataList = appCacheLists[type]; // string prefabPath = prefabPaths[type]; // string textPrefix = textPrefixes[type]; // // Debug.Log(IconMapping[type]); // for (int i = 0; i < iconDataList.Count; i++) // { // IconData iconData = iconDataList[i]; // // 确保数据有效 // if (iconData == null || iconData.iconTransform == null) // continue; // // 预制体对象 // GameObject prefab = Resources.Load(prefabPath); // GameObject icon = PoolManager.Instance.Spawn(prefab); // // 使用 iconTransform 的 name 和 position // icon.name = iconData.iconName; // icon.transform.SetParent(transform); // icon.transform.localScale = Vector3.one * 0.8f; // icon.GetComponent().targetPos = iconData.iconTransform.position; // Transform txtMsgTransform = FindChildRecursive(icon.transform, "txtMsg"); // Text textComponent = txtMsgTransform.GetComponent(); // textComponent.text = icon.name; // Transform iconBgTransform = FindChildRecursive(icon.transform, "iconBg"); // Image iconBgImage = iconBgTransform.GetComponent(); // Sprite sprite = Resources.Load($"icons/{IconMapping[type]}"); // iconBgImage.sprite = sprite; // iconLists[type].Add(icon); // EventListener.AddPointerClickListener(icon, (clickEventData) => OnIconClick(iconData)); ; // } // } void OpenIcon(PageType type) { if (!IsAppCacheInitialized()) { // Debug.LogError("AppCache 列表未初始化!"); return; } // 确保 appCacheLists 已初始化 if (appCacheLists == null) { InitializeAppCacheLists(); } if (!appCacheLists.ContainsKey(type) || appCacheLists[type] == null) { // Debug.LogError($"类型 {type} 的列表为空或不存在!"); return; } List iconDataList = appCacheLists[type]; string prefabPath = prefabPaths[type]; // 1. 提前加载预制体和精灵资源,避免重复加载 GameObject prefab = Resources.Load(prefabPath); Sprite iconSprite = Resources.Load($"icons/{IconMapping[type]}"); // 检查资源是否成功加载 if (prefab == null || iconSprite == null) { Debug.LogError($"资源加载失败: Prefab={prefabPath}, Sprite=icons/{IconMapping[type]}"); return; } // 2. 初始化列表(如果需要) if (iconLists[type] == null) iconLists[type] = new List(); // 3. 使用协程分帧创建对象,减少单帧压力 StartCoroutine(CreateIconsOverTime(type, iconDataList, prefab, iconSprite)); } IEnumerator CreateIconsOverTime(PageType type, List iconDataList, GameObject prefab, Sprite iconSprite) { int batchSize = 5; // 每帧创建的对象数量 int framesBetweenBatches = 1; // 创建批次之间的帧数 for (int i = 0; i < iconDataList.Count; i++) { IconData iconData = iconDataList[i]; if (iconData == null || iconData.iconTransform == null) continue; // 从对象池生成图标 GameObject icon = PoolManager.Instance.Spawn(prefab); SetupIcon(icon, iconData, iconSprite); iconLists[type].Add(icon); // 控制创建速率 if ((i + 1) % batchSize == 0) { // 每创建batchSize个对象后等待几帧 for (int f = 0; f < framesBetweenBatches; f++) yield return null; } } // 4. 加载完成后强制垃圾回收 yield return new WaitForSeconds(0.5f); Resources.UnloadUnusedAssets(); System.GC.Collect(); } void SetupIcon(GameObject icon, IconData iconData, Sprite iconSprite) { // 设置图标基本属性 icon.name = iconData.iconName; icon.transform.SetParent(transform); icon.transform.localScale = Vector3.one * 0.8f; icon.GetComponent().targetPos = iconData.iconTransform.position; // 获取并设置文本组件 Transform txtMsgTransform = FindChildRecursive(icon.transform, "txtMsg"); Text textComponent = txtMsgTransform.GetComponent(); textComponent.text = icon.name; // 设置图标背景 Transform iconBgTransform = FindChildRecursive(icon.transform, "iconBg"); Image iconBgImage = iconBgTransform.GetComponent(); iconBgImage.sprite = iconSprite; // 添加点击事件 EventListener.AddPointerClickListener(icon, (clickEventData) => OnIconClick(iconData)); } private bool IsAppCacheInitialized() { return AppCache.iconPointList01 != null && AppCache.iconPointList02 != null && AppCache.iconPointList03 != null && AppCache.iconPointList04 != null; } void CloseIcon(PageType type) { if (!iconLists.ContainsKey(type)) { return; } for (int i = 0; i < iconLists[type].Count; i++) { PoolManager.Instance.Unspawn(iconLists[type][i]); } iconLists[type].Clear(); } private Transform FindChildRecursive(Transform parent, string name) { foreach (Transform child in parent) { if (child.name == name) return child; // 递归查找子对象的子对象 Transform found = FindChildRecursive(child, name); if (found != null) return found; } return null; } void OnIconClick(IconData iconData) { if (iconData != null && cameraRover != null) { cameraRover.StartCoroutine(cameraRover.CallOpenItem(iconData.cameraTransform)); cameraRover.SetTargetPosition(iconData.iconTransform.position); // Debug.Log($"点击的图标信息:"); // Debug.Log($"device_sn: {iconData.device_sn}"); // Debug.Log($"iconName: {iconData.iconName}"); // Debug.Log($"identifier: {iconData.identifier}"); // Debug.Log($"iconTransform: {iconData.iconTransform}"); // Debug.Log($"cameraName: {iconData.cameraName}"); // Debug.Log($"cameraTransform: {iconData.cameraTransform.position}"); // Debug.Log(iconData.iconTransform.position); StartCoroutine(WaitForFlightCompletion(iconData)); cameraRover.StartCoroutine(cameraRover.CallOpenItem(iconData.cameraTransform)); } else { Debug.LogWarning("点击的图标没有关联的 IconData!"); } } private IEnumerator WaitForFlightCompletion(IconData iconData) { // 等待飞行结束 while (!cameraRover.isFlightCompleted) { yield return null; } // 飞行结束,执行网络请求和数据发送操作 string BASE_URL = "/api.php/Device/deviceDetail?device_sn=" + iconData.device_sn + "&identifier=" + iconData.identifier; string url = WebService.IsRunningInWebGL() ? BASE_URL : AppCache.url + BASE_URL; WebService.Instance.Get(url, delegate (JsonDetails details) { var dataToSend = new DataToSend { dataItem = details.result, iconName = iconData.iconName }; string jsonData = JsonConvert.SerializeObject(dataToSend); // Debug.Log("序列化后的JSON: " + jsonData); Application.ExternalCall("sendDataToVue", jsonData); cameraRover.SetFlightCompleted(false); }); } }