|
標(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ò),暫不討論。 |
|
|
來(lái)自: 勤奮不止 > 《游戲引擎unity》