public void Init(Transform target, Camera gameCamera = null)
{
_target = target;
_gameCamera = gameCamera;
}
void UITipsPosCtrl()
{
if (_target == null) return;
//世界坐标转视口坐标
var veiwPos = _gameCamera == null ? Camera.main.WorldToViewportPoint(_target.position) :
_gameCamera.WorldToViewportPoint(_target.position);
//视口坐标转屏幕坐标
var srceenPos = UIManager.Instance.uiCamera.ViewportToScreenPoint(veiwPos);
Vector2 localPos;
//屏幕坐标转ui坐标
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(transform.parent.GetComponent<RectTransform>(), srceenPos, UIManager.Instance.uiCamera, out localPos))
{
//判断是否在屏幕范围内 在屏幕范围内则不显示
if (localPos.x < screenW / 2 && localPos.x > -screenW / 2 && localPos.y < screenH / 2 && localPos.y > -screenH / 2)
{
img.enabled = false;
}
else
{
//计算与Y轴(二维意义上的Y轴)角度
var angle = Vector2.Angle(Vector2.up, localPos - Vector2.up);
if(localPos.x< 0)
{
rectTransform.localEulerAngles = new Vector3(0,0,angle);
}
else
{
rectTransform.localEulerAngles = new Vector3(0, 0, -angle);
}
float xPos = 0;
float yPos = 0;
//超出屏幕范围坐标值就直接取屏幕边界
if (localPos.x > screenW / 2)
xPos = (screenW / 2) - (selfW / 2);
else if (localPos.x < -screenW / 2)
xPos = (-screenW / 2) + (selfW / 2);
else
xPos = localPos.x;
if (localPos.y > screenH / 2)
yPos = (screenH / 2) - (selfH / 2);
else if (localPos.y < -screenH / 2)
yPos = (-screenH / 2) + (selfH / 2);
else
yPos = localPos.y;
img.enabled = true;
//设置提示图片的位置
rectTransform.anchoredPosition = new Vector2(xPos, yPos);
}
}
}
用UI表现3D物体是否超出边界的提示
最新推荐文章于 2023-03-14 14:34:51 发布