在Unity中 假设有一个ScrollView滚动列表(上下滚动),在它的content子级下有多个子项,并且这个content挂载了Vertical Layout Group垂直分组组件 和Content Size Fitter自适应大小组件,每一个子项的Inspector面板上的X坐标和Y坐标都是灰色的不能修改。 假设其中某一个子项的Y坐标在Inspector上显示为-1125 ,我尝试在代码中输出它的坐标信息:
Debug.Log(scroll.content.GetChild(5).GetComponent().anchoredPosition);
得到的结果却是(0,0) 我知道这是Vertical Layout Group组件造成的。
然后我又尝试了另一种方法,输出这个子项的世界坐标:
Debug.Log(scroll.content.GetChild(5).GetComponent().position);
得到的结果是(-220.0, 1290.0, 0.0) 显然这不是我想要的结果。 并且这里有一个很奇怪的现象,我又尝试了输出其他子项的世界坐标信息,得到的结果居然还是(-220.0, 1290.0, 0.0)
那么如果在某个UI元素的父物体存在分组组件的情况下,如何输出它的Inspector面板上显示的坐标信息?
Unity 如何在父物体存在Vertical Layout Group组件的情况下输出某一个子项的Inspector面板上显示的坐标信息?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注本答案参考 多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢
- 理解问题根源
- 在Unity中,当父物体有
Vertical Layout Group组件时,它会自动布局子物体,这会影响子物体坐标的获取方式。通常直接获取anchoredPosition可能得到的是布局后的结果(如(0,0)),而获取世界坐标position得到的是在场景中的实际位置,与Inspector面板显示的坐标不同。
- 在Unity中,当父物体有
- 解决方案
- 方法一:使用RectTransformUtility
- 可以使用
RectTransformUtility类来将屏幕坐标转换为相对于父物体的坐标。首先,需要获取子物体的RectTransform组件。假设scroll是ScrollView的引用,content是ScrollView的content子物体,child是我们想要获取坐标的子项(这里假设通过索引5获取,实际可根据需求调整)。 - 代码如下:
- 可以使用
- 方法一:使用RectTransformUtility
using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class GetChildPosition : MonoBehaviour { public ScrollRect scroll; void Start() { RectTransform childRect = scroll.content.GetChild(5).GetComponent<RectTransform>(); Vector2 localPoint; RectTransformUtility.ScreenPointToLocalPointInRectangle(scroll.content.GetComponent<RectTransform>(), childRect.position, null, out localPoint); Debug.Log("X坐标: " + localPoint.x + " Y坐标: " + localPoint.y); } }- 这里的逻辑是,先获取子项的`RectTransform`,然后使用`RectTransformUtility.ScreenPointToLocalPointInRectangle`方法将子项在屏幕空间中的位置转换为相对于`content`(父物体)的局部坐标。这个方法需要传入父物体的`RectTransform`、子项的屏幕坐标(这里使用`position`获取屏幕坐标近似值)、一个用于处理事件系统的`Camera`(如果是UI元素,传入`null`),以及一个`out`参数来接收转换后的局部坐标。- 方法二:手动计算相对坐标(在特定布局下)
- 如果知道
Vertical Layout Group的布局规则,可以手动计算子项相对于父物体的坐标。例如,如果知道每个子项的高度是固定的(假设为itemHeight),并且子项是按照顺序垂直排列的,那么可以通过子项的索引来计算其Y坐标。 - 假设
scroll是ScrollView的引用,content是ScrollView的content子物体,childIndex是子项的索引(这里假设为5),每个子项高度为100(可根据实际情况调整)。
- 如果知道
using UnityEngine; using UnityEngine.UI; public class CalculateChildPosition : MonoBehaviour { public ScrollRect scroll; public float itemHeight = 100f; void Start() { int childIndex = 5; float y = -childIndex * itemHeight; Debug.Log("X坐标: 0 Y坐标: " + y); } }- 这种方法比较简单直接,但依赖于特定的布局规则和已知的布局参数(如子项高度)。如果布局规则发生变化,这种方法可能需要相应地修改计算逻辑。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 理解问题根源