小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

unity3d uGUI中世界坐標(biāo)與屏幕坐標(biāo)

 勤奮不止 2017-04-25

標(biāo)簽:unity3d ugui 世界坐標(biāo) 屏幕坐標(biāo)

uGUI中我們首先需要選擇一種Canvas的渲染模式,包括Screen Space - Overlay,Screen Space - Camera和World Space。


Screen Space - Overlay

在該模式下,世界坐標(biāo)(transform.Position)和屏幕坐標(biāo)是重合的,即左下為(0,0),右上為(screen.width,screen.height).因此,在該模式下進(jìn)行屏幕相關(guān)的操作時(shí)非常方便的。


Screen Space - Camera

在沒有設(shè)置Camera時(shí),它和Screen Space - Overlay是一樣的。

在設(shè)置了Camera時(shí),世界坐標(biāo)(transform.Postion)和它的Camera相關(guān),在正交相機(jī)投影時(shí)與Size有關(guān);在透視投影時(shí)與FOV和Plane Distance相關(guān),具體參見

http://quick007.blog.51cto.com/7454007/1767700


很多時(shí)候我們需要對(duì)屏幕坐標(biāo)進(jìn)行操作,比如處理鼠標(biāo)或者touch輸入還有就是我們需要計(jì)算UI是否超出屏幕邊框,來(lái)計(jì)算UI的顯示位置。


我們這里以計(jì)算UI顯示位置為例,首先我們需要改UI在屏幕中的位置使用世界坐標(biāo)→屏幕坐標(biāo):camera.WorldToScreenPoint(transform.position);來(lái)得到屏幕坐標(biāo),然后需要得到UI的大小使用rect transform獲得rect的width和height,注意,該width和height可能并不是UI相對(duì)于屏幕的寬和高,因?yàn)樵撝祏GUI是根據(jù)Canvas的的寬高進(jìn)行計(jì)算的。我們需要對(duì)width和height都乘以Canvas.scaleFactor來(lái)獲得相對(duì)于屏幕分辨率的UI大小。


現(xiàn)在我們獲取到UI的位置和大小,就可以根據(jù)它們來(lái)計(jì)算UI是否超出屏幕來(lái)調(diào)整UI的位置。

最后,將計(jì)算得到的UI屏幕坐標(biāo)轉(zhuǎn)換為世界坐標(biāo)賦值給transform.Position.

屏幕坐標(biāo)世界坐標(biāo):camera.ScreenToWorldPoint(transform.position);


注意,該模式下會(huì)對(duì)動(dòng)態(tài)腳本生成的UI組件進(jìn)行LocalScale設(shè)置,需要你設(shè)置setParent后把它重置為Vector3.one,不然UI的大小可能不是你預(yù)期的。比如,在正交投影下,camera的 size為5,canvas的heitht為1000, 那么scale會(huì)被自動(dòng)設(shè)置為height/(size*2)即100.至于為什么unity會(huì)這樣做,不是很清楚,讓知道的大蝦不嗇賜教。


World Space

該模式?jīng)]有研究過(guò),暫不討論。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多