获取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