经常会遇到将ui元素的位置对应到某个世界坐标位置的需求,网上看了些解决办法,感觉太过复杂,也试过直接用Camera的WorldToScreenPoint方法和RectTransformUtility.ScreenPointToLocalPointInRectangle方法,结果都不对,后来仔细想想,UGUI元素都是放在Canvas中显示的,而Canvas的尺寸是根据CanvasScler中的设置来适配实际的屏幕分辨率的,并不一定会等于Screen的分辨率,刚好想到,Unity中ViewPort的尺寸大小是0-1,如果用ViewPort的坐标值来乘以Canvas的尺寸值不是就刚好得到世界坐标在UGUI坐标系中的位置了吗?
转换过程为
世界坐标-》ViewPort坐标-〉UGUI坐标
代码如下
public static Vector2 WorldToUGUIPosition(RectTransform canvasRectTransform,Camera camera,Vector3 worldPosition){
//世界坐标-》ViewPort坐标
Vector2 viewPos = camera.WorldToViewportPoint(worldPosition);
//ViewPort坐标-〉UGUI坐标
return new Vector2(canvasRectTransform.rect.width * viewPos.x, canvasRectTransform.rect.height * viewPos.y);
}
使用方法如下:
uiObject.localPosition = WorldToUGUIPosition(canvasRect, mainCamera, worldPosition);