Unity中世界坐標(biāo)轉(zhuǎn)UGUI坐標(biāo)

經(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);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前段時(shí)間整理的一篇關(guān)于unity ui開發(fā)的文章,被推薦上了csdn首頁,對于剛剛寫文字的我來說,是莫大的鼓勵(lì),讓...
    小飛不會(huì)飛_閱讀 5,491評論 0 4
  • 一、Unity3D中有哪些坐標(biāo)系? 坐標(biāo)系這個(gè)概念最早是由法國數(shù)學(xué)家笛卡爾提出的,并由此創(chuàng)造了用代數(shù)方法來研究幾何...
    OneMore2018閱讀 4,692評論 0 7
  • f#投影空間和屏幕空間先不說UI,如果是一個(gè)普通渲染流程,一個(gè)Cube普通地被渲染。 如果屏幕在現(xiàn)實(shí)中變小了,這個(gè)...
    DonaldW閱讀 26,895評論 3 31
  • Canvas的渲染 渲染基本層次 基本渲染層次是根據(jù)可視化對象在繼承窗口中的顯示順序來渲染的,在此有兩種方式可以調(diào)...
    壹米玖坤閱讀 2,659評論 0 5
  • UGUI的目錄結(jié)構(gòu) UGUI包括很多UI工具,但所有的UI工具都會(huì)在Canvas(畫布)下進(jìn)行渲染顯示。所以當(dāng)新建...
    紫龍大俠閱讀 1,407評論 0 1

友情鏈接更多精彩內(nèi)容