Unity 简单几句代码实现无限循环列表(Scroll View)

先看效果

这里是Scroll View的设置:

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

public class Panel_MyScroll : MonoBehaviour
{
    public Transform s_content;
    private List<GameObject> s_card;

    Vector3 endCard_pos;//最后一个的位置
    Vector3 startCard_pos;//第一个的位置
    float cardWidth;

    float inputDown_x;
    float inputUp_x;

    int gap = 50;

    void Start()
    {
        s_card = new List<GameObject>();

        for (int i = 0; i < s_content.childCount; i++)
        {
            s_card.Add(s_content.GetChild(i).gameObject);
        }
        cardWidth = s_content.GetChild(0).GetComponent<RectTransform>().sizeDelta.x;
        CardRot();
    }
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            inputDown_x = s_content.localPosition.x;
        }

        if (Input.GetMouseButtonUp(0))
        {
            inputUp_x = s_content.localPosition.x;
      
            int dis =(int)( Mathf.Abs(inputDown_x - inputUp_x) / (gap + cardWidth) )+ 1;
            if ((inputDown_x - inputUp_x) > 0)
            {
                if (Mathf.Abs(inputDown_x - inputUp_x) < cardWidth / 2)
                {
                  
                    s_content.localPosition = new Vector3(inputDown_x, s_content.localPosition.y, s_content.localPosition.z); 
                    return;
                }
                else
                {
                    s_content.localPosition = new Vector3(inputDown_x - (gap + cardWidth) * dis, s_content.localPosition.y, s_content.localPosition.z);
                }

            }
            else
            {
                if (Mathf.Abs(inputDown_x - inputUp_x) < cardWidth / 2)
                {
                    s_content.localPosition = new Vector3(inputDown_x, s_content.localPosition.y, s_content.localPosition.z);
                    return;
                }
                else
                {
                    s_content.localPosition = new Vector3(inputDown_x + (gap+cardWidth)* dis, s_content.localPosition.y, s_content.localPosition.z);
                }

            }

            CardRot();

        }
        //左滑超出边界
        if (s_card[0].transform.position.x < 200)
        {
            endCard_pos = s_card[s_content.childCount - 1].transform.position;
            endCard_pos.x = s_card[s_content.childCount - 1].transform.position.x + gap + cardWidth;
           //更改位置
            s_card[0].transform.position = endCard_pos;
           //更改循序
            s_card[0].transform.SetSiblingIndex(s_content.childCount);
            //清除List
            s_card.Clear();
            //重新记录List
            for (int i = 0; i < s_content.childCount; i++)
            {
                s_card.Add(s_content.GetChild(i).gameObject);
               
            }
        }
        //右滑超出边界
        if (s_card[s_content.childCount - 1].transform.position.x > 1750)
        {
            startCard_pos = s_card[0].transform.position;
            startCard_pos.x = s_card[0].transform.position.x - gap - cardWidth;
            s_card[s_content.childCount - 1].transform.position = startCard_pos;
            s_card[s_content.childCount - 1].transform.SetSiblingIndex(0);
            s_card.Clear();
            for (int i = 0; i < s_content.childCount; i++)
            {
                s_card.Add(s_content.GetChild(i).gameObject);
              
            }
        }
    }
    //这里是一些效果的代码,不重要,可根据自己的需求修改。
    void CardRot()
    {

        for (int i = 0; i < s_content.childCount; i++)
        {
            s_card.Add(s_content.GetChild(i).gameObject);
            if (s_content.GetChild(i).transform.position.x < 960)
            {
                s_content.GetChild(i).transform.position = new Vector3(s_content.GetChild(i).transform.position.x,
                     588,
                        s_content.GetChild(i).transform.position.z
                    );

                s_content.GetChild(i).GetComponent<Image>().color = new Color32(255, 255, 255, 100);

                s_content.GetChild(i).transform.rotation = Quaternion.Euler(new Vector3(-8, 50, 0));
            }
            else if (s_content.GetChild(i).transform.position.x > 960)
            {
                s_content.GetChild(i).transform.position = new Vector3(s_content.GetChild(i).transform.position.x,
                   588,
                      s_content.GetChild(i).transform.position.z
                  );

                s_content.GetChild(i).GetComponent<Image>().color = new Color32(255, 255, 255, 100);
                s_content.GetChild(i).transform.rotation = Quaternion.Euler(new Vector3(8, 50, 0));
            }
            else
            {
                s_content.GetChild(i).transform.position = new Vector3(s_content.GetChild(i).transform.position.x,
                    548f,
                       s_content.GetChild(i).transform.position.z
                   );
                s_content.GetChild(i).GetComponent<Image>().color = new Color32(255, 255, 255, 255);
                s_content.GetChild(i).transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0));
            }
        }

    }
}

猜你喜欢

转载自blog.csdn.net/f402455894/article/details/120487286