Unity中如何获取未知层级下UI相对另一UI的位置?
Unity跨父物体UI相对位置计算与移动方案
核心结论
不用逐层遍历父物体计算位置,Unity已经帮你处理了所有层级变换,直接利用RectTransform的世界坐标属性和转换API即可解决问题。
获取第二个UI相对于第一个UI的局部位置
如果需要得到UI B在UI A局部空间中的位置(比如将A作为父物体时对齐B,或让A的子物体匹配B的位置),可以用以下函数:
using UnityEngine; public static class UIUtility { // 返回target在reference局部空间下的位置 public static Vector3 GetRelativePosition(RectTransform target, RectTransform reference) { // 将target的世界位置转换为reference的局部空间坐标 return reference.InverseTransformPoint(target.position); } }
直接移动UI到目标位置(平滑插值)
如果你的需求是把装备内部图像平滑移动到货币UI的位置,直接对两者的世界坐标做插值即可,完全不受父物体和锚点差异的影响:
RectTransform innerImage = ...; // 装备内部图像的RectTransform RectTransform currencyUI = ...; // 货币UI的RectTransform // 平滑移动,5f为移动速度系数 innerImage.position = Vector3.Lerp(innerImage.position, currencyUI.position, Time.deltaTime * 5f);
关键知识点
- RectTransform的
position属性是世界空间坐标,Unity自动计算了所有父物体的变换、锚点等影响,无需手动遍历层级。 - 锚点仅影响
anchoredPosition(相对于锚点的位置),不会改变position的世界坐标含义。 InverseTransformPoint用于将世界坐标转换为当前物体的局部坐标,TransformPoint则相反(局部转世界)。
内容的提问来源于stack exchange,提问作者rei segev
相关产品推荐
相关产品推荐

