Unity 有关CanvasScaler缩放后的Canvas坐标和Screen坐标问题
Unity 有關(guān)CanvasScaler縮放后的Canvas坐標(biāo)和Screen坐標(biāo)問題
有的時(shí)候,我們希望通過直接設(shè)置RectTransform的值來進(jìn)行UI的調(diào)整(例如anchoredPosition),但是由于CanvasScaler的縮放,屏幕坐標(biāo)和Canvas內(nèi)的坐標(biāo)并不是一一對應(yīng)的,存在一個(gè)縮放關(guān)系。當(dāng)想直接設(shè)置時(shí),需要弄清楚CanvasScaler的縮放原理,找到坐標(biāo)之間的對應(yīng)關(guān)系。
有關(guān)CanvasScaler的介紹,可以參閱官方文檔:
https://docs.unity.cn/cn/2019.4/Manual/script-CanvasScaler.html
對于CanvasScaler的理解,可以認(rèn)為:CanvasScaler的縮放是UI物體不變,畫布的大小在變化(實(shí)際上也是這樣,在縮小屏幕后,Canvas的RectTransform.rect會變大)。CanvasScaler的Match Width Or Height模式中,畫布是根據(jù)當(dāng)前屏幕大小和Reference Resolution設(shè)置的值進(jìn)行比較,根據(jù)Match中的值來計(jì)算實(shí)際縮放因子。縮放因子可以通過如下代碼計(jì)算:
float ScaleFactor => Screen.width / canvasScaler.referenceResolution.x * (1 - canvasScaler.matchWidthOrHeight) + Screen.height / canvasScaler.referenceResolution.y * canvasScaler.matchWidthOrHeight;含義是:Canvas內(nèi)的UI被縮放成原來的UI乘以ScaleFactor的大小。
那么,當(dāng)我們想通過anchoredPosition設(shè)置UI的值時(shí),就需要將屏幕坐標(biāo)除以ScalerFactor,就能計(jì)算出UI在畫布內(nèi)的實(shí)際坐標(biāo)。
測試場景:
創(chuàng)建Canvas,將CanvasScaler的ScreenMatchMode設(shè)置為MatchWidthOrHeight。
創(chuàng)建Image,設(shè)置RectTransform為錨點(diǎn)模式,并且將錨點(diǎn)設(shè)置在左下角。(為了直觀與屏幕坐標(biāo)對應(yīng),屏幕坐標(biāo)的左下角為(0,0))
為Image創(chuàng)建腳本,完整代碼:
設(shè)置好引用后,開始場景,可以看到無論CanvasScaler的Match值設(shè)置成什么,都可以正常拖拽。
如果沒有經(jīng)過縮放因子的修正,效果是這樣的:
后半段展示了關(guān)掉CanvasScaler的效果,實(shí)際上這個(gè)時(shí)候屏幕坐標(biāo)就和畫布坐標(biāo)一一對應(yīng)了。
總結(jié)
以上是生活随笔為你收集整理的Unity 有关CanvasScaler缩放后的Canvas坐标和Screen坐标问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php下载 微信头像图片_php微信公众
- 下一篇: 5号字对应的数字字号_请问在WORD文档