背景

        最近做Unity看到有滚动的列表,问了下deepseek和chatgpt,但是不是我想要的一个效果。所以就自己动手做了一个。

过程

ui添加一个ScrollView

设置所需参数和需要的itemPrefab

实现效果

列表滚动效果

代码附上,按需要自己修改

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

[RequireComponent(typeof(ScrollRect))]
public class InfiniteScrollView : MonoBehaviour
{
    public enum ScrollDirection
    {
        Vertical,
        Horizontal
    }

    [Header("基本设置")] public ScrollDirection direction = ScrollDirection.Vertical;
    public float autoScrollSpeed = 50f; // 自动滚动速度
    public bool autoScrollEnabled = true;
    [Header("列表高度,如果是横向就是宽度")] public float itemHeight = 40f;
    public float itemSpace = 4f;
    public int itemLength = 10;

    //两行不一样的效果,直接用两个预制体
    public GameObject itemPrefab1;
    public GameObject itemPrefab2;

    private ScrollRect scrollRect;
    private RectTransform content;

    void Start()
    {
        scrollRect = GetComponent<ScrollRect>();
        content = scrollRect.content;

        // 初始化滚动方向
        scrollRect.vertical = direction == ScrollDirection.Vertical;
        scrollRect.horizontal = direction == ScrollDirection.Horizontal;

        for (var i = 0; i < itemLength; i++)
        {
            var prefab = i % 2 == 0 ? itemPrefab1 : itemPrefab2;
            var newItem = Instantiate(prefab, content);
            var newItemRectTransform = newItem.transform as RectTransform;
            if (!newItemRectTransform) continue;
            if (direction == ScrollDirection.Vertical)
            {
                var localPos = new Vector3(newItemRectTransform.rect.width / 2, -itemHeight / 2 - (itemHeight + itemSpace) * i, 0);
                newItemRectTransform.anchoredPosition = localPos;
            }
            else
            {
                var localPos = new Vector3(itemHeight / 2 + (itemHeight + itemSpace) * i, -newItemRectTransform.rect.height / 2, 0);
                newItemRectTransform.anchoredPosition = localPos;
            }
        }
    }

    void Update()
    {
        if (autoScrollEnabled)
        {
            if (direction == ScrollDirection.Vertical)
            {
                AutoScrollVerticalMovement();
            }
            else
            {
                AutoScrollHorizonMovement();
            }
        }
    }

    // 自动滚动移动
    void AutoScrollVerticalMovement()
    {
        var delta = autoScrollSpeed * Time.deltaTime;

        for (var i = 0; i < content.childCount; i++)
        {
            var item = content.GetChild(i) as RectTransform;
            item.anchoredPosition += Vector2.up * delta;
            //判断当前项的位置,如果超出则将其移动到最底下
            if (!(item.anchoredPosition.y > itemHeight / 2)) continue;
            //获取列表最底下一条数据
            var lastItem = content.GetChild(content.childCount - 1) as RectTransform;
            var pos = item.anchoredPosition;
            pos.y = lastItem.anchoredPosition.y - itemHeight - itemSpace;
            item.anchoredPosition = pos;
            item.SetAsLastSibling();
        }
    }

    void AutoScrollHorizonMovement()
    {
        var delta = autoScrollSpeed * Time.deltaTime;

        for (var i = 0; i < content.childCount; i++)
        {
            var item = content.GetChild(i) as RectTransform;
            item.anchoredPosition += Vector2.left * delta;
            //判断当前项的位置,如果超出则将其移动到最底下
            if (!(item.anchoredPosition.x <- itemHeight / 2)) continue;
            //获取列表最底下一条数据
            var lastItem = content.GetChild(content.childCount - 1) as RectTransform;
            var pos = item.anchoredPosition;
            pos.x = lastItem.anchoredPosition.x + itemHeight + itemSpace;
            item.anchoredPosition = pos;
            item.SetAsLastSibling();
        }
    }
}

Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐