
Unity UGUI实现循环滚动
Unity UGUI实现循环滚动列表
·
背景
最近做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();
}
}
}
更多推荐
所有评论(0)