Unity初级开发者 2024-10-24 16:09 采纳率: 80%
浏览 36
已结题

Unity 如何在父物体存在Vertical Layout Group组件的情况下输出某一个子项的Inspector面板上显示的坐标信息?

在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面板上显示的坐标信息?

  • 写回答

1条回答 默认 最新

  • 越重天 新星创作者: Java技术领域 2024-10-24 16:45
    关注

    本答案参考 多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢

    1. 理解问题根源
      • 在Unity中,当父物体有Vertical Layout Group组件时,它会自动布局子物体,这会影响子物体坐标的获取方式。通常直接获取anchoredPosition可能得到的是布局后的结果(如(0,0)),而获取世界坐标position得到的是在场景中的实际位置,与Inspector面板显示的坐标不同。
    2. 解决方案
      • 方法一:使用RectTransformUtility
        • 可以使用RectTransformUtility类来将屏幕坐标转换为相对于父物体的坐标。首先,需要获取子物体的RectTransform组件。假设scrollScrollView的引用,contentScrollViewcontent子物体,child是我们想要获取坐标的子项(这里假设通过索引5获取,实际可根据需求调整)。
        • 代码如下:
    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坐标。
      • 假设scrollScrollView的引用,contentScrollViewcontent子物体,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);
        }
    }
    
     - 这种方法比较简单直接,但依赖于特定的布局规则和已知的布局参数(如子项高度)。如果布局规则发生变化,这种方法可能需要相应地修改计算逻辑。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月20日
  • 已采纳回答 11月12日
  • 创建了问题 10月24日