Unity内未提供直接的转换函数,需要借助视口坐标中转一下。
在Unity中视口坐标是以左下角为(0,0),右上角为(1,1)的坐标,已知世界坐标获得其对应的视口坐标可以使用:
Vector3 viewPos=Camera.main.WorldToViewportPoint(worldPos);
拿到viewPos后就可以根据当前Canvas的Width、Height,反算出对应的UGUI坐标,下面获得的是以中心点为anchor的ugui坐标
RectTransform canvasRectTrans;
float x = canvasRectTrans.rect.width * viewPos.x - canvasRectTrans.rect.width * 0.5f;
float y = canvasRectTrans.rect.height * viewPos.y - canvasRectTrans.rect.height * 0.5f;
扩展
将屏幕坐标转换为视口坐标:
Vector3 viewPos = Camera.main.ScreenToViewportPoint (Input.mousePosition);
视口坐标转换为世界坐标(需要自己组装视口坐标对应世界坐标的Z值):
var pos=Camera.main.ViewportToWorldPoint(viewPos);
UGUI转世界坐标
public Vector3 UGUI2World(GameObject uiObj)
{
Vector3 ptScreen = RectTransformUtility.WorldToScreenPoint(UICamera, uiObj.transform.position);
ptScreen.z = 25;//根据你需要的 相对于camera3D的Z值来设置该值
//ptScreen.z = Mathf.Abs(camera3D.transform.position.z - transform.position.z);
Vector3 ptWorld = camera3D.ScreenToWorldPoint(ptScreen);
return ptWorld;
}