Unity 无限滚动列表

1.使用scroll view,设置(例如width 500,height 200),关联脚本ScrollList

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

public class ScrollList : MonoBehaviour
{
    //获取滚动视图组件
    public ScrollRect scrollRect;

    //获取滚动视图的内容对象
    public RectTransform content;

    //定义一个数据结构,表示地址和数量
    [System.Serializable]
    public struct Data
    {
        public int ID; //编号
        public string Name; //姓名
        public string Sex; //性别
        public string Addr; //地址
    }

    //定义一个列表,存储数据
    public List<Data> dataList; 

    public int number = 5; //测试默认5个


    //定义一个预制体,表示列表项的样式
    public GameObject itemPrefab;

    //在开始时,根据数据列表生成列表项并添加到滚动视图中
    void Start()
    {
        //添加一条数据
        Data newData = new Data();
        newData.ID = 1;
        newData.Name = "li";
        newData.Sex = "nan";
        newData.Addr = "beijing";
        dataList.Add(newData);
        //遍历数据列表
        //foreach (Data data in dataList)
        for (int i = 0; i < number; i++)

        {
            
            //实例化一个列表项对象
            GameObject item = Instantiate(itemPrefab, content);

            //检测奇偶数换色
            if (i % 2 == 1) {
                item.GetComponent<Image>().color = Color.cyan;
            }
            Row row = item.GetComponent<Row>();
            
            row.SetData(dataList[0].Name, "Field 2", "Field 3");

        }
    }

    
}

2.scroll view 对应的配置,脚本组件对应拖过去。

3.viewport 配置颜色color ,勾选show mask graphic(遮挡子物体,铺满)

4.Content 配置,对应配置Height,cell size (每行的配置),spacing 间隔,结合content size filter组件,高度适应滚动。

5.在content下排好一行三个字段视图,table-row 挂载脚本row ,三个Text 拖过去分别关联脚本字段,然后做出预制体。

using UnityEngine;
using UnityEngine.UI;

public class Row : MonoBehaviour
{
    public Text nameText;
    public Text sexText;
    public Text addrText;

    public void SetData(string name, string sex, string addr)
    {
        nameText.text = name;
        sexText.text = sex;
        addrText.text = addr;
    }
}

### 创建和优化无限滚动列表 #### 使用 EnhancedScroller 插件 为了在 Unity 中实现高效的无限滚动列表,可以利用 `EnhancedScroller` 插件。此工具专为处理大型数据集而设计,能够显著提升性能表现,适用于各种需要展示众多条目的界面组件,比如游戏内部的商品清单或是社交应用的消息记录等[^1]。 ```csharp // 示例:设置 EnhancedScroller 的基本配置 using UnityEngine; using UnityEngine.UI; public class ScrollerExample : MonoBehaviour { private void Start() { // 获取 EnhancedScroller 组件实例 var scroller = GetComponent<EnhancedScroller>(); // 设置每项的高度或其他属性 scroller.itemSize = 50f; // 注册回调函数来绘制每一项的内容 scroller.onInitializeItem += OnInitializeItem; } private void OnInitializeItem(EnhancedScrollListItem item, int dataIndex) { // 实现具体的布局更新逻辑... } } ``` #### 应用 UIS 扩展库 另一种解决方案是采用专门为 `ScrollRect` 定制的无限滚动增强包——UIS。该方案不仅解决了传统方式下可能出现的卡顿现象,还提供了更加平滑自然的操作体验给最终用户[^2]。 ```csharp // 示例:集成 UIS 到现有项目中 void SetupInfiniteScrolling() { // 初始化 UIS 并关联到目标 ScrollRect 上 InfiniteScroll infiniteScroll = new InfiniteScroll(scrollRect); // 配置预加载区域大小以及每次加载的新元素数量 infiniteScroll.PreloadZoneHeight = 300f; infiniteScroll.ItemsPerLoadBatch = 10; } // 当新一批次的数据准备就绪时触发的方法 infiniteScroll.OnItemsLoaded += (items) => { /* 更新 UI */ }; ``` #### 结合 ScrollView 和自定义脚本 对于更灵活的需求,则可以直接基于内置的 `ScrollView` 构建定制化的无限滚动机制。这通常涉及到手动管理可视范围内项目的生命周期及其位置调整,同时确保良好的交互响应速度[^4]。 ```csharp // 自定义无限列表控制器 public class CustomInfiniteListController : MonoBehaviour { public GameObject listItemPrefab; // 单元格预制体 private RectTransform contentRectTransform; private List<GameObject> activeCells = new List<GameObject>(); private void UpdateVisibleCells(float scrollPosition) { foreach (var cell in GetCellsInViewPort(scrollPosition)) { if (!activeCells.Contains(cell.gameObject)) InstantiateCellAt(cell.index); } CleanupOffscreenCells(); } private void InstantiateCellAt(int index){ var go = Instantiate(listItemPrefab, transform); ConfigureCell(go, GetDataForIndex(index)); activeCells.Add(go); } private IEnumerable<CellInfo> GetCellsInViewPort(float positionOffset){ // 计算当前可见范围内的单元格索引集合 yield break; } private void CleanupOffscreenCells(){ // 移除超出屏幕外的对象以节省资源 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值