在使用NGUI中有专用的方法将3D场景中的世界坐标转换为UI屏幕中的2D坐标,在Unity新版的UGUI中,将世界坐标转换为屏幕坐标需通过以下几步来实现;
第一:将UI的锚点设为左下角,有的UI无法设置锚点是因为你的该组件或该组件的父物体没有添加RecTransform组件,添加该组件后调整它的锚点为左小脚;
第二:调用以下代码来转换坐标
/// <summary>
/// 世界坐标转UI屏幕坐标
/// </summary>
/// <param name="wordPosition"></param>
/// <returns></returns>
public static Vector2 WordToScenePoint(Vector3 wordPosition)
{
CanvasScaler canvasScaler = GameObject.Find("Canvas").gameObject.GetComponent<CanvasScaler>();
/// 世界坐标转UI屏幕坐标
/// </summary>
/// <param name="wordPosition"></param>
/// <returns></returns>
public static Vector2 WordToScenePoint(Vector3 wordPosition)
{
CanvasScaler canvasScaler = GameObject.Find("Canvas").gameObject.GetComponent<CanvasScaler>();
float resolutionX = canvasScaler.referenceResolution.x;
float resolutionY = canvasScaler.referenceResolution.y;
float offect = (Screen.width / canvasScaler.referenceResolution.x) * (1 - canvasScaler.matchWidthOrHeight) + (Screen.height / canvasScaler.referenceResolution.y) * canvasScaler.matchWidthOrHeight;
Vector2 a = RectTransformUtility.WorldToScreenPoint(Camera.main, wordPosition);
return new Vector2(a.x / offect, a.y / offect);;
}
}
第三:将上步计算的Vector2赋给UI组件
mImageTargeRec.anchoredPosition = WordToScenePoint(wordPosition);