日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity 有关CanvasScaler缩放后的Canvas坐标和Screen坐标问题

發(fā)布時(shí)間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity 有关CanvasScaler缩放后的Canvas坐标和Screen坐标问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)建腳本,完整代碼:

using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems;public class UIDragger : MonoBehaviour,IDragHandler {public Canvas canvas;public CanvasScaler canvasScaler;public RectTransform rectTransform;//Image的RectTransformprivate float ScaleFactor => Screen.width / canvasScaler.referenceResolution.x * (1 - canvasScaler.matchWidthOrHeight) + Screen.height / canvasScaler.referenceResolution.y * canvasScaler.matchWidthOrHeight;public void OnDrag(PointerEventData eventData){rectTransform.anchoredPosition = eventData.position / ScaleFactor; } }

設(shè)置好引用后,開始場景,可以看到無論CanvasScaler的Match值設(shè)置成什么,都可以正常拖拽。

如果沒有經(jīng)過縮放因子的修正,效果是這樣的:

rectTransform.anchoredPosition = eventData.position;


后半段展示了關(guān)掉CanvasScaler的效果,實(shí)際上這個(gè)時(shí)候屏幕坐標(biāo)就和畫布坐標(biāo)一一對應(yīng)了。

總結(jié)

以上是生活随笔為你收集整理的Unity 有关CanvasScaler缩放后的Canvas坐标和Screen坐标问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。