經(jīng)常會(huì)遇到將ui元素的位置對應(yīng)到某個(gè)世界坐標(biāo)位置的需求,網(wǎng)上看了些解決辦法,感覺太過復(fù)雜,也試過直接用Camera的WorldToScreenPoint方法和RectTransformUtility.ScreenPointToLocalPointInRectangle方法,結(jié)果都不對,后來仔細(xì)想想,UGUI元素都是放在Canvas中顯示的,而Canvas的尺寸是根據(jù)CanvasScler中的設(shè)置來適配實(shí)際的屏幕分辨率的,并不一定會(huì)等于Screen的分辨率,剛好想到,Unity中ViewPort的尺寸大小是0-1,如果用ViewPort的坐標(biāo)值來乘以Canvas的尺寸值不是就剛好得到世界坐標(biāo)在UGUI坐標(biāo)系中的位置了嗎?
轉(zhuǎn)換過程為
世界坐標(biāo)-》ViewPort坐標(biāo)-〉UGUI坐標(biāo)
代碼如下
public static Vector2 WorldToUGUIPosition(RectTransform canvasRectTransform,Camera camera,Vector3 worldPosition){
//世界坐標(biāo)-》ViewPort坐標(biāo)? ?
Vector2 viewPos = camera.WorldToViewportPoint(worldPosition);
//ViewPort坐標(biāo)-〉UGUI坐標(biāo)
? return new Vector2(canvasRectTransform.rect.width * viewPos.x, canvasRectTransform.rect.height * viewPos.y);
}
使用方法如下:
uiObject.localPosition = WorldToUGUIPosition(canvasRect, mainCamera, worldPosition);