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

}

输出结果正常了

时间: 2024-12-18 13:44:08

获取UGUI子节点在Canvas的屏幕坐标的相关文章

[DevExpress]获取可见子节点集合

关键代码: /// <summary> /// 向下递归TreeListNode节点 /// </summary> /// <param name="node">需要向下递归的节点</param> /// <param name="conditionHanlder">委托</param> public static void DownRecursiveNode(this TreeListNode

父兄子节点的获取及子节点的添加、删除、克隆操作

第一.父兄子节点的获取 1.父节点的获取 某节点的parentNode属性值即为该节点的父节点.示例: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <body> <div id="father"> <div id="son1"></div> </

zTree异步生成数据时无法获取到子节点的选中状态

最近在项目中遇到一个问题,需求如下: 根据选中不同的人员(ID)向后台发送ajax请求,通过返回的数据来生成该人员的权限访问树,该树目录最少为3级目录,在生成的时候会自动勾选上次保存过的选中状态,点击保存后会将选中状态发送给后端用于保存.(zTree的api参考网站http://www.ztree.me/v3/api.php) 遇到的bug: 用户必须再次点击已选中的根目录,并重新选中一次才能在保存的时候将其根目录及所有选中的子节点ID号提供给后端,如果用户不做任何操作直接点击保存,则只能获取到

轻松学习JavaScript二十一:DOM编程学习之获取元素节点的子节点和属性节点

我们这里所说的获取元素节点的所有子节点包含元素子节点和文本节点两种.还是拿上一篇博文的代码实例进行 分析: <span style="font-size:18px;"><span style="font-size:18px;"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1

zTree获取子节点

1 var ids=[]; 2 ids=getChildren(ids, treeNode);//TreeNode是选中节点,ids是子节点id数组,格式:123,223,4,55 1.获取直接子节点的id //返回值包含选中节点的id,即ids[0] function getChildren(ids, treeNode) { ids.push(treeNode.id);//选中节点id,即父节点id if (treeNode.isParent) { for (var obj in treeNo

java 递归在实例中的几种用途(ps:准确获取树的子节点)

  递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合.一般来说,递归需要有边界条件.递归前进段和递归返回段.当边界条件不满足时,递归前进:当边界条件满足时,递归返回(递归简单说就是程序调用自身的编程技巧,前面说这么多废话只是为了显得

JS-DOM ~ 03. 子节点的操作、style.样式和属性、dom元素的创建方法及操作、14个例题、主要是利用js直接控制html属性

带有Element和不带的区别 a)  带Element的获取的是元素节点 b)  不带可能获取文本节点和属性节点 获取所以子节点 a)   . childNodes b)   . children c)   . parentNode . children [索引] . children:获取所有子节点 opacity:0-1:透明度 alpha(opacity:百分数):IE6/7/8透明度 先绑定事件再进行循环 previousNode()上一个兄弟节点 alert(变量名)可测试变量名是否

JQuery this和$(this)的区别及获取$(this)子元素对象的方法

1.JQuery this和$(this)的区别 相信很多刚接触JQuery的人,很多都会对$(this)和this的区别模糊不清,那么这两者有什么区别呢? 首先来看看JQuery中的  $()  这个符号,实际上这个符号在JQuery中相当于JQuery(),即$(this)=jquery();也就是说,这样可以返回一个jquery对象.那么,当你在网页中alert($('#id'));时,会弹出一个[object Object ],这个object对象,也就是jquery对象了. 那么,我们

JS获取元素节点的子节点

1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <titl