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