无限循环 (监听边界,判断头和尾) LoopItem

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LoopItem : MonoBehaviour
{
    #region 字段

    //通过一个方法,获取到边界的信息
    private RectTransform rect;       //rect  自己的显示区域
    private RectTransform viewRect;   //viewRect 是scrollview的显示区域

    //声明四个边的坐标
    private Vector3[] rectCorners;
    private Vector3[] viewCorners;

    private LoopScrollViewType scrollViewType;

    #endregion



    #region 事件

    public Action onAddHead;
    public Action onRemoveHead;
    public Action onAddLast;
    public Action onRemoveLast;

    #endregion


    //对两个变量初始化
    private void Awake()
    {
        rect = transform.GetComponent<RectTransform>();  //通过transf.GetComponent 获取到自己的显示区域
        viewRect = transform.GetComponentInParent<ScrollRect>().GetComponent<RectTransform>();
        rectCorners = new Vector3[4];                    //初始化数组
        viewCorners = new Vector3[4];
    }

    void Update()
    {
        LinstenerCorners();
    }


    //监听边界
    public void LinstenerCorners() {
        //获取自身的边界
        rect.GetWorldCorners(rectCorners);
        //获取显示区域的边界
        viewRect.GetWorldCorners(viewCorners);

        if (IsFirst())                 //如果是头
        {
            switch (scrollViewType)
            {
                case LoopScrollViewType.Horizontal:

                    if (rectCorners[3].x < viewCorners[0].x)
                    {
                        //把头节点给隐藏掉
                        if (onRemoveHead != null) { onRemoveHead(); }     //如果它不为空,触发onRemoveHead
                    }
                    if (rectCorners[0].x > viewCorners[0].x)
                    {
                        //添加头节点
                        if (onAddHead != null) { onAddHead(); }
                    }

                    break;

                case LoopScrollViewType.Vertical:

                    if (rectCorners[0].y > viewCorners[1].y)
                    {
                        //把头节点给隐藏掉
                        if (onRemoveHead != null) { onRemoveHead(); }     //如果它不为空,触发onRemoveHead
                    }
                    if (rectCorners[1].y < viewCorners[0].y)
                    {
                        //添加头节点
                        if (onAddHead != null) { onAddHead(); }
                    }

                    break;
            }


        }

        if (IsLast())              //如果是尾
        {

            switch (scrollViewType)
            {
                case LoopScrollViewType.Horizontal:
                    //添加尾部
                    if (rectCorners[3].x < viewCorners[3].x)
                    {
                        if (onAddLast != null) { onAddLast(); }
                    }
                    //回收尾部
                    if (rectCorners[0].x > viewCorners[3].x)
                    {
                        if (onRemoveHead != null) { onRemoveHead(); }
                    }
                    break;

                case LoopScrollViewType.Vertical:
                    //添加尾部
                    if (rectCorners[0].y > viewCorners[0].y)
                    {
                        if (onAddLast != null) { onAddLast(); }
                    }
                    //回收尾部
                    if (rectCorners[1].y < viewCorners[0].y)
                    {
                        if (onRemoveHead != null) { onRemoveHead(); }
                    }
                    break;
            }

        }



    }



    //判断是不是第一个
    public bool IsFirst() {

        for (int i = 0; i < transform.parent.childCount; i++)   //计算子物体的数量,头部从0开始找
        {
            if (transform.parent.GetChild(i).gameObject.activeSelf)   //依次获取子物体,并判断是否是显示状态
            {
                if (transform.parent.GetChild(i) == transform)       //判断是不是它自己
                {
                    return true;
                }
                break;
            }
        }

        return false;
    }

    //是不是最后一个
    public bool IsLast() {

        for (int i = transform.parent.childCount - 1; i >= 0; i--)   //计算子物体的数量,尾部从后往前找
        {
            if (transform.parent.GetChild(i).gameObject.activeSelf)   //依次获取子物体,并判断是否是显示状态
            {
                if (transform.parent.GetChild(i) == transform)       //判断是不是它自己
                {
                    return true;
                }
                break;
            }
        }
        return false;
    }

    //设置LoopScrollViewd 的类型
    public void SetLoopScrollViewType( LoopScrollViewType loopScrollViewType ) {
        this.scrollViewType = loopScrollViewType;
    }
}

 

posted @ 2021-05-28 17:01  郭天真  阅读(181)  评论(0)    收藏  举报