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;
|
}
|
|
}
|
}
|