普贤视角 2022-12-23 19:31 采纳率: 66.7%
浏览 142
已结题

Unity获取物体位置

img


我使用了Scroll View一个组件,然后动态生成列表,在组件中挂载了content size fitter和vertical layout group,生成的预制体也加载了这两个控件,我现在需要获取列表里面生成预制体的位置,但是我使用了normalizedPosition、localPosition、anchoredPosition和position但是获取的位置都与子物体的实际位置不同。

img

这是子物体的属性:

img

这是我使用position获取的位置:

img

同时生成的后面预制体获取的位置都是0

img

  • 写回答

5条回答 默认 最新

  • 小鱼游戏开发 2022-12-24 16:53
    关注

    img

    using UnityEngine;
    using UnityEngine.UI;
    public class NewBehaviourScript : MonoBehaviour
    {
        public int index;
        public Transform itemPrefab;
        public RectTransform img;
        ScrollRect scrollRect;
        RectTransform content;
        VerticalLayoutGroup layoutGroup;
        Rect displayArea;
        void Start()
        {
            scrollRect = GetComponent<ScrollRect>();
            content = scrollRect.content;
    
            layoutGroup = content.GetComponent<VerticalLayoutGroup>();
            itemPrefab.gameObject.SetActive(false);
            for (var i = 0; i < 20; i++)
            {
                var go = GameObject.Instantiate(itemPrefab.gameObject);
                go.SetActive(true);
                go.gameObject.name = i.ToString();
                go.transform.SetParent(content);
                go.GetComponentInChildren<Text>().text = i.ToString();
            }
        }
    
        private void LateUpdate()
        {
            displayArea = new Rect(Vector2.zero, (scrollRect.transform as RectTransform).sizeDelta + scrollRect.viewport.sizeDelta);
            if (scrollRect.content.childCount < index)
                return;
    
            var contentPos = content.anchoredPosition + GetPivotOffset(content) + GetPaddingOffset();
            var itrmTr = (scrollRect.content.GetChild(index) as RectTransform);
            var pos = itrmTr.anchoredPosition + GetPivotOffset(itrmTr);
    
            img.anchoredPosition = pos + contentPos;
            img.sizeDelta = itrmTr.sizeDelta;
    
            //由于Y方向不同需要 乘以 -1
            Debug.Log($"{index}是否显示:{displayArea.Overlaps(new Rect(img.anchoredPosition * new Vector2(1, -1), img.sizeDelta))}");
        }
        //垂直布局偏移
        Vector2 GetPaddingOffset()
        {
            return new Vector2(layoutGroup.padding.left, -layoutGroup.padding.top);
        }
        //中心点偏移
        Vector2 GetPivotOffset(RectTransform tr)
        {
            return (new Vector2(0, 1) - tr.pivot) * tr.sizeDelta;
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 1月1日
  • 已采纳回答 12月24日
  • 修改了问题 12月23日
  • 赞助了问题酬金15元 12月23日
  • 展开全部

悬赏问题

  • ¥15 关于大棚监测的pcb板设计
  • ¥20 sim800c模块 at指令及平台
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计