记录一个昨天刚做的无限循环ScoreView ,这个比较简单,网上教程很多,我这里就不详细说了,代码都有注释,直接上代码。
如果有哪些地方不够好或者不够完善,欢迎指出,一起进步~
首先是的scrollView Item类,这个类主要用于检测,某个Conten下的对象,是否需要回收,是否需要调用被回收的对象
public class LooPItem : MonoBehaviour
{
private RectTransform selfRect; //获取自身的rect
private RectTransform scrollViewRect;//获取scrollView的rect
private Vector3[] selfRectCorners;//获取自身的4个角的位置
private Vector3[] scrollViewRectCorners;//获取scrollView的4个角的位置
public UnityAction AddHeadItem, RemoveHeadItem, AddLastItem, RemoveLastItem;//需要执行的事件:添加头部Item,回收头部Item,添加尾部Item,回收尾部Item,
public ScrollViewType scrollViewType;
private void Awake()
{
selfRect = this.transform.GetComponent<RectTransform>();
scrollViewRect = this.transform.GetComponentInParent<ScrollRect>().GetComponent<RectTransform>();
selfRectCorners = new Vector3[4];
scrollViewRectCorners = new Vector3[4];
}
void Update()
{
Debug.Log(scrollViewType);
switch (scrollViewType)
{
case ScrollViewType.Horizontal:
HorizontalListener();
break;
case ScrollViewType.Vertical:
VerticalListener();
break;
}
}
/// <summary>
/// 垂直循环监听事件
/// </summary>
public void VerticalListener()
{
selfRect.GetWorldCorners(selfRectCorners);
scrollViewRect.GetWorldCorners(scrollViewRectCorners);
if (IsFirst())
{
if (selfRectCorners[0].y > scrollViewRectCorners[1].y)
{
//回收Item
RemoveHeadItem();
}
if (selfRectCorners[1].y < scrollViewRectCorners[1].y)
{
//添加Item
AddHeadItem();
}
}
if (IsLast())
{
if (selfRectCorners[0].y > scrollViewRectCorners[0].y)
{
//添加Item
AddLastItem();
}
if (selfRectCorners[1].y < scrollViewRectCorners[0].y)
{
//回收Item
RemoveLastItem();
}
}
}
/// <summary>
/// 水平循环监听事件
/// </summary>
public void HorizontalListener()
{
selfRect.GetWorldCorners(selfRectCorners);
scrollViewRect.GetWorldCorners(scrollViewRectCorners);
if (IsFirst())
{
if (selfRectCorners[3].x < scrollViewRectCorners[0].x)
{
//回收Item
RemoveHeadItem();
}
if (selfRectCorners[0].x > scrollViewRectCorners[0].x)
{
//添加Item
AddHeadItem();
}
}
if (IsLast())
{
if (selfRectCorners[3].x < scrollViewRectCorners[3].x)
{
//添加Item
AddLastItem();
}
if (selfRectCorners[0].x > scrollViewRectCorners[3].x)
{
//回收Item
RemoveLastItem();
}
}
}
/// <summary>
/// 判断是否是头部
/// </summary>
/// <returns></returns>
public bool IsFirst()
{
for (int i = 0; i < this.transform.parent.childCount; i++