Vector2 world2ScreenPos = Camera.main.WorldToScreenPoint(worldPos);//世界坐标转屏幕坐标
Vector2 uiPos = new Vector2();
RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, world2ScreenPos, uirootCamera, out uiPos);//屏幕坐标转UI坐标
rect.anchoredPosition = new Vector2((uiPos.x) * ui.RectTransform.localScale.x, (uiPos.y) * ui.RectTransform.localScale.x);//赋值
以上。
---------------------------------------------------------------分割线---------------------------------------------------------------2018-09-10
使用以上方法时注意MainCamera和UICamera的区分。
使用Camera.main时需确保Scene中含有Tag值为MainCamera的相机。
---------------------------------------------------------------重新编辑---------------------------------------------------------------2019-05-30
private Vector2 World2UI(Vector3 worldPos)
{
Vector2 world2ScreenPos = Camera.main.WorldToScreenPoint(worldPos);
Vector2 uiPos = new Vector2();
RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, world2ScreenPos, uirootCamera, out uiPos);
return uiPos;
}
---------------------------------------------------------------重新编辑---------------------------------------------------------------2024-04-24
当 Canvas renderMode 为 RenderMode.ScreenSpaceCamera、RenderMode.WorldSpace 时 uiCamera 不能为空。
当 Canvas renderMode 为 RenderMode.ScreenSpaceOverlay 时 uiCamera 可以为空。