| using Cysharp.Threading.Tasks; | 
| using UnityEngine; | 
| using UnityEngine.UI; | 
|   | 
| /// <summary> | 
| /// 文本提示界面:外部传入文本内容和世界坐标系位置 | 
| /// </summary> | 
| public class SmallTipWin : UIBase | 
| { | 
|   | 
|     [SerializeField] RectTransform rectTransform; | 
|     [SerializeField] RectTransform arrowImage; | 
|     [SerializeField] RectTransform arrowUpImage; | 
|     [SerializeField] Text descText; | 
|   | 
|     public static Vector3 worldPos; //世界坐标系位置 | 
|     public static string showText; | 
|     public static bool isDownShow = false;  // 是否向下显示 | 
|   | 
|     protected override void OnPreOpen() | 
|     { | 
|         descText.text = showText; | 
|         rectTransform.position = new Vector3(100, 100, 100);   //初始化时,屏幕范围外 | 
|         arrowImage.SetActive(!isDownShow); | 
|         arrowUpImage.SetActive(isDownShow); | 
|     } | 
|   | 
|     protected override void OnPreClose() | 
|     { | 
|         isDownShow = false; | 
|     } | 
|      | 
|   | 
|     protected override void OnOpen() | 
|     { | 
|         UpdatePos().Forget(); | 
|     } | 
|   | 
|     async UniTask UpdatePos() | 
|     { | 
|         await UniTask.DelayFrame(3); | 
|         // 限制在屏幕范围内 | 
|         Vector3[] corners = new Vector3[4]; | 
|         rectTransform.GetWorldCorners(corners); | 
|   | 
|         float minY = corners[0].y; | 
|         float maxY = corners[0].y; | 
|   | 
|         for (int i = 1; i < corners.Length; i++) | 
|         { | 
|             if (corners[i].y < minY) minY = corners[i].y; | 
|             if (corners[i].y > maxY) maxY = corners[i].y; | 
|         } | 
|   | 
|   | 
|         float screenHeight = maxY - minY; | 
|         Vector2 adjustedPos = new Vector2(worldPos.x, worldPos.y + (!isDownShow ? screenHeight * 0.5f : -screenHeight * 0.5f)); | 
|   | 
|         Vector2 screenAdjustedPos = CameraManager.uiCamera.WorldToScreenPoint(adjustedPos); | 
|         var rectWidth = rectTransform.rect.width * Screen.width / canvasScaler.referenceResolution.x; | 
|         screenAdjustedPos.x = Mathf.Clamp(screenAdjustedPos.x, rectWidth * 0.5f, Screen.width - rectWidth * 0.5f); | 
|         screenAdjustedPos.y = Mathf.Clamp(screenAdjustedPos.y, rectTransform.rect.height * 0.5f, Screen.height - rectTransform.rect.height * 0.5f - 15); | 
|   | 
|         adjustedPos = CameraManager.uiCamera.ScreenToWorldPoint(screenAdjustedPos); | 
|         rectTransform.position = adjustedPos; | 
|   | 
|         if (!isDownShow) | 
|         { | 
|             rectTransform.localPosition = new Vector3(rectTransform.localPosition.x, rectTransform.localPosition.y + 15, rectTransform.localPosition.z); | 
|         } | 
|         else | 
|         { | 
|             rectTransform.localPosition = new Vector3(rectTransform.localPosition.x, rectTransform.localPosition.y - 15, rectTransform.localPosition.z); | 
|         } | 
|   | 
|         rectTransform.GetWorldCorners(corners); | 
|         float minX = corners[0].x; | 
|         float maxX = corners[0].x; | 
|   | 
|         for (int i = 1; i < corners.Length; i++) | 
|         { | 
|             if (corners[i].x < minX) minX = corners[i].x; | 
|             if (corners[i].x > maxX) maxX = corners[i].x; | 
|         } | 
|   | 
|         //显示arrowImage 的x轴上的位置,和worldPos同步,但不超过minX 和 maxX范围 | 
|         if (!isDownShow) | 
|         { | 
|             Vector3 arrowImagePosition = arrowImage.position; | 
|             arrowImagePosition.x = Mathf.Clamp(worldPos.x, minX, maxX); | 
|             arrowImage.position = arrowImagePosition; | 
|         } | 
|         else | 
|         { | 
|             Vector3 arrowUpImagePosition = arrowUpImage.position; | 
|             arrowUpImagePosition.x = Mathf.Clamp(worldPos.x, minX, maxX); | 
|             arrowUpImage.position = arrowUpImagePosition; | 
|         } | 
|   | 
|     } | 
| } |