因为项目需要,需要我们能够在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);
}
输出结果正常了