因為項目需要,需要我們能夠在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);
}
輸出結果正常了