只是简单的记录一下
WorldToScreenPoint ,通过它转换出的坐标是基于屏幕分辨率的,那么想要转换成Canvas上的坐标,由于Canvas Scaler的影响,就需要进一步计算,而计算所用的宽和高,就不能用参考分辨率的,要是用经过Canvas Scaler处理过的宽和高。处理如下:
/// <summary>
/// 根据Canvas的设置,转换出uGUI可使用的坐标
/// </summary>
/// <param name="screenPos">3D场景中的物体</param>
/// <returns></returns>
public Vector2 GetUIPosByScreen(Transform objTrm)
{
Vector3 screenPos = Camera.main.WorldToScreenPoint(objTrm.position);
Canvas canvas = GetComponent<Canvas>();
RectTransform canvasRtm = canvas.GetComponent<RectTransform>();
Vector2 uguiPos = Vector2.zero;
uguiPos.x = screenPos.x * canvasRtm.sizeDelta.x / Screen.width;
uguiPos.y = screenPos.y * canvasRtm.sizeDelta.y / Screen.height;
return uguiPos;
}
这样处理,即使变换其他分辨率和Match,也能正确获得UI上可赋值的坐标。当然要记得,将要赋值的组件布局更改为左下,因为计算出的坐标也是以屏幕左下为基准的。
因为获取的已经是视口坐标,只需乘以对应的宽和高即可计算出UI中位置,当然此处的宽和高,依然是经过Canvas Scaler处理过的宽和高。处理如下:
/// <summary>
/// 根据Canvas的设置,转换出uGUI可使用的坐标
/// </summary>
/// <param name="objTrm"></param>
/// <returns></returns>
public Vector2 GetUIPosByViewport(Transform objTrm)
{
Vector3 viewportPos = Camera.main.WorldToViewportPoint(objTrm.position);
Canvas canvas = GetComponent<Canvas>();
RectTransform canvasRtm = canvas.GetComponent<RectTransform>();
Vector2 uguiPos = Vector2.zero;
uguiPos.x = viewportPos.x * canvasRtm.sizeDelta.x;
uguiPos.y = viewportPos.y * canvasRtm.sizeDelta.y;
return uguiPos;
}