獲取UGUI子節點在Canvas的屏幕坐標


因為項目需要,需要我們能夠在Canvas下獲取UI子結點在2D屏幕中的坐標位置。這個子結點可以是嵌套的,如圖,注意RectTransform中的Pos值

獲得的2D坐標是以屏幕坐標的,比如你的Canvas是1024*768,中間的點就是(0,0),左偏移100,就是(-100,0)。在某牛看到一篇帖子給出的方案是調用
RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transformasRectTransform, transform.position, canvas.camera,out pos)
但經過試驗,發現原文作者對這個函數的參數存在一定的問題。
首先來看 rectTransform.anchoredPosition。這個坐標是Canvas中的2D坐標,是軸點相對於4個錨點中心點的位置。
transform.position是3D位置坐標,世界坐標系。
但是我分析,對於RectTransform,這個坐標值並不是一個世界坐標值,因為我寫了很多轉換這個position的代碼,在RectTransform時,都是得到莫名的結果。有清楚其原理的高人可以提出,我也學習下。
所以當你用transform.position時,這是得到的pos是一個很奇怪的值。

看Unity的文檔對這個函數第三個參數的說明,

看上去應該是屏幕坐標系的點拿來運算。因此我改動了原文作者的代碼為

if(RectTransformUtility.ScreenPointToLocalPointInRectangle(
         cvs.transformasRectTransform,Camera.main.WorldToScreenPoint(transform.position),
         cvs.worldCamera,outlocal))
       {
         Debug.Log(local);
       }

輸出結果正常了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM