##物体提示
话不多说 直接上代码
//定义信息变量
[SerializeField] private Transform target;
[SerializeField] private Camera gameCamera;
[SerializeField] private Canvas canvas;
//定义UI变量
[SerializeField,Header("物体点UI")]
public Image YuanDian;
[SerializeField, Header("原点偏移量")]
private Vector3 YuanDianOffset;
[SerializeField, Header("指引线UI")]
private Image zhiyinxian;
[SerializeField,Header("tip偏移量")]
public Vector3 tipOffset;
private RectTransform rectTransform;
public Transform Target
{
get { return this.target; }
set { this.target = value; }
}
public Canvas Canvas
{
get { return this.canvas; }
set { this.canvas = value; }
}
public Camera Camera
{
get { return this.gameCamera; }
set { this.gameCamera = value; }
}
//主要方法
/// <summary>
/// 计算屏幕的位置
/// </summary>
public static Vector3 CalculateScreenPosition(Vector3 position/* 目标点*/, Camera camera, Canvas canvas,
RectTransform transform)
{
Assert.IsNotNull<Camera>(camera);
Assert.IsNotNull<Canvas>(canvas);
Assert.IsNotNull<RectTransform>(transform);
//世界坐标转屏幕坐标
Vector3 vector = camera.WorldToScreenPoint(position);
Vector3 zero = Vector3.zero;
//判断canvas 渲染模式
switch (canvas.renderMode)
{
//屏幕空间
case RenderMode.ScreenSpaceOverlay:
RectTransformUtility.ScreenPointToWorldPointInRectangle(transform, vector, null, out zero);
break;
case RenderMode.ScreenSpaceCamera:
//世界空间
case RenderMode.WorldSpace:
RectTransformUtility.ScreenPointToWorldPointInRectangle(transform, vector, canvas.worldCamera,
out zero);
break;
}
return zero;
}
// 主要调用方法
private void LateUpdate()
{
if (this.gameCamera == null)
{
this.gameCamera = Camera.main;
}
UpdatePos();
}
private void UpdatePos()
{
if (this.target == null || this.canvas == null || this.gameCamera == null || this.rectTransform == null)
{
return;
}
//计算屏幕坐标
Vector3 position = CalculateScreenPosition(this.target.position, this.gameCamera,
this.canvas,tip.GetComponent<RectTransform>() );
tip.transform.position = position+tipOffset;
YuanDian.transform.position = Camera.WorldToScreenPoint(target.position)+YuanDianOffset;
zhiyinxian.transform.position = (YuanDian.transform.position+tip.transform.position)/2;
zhiyinxian.transform.localEulerAngles = new Vector3(0, 0, Vector2.SignedAngle(Vector2.right, YuanDian.transform.position- tip.transform.position));
float length = (YuanDian.transform.position-tip.transform.position).magnitude;
//设置线的宽度 长度
zhiyinxian. GetComponent<RectTransform>().sizeDelta = new Vector2(length, 3f);
}
具体效果:
白色image圆点 红色 image线 image提示UI