首页 > Unity3D频道 > 【UGUI研究院】 > UGUI研究院之获取UI子节点在Canvas的2D坐标(十二)
2015
05-12

UGUI研究院之获取UI子节点在Canvas的2D坐标(十二)

今天一个同事问我怎么样获取UI在Canvas下的2D坐标。我查了一下API,其实很简单。如下图所示,UI比较复杂了子节点会很多,假设我想获取某个子的子节点的2D坐标。

UGUI研究院之获取UI子节点在Canvas的2D坐标(十二) - 雨松MOMO程序研究院 - 1
首先我们要搞清楚 transform.postion 和 rectTransform.anchoredPosition  这两个坐标是完全不一样的。前面的是3D坐标,后面的是2D在Rect里的坐标,并且还是相对坐标,那么节点深了坐标就更不好换算了。

所以上述代码就是用UI元素的世界坐标和canvas的RectTrasform再加上UI摄像机,换算出元素在Canvas的2D坐标。

最后在想需要赋值的UI 用 rectTransform.anchoredPosition = pos 就可以了。。

今天有朋友问我,怎么通过鼠标的坐标在屏幕上移动来更新UI的显示位置。代码如下

 

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

UGUI研究院之获取UI子节点在Canvas的2D坐标(十二)》有 21 条评论

  1. 曲生 说:

    雨松大神,这边在不修改描点,布局样式的情况下是正常可用的。但是只要改了描点或者布局,就无法正常使用了,因为anchoredPosition是相对坐标,而ScreenPointToLocalPointInRectangle这个方法只是转换出了canvas坐标。
    修改为以下方法可正常布局
    Vector3 worldP;
    if(RectTransformUtility.ScreenPointToWorldPointInRectangle(
    canvas.transform as RectTransform, Input.mousePosition, canvas.worldCamera, out worldP)){
    rectTransform.position = worldP;
    }

  2. 菇徒 说:

    大神,按照你的代码,倒是能够显示鼠标所点的位置,但是,图片不能移动诶。求解决

  3. hello2unity 说:

    如果锚点是自定义的会有问题,localposition好像更好!

  4. 怎么那么麻烦。现在的做法其实是获得当前容器下坐标的相对位置,如果层级比较深,那么要一层层换算相对位置?

  5. 幽雨 说:

    当看到大神这么写的时候,还纳闷一下,为啥应该填屏幕坐标的参数位置填世界坐标?经测试,当相机为canvas.camera的时候,世界坐标与屏幕坐标是相等的.canvas的范围就是摄像机的范围,同时左下角又是世界坐标系原点,也是屏幕坐标系原点.这样就不用将世界坐标转换成屏幕坐标了,加快了效率.

  6. lojne 说:

    今天写的时候 rectTransform.anchoredPosition弄明白怎么给值了 但是实例化以后比例会变大

  7. lojne 说:

    大神今天写的时候又遇到问题了能帮忙写一下 一个Image从RectTrasfrom的(-100,100)移动到(100,-100)拜托啦!~

  8. 君临 说:

    你这是UI上的点转换成世界点的吧 弄错了吧

  9. 志升 说:

    搞错了,是第二参数,Vector2 你这边给的是 Vector3 不明这点

  10. 志升 说:

    雨松 大神,有一点不明的地方,ScreenPointToLocalPointInRectangle ()里面的参数不应该是 RectTransform ,Vector2,camera,out 吗,怎么你这里的第三个参数可以是 Vector3 呢?

  11. lojne 说:

    大神有没有大众点的的翻墙方法推荐下,直接发不方便可以给个链接或者度盘发个TXT,谢谢!~

  12. lojne 说:

    朋友推荐雨松大神,看了以后感觉要学的实在太多了!~

留下一个回复

你的email不会被公开。