using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class xiaozhigou : MonoBehaviour { public Camera mainCamera; // 玩家摄像机 public RectTransform uiCanvas; // UI Canvas 的 RectTransform public GameObject targetIconPrefab; // UI 图标的预制体 private LinkedList playerList = new LinkedList(); // 存储标签为 "Player" 的对象 private GameObject peopleposition;//位置的信息 private Dictionary playerUIMap = new Dictionary(); // 存储角色与对应的 UI 标记 private void Start() { peopleposition = GameObject.Find("peopleposition"); if (peopleposition == null) { Debug.LogError("请确保场景中有一个名为 'peopleposition' 的 GameObject 作为 UI 的父物体。"); return; } // 初始化获取当前场景中所有的 "Player" 标签对象并创建 UI 标记 UpdatePlayerList(); CreateUIForPlayers(); } void Update() { // 实时更新 Player 列表和对应的 UI UpdatePlayerList(); UpdateUIForPlayers(); } // 更新链表中的 "Player" 对象 private void UpdatePlayerList() { // 获取所有带有 "Player" 标签的对象 GameObject[] players = GameObject.FindGameObjectsWithTag("Player"); // 检查新增的 Player foreach (GameObject player in players) { if (!playerList.Contains(player)) // 新增的角色 { playerList.AddLast(player); // 为新增角色创建 UI 标记 if (!playerUIMap.ContainsKey(player)) { CreateUIForPlayer(player); } } } // 检查已移除的 Player var node = playerList.First; while (node != null) { var nextNode = node.Next; if (!System.Array.Exists(players, p => p == node.Value)) { // 如果角色已被移除,删除对应的 UI 标记 if (playerUIMap.ContainsKey(node.Value)) { Destroy(playerUIMap[node.Value].gameObject); playerUIMap.Remove(node.Value); } playerList.Remove(node); } node = nextNode; } } // 为所有玩家创建 UI 标记 private void CreateUIForPlayers() { foreach (var player in playerList) { if (!playerUIMap.ContainsKey(player)) { CreateUIForPlayer(player); } } } // 为单个玩家创建 UI 标记 private void CreateUIForPlayer(GameObject player) { if (targetIconPrefab == null || uiCanvas == null) { Debug.LogError("请确保已设置 TargetIconPrefab 和 uiCanvas。"); return; } // 实例化 UI 图标 GameObject iconInstance = Instantiate(targetIconPrefab, peopleposition.transform); // 获取 RectTransform 用于设置位置 RectTransform iconRectTransform = iconInstance.GetComponent(); // 设置初始内容 Text nameText = iconInstance.GetComponentInChildren(); if (nameText != null) { nameText.text = player.name; // 显示角色名称 } // 将 UI 图标与玩家对应 playerUIMap[player] = iconRectTransform; } // 实时更新所有玩家的 UI private void UpdateUIForPlayers() { foreach (var player in playerList) { if (!playerUIMap.ContainsKey(player)) continue; RectTransform targetIcon = playerUIMap[player]; // 获取玩家的屏幕坐标 Vector3 screenPoint = mainCamera.WorldToScreenPoint(player.transform.position); // 检查玩家是否在屏幕内 if (screenPoint.z > 0 && screenPoint.x > 0 && screenPoint.x < Screen.width && screenPoint.y > 0 && screenPoint.y < Screen.height) { // 玩家在屏幕内,显示图标 targetIcon.gameObject.SetActive(true); targetIcon.position = screenPoint; //// 更新图标内容 //Text nameText = targetIcon.GetComponentInChildren(); //if (nameText != null) //{ // float distance = Vector3.Distance(mainCamera.transform.position, player.transform.position); // nameText.text = $"{player.name}\n距离: {distance:F1} 米"; //} } else { // 玩家不在屏幕内,隐藏图标 targetIcon.gameObject.SetActive(false); } } } }