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