Unity3d 无限滚动列表SuperScrollView学习

近期初学unity3D,在尝试制作界面的时候有用到了列表的scrollView。但是发现scrollView并不是复用的,当里面的cell数量庞大的时候则会非常的麻烦,并且会影响性能。在之前cocos2dx的制作过程中,具有一个名为tableview的类对列表进行优化。unity3D中我也从这个方向上进行寻找,找到了一个SuperScrollView的插件,在其中有非常多的demo可以学习,可以支持多行多列,不同大小,二级菜单等等功能。目前先按需学习使用最普通的listView。

1、下载SuperScrollView插件

	可以从网上下载SuperScrollView的插件包。我在这放出了我所下载的压缩包
	链接: [link](https://pan.baidu.com/s/1HNz4A4NZc8DyyWf4II_bSg?pwd=qegn)
	提取码:qegn

2、导入unity插件包

	新建一个unity工程,将unity插件包导入进去。也可以只在在你的工程里进行导入。
	如果是新建unity工程的话并且想要在自己的unity项目中使用,则需要把对应的脚本进行复制粘贴到自己的项目中

请添加图片描述

3、创建一个scrollView进行使用

	这里的红框的结构是Unity默认创建的ScrollView。
	1、在scrollView的Content中放入一个节点,这个节点可以是预制体等等,是后续被用作为填充列表的每一个cell
	2、在scrollView的根节点,也就是图片的actionBtnListView节点中,挂载脚本组件LoopListView2,并且如图设置对应的参数
		先在M Item Prefab Data List添加一个元素,并且将元素里的M Item Prefab设置为我们在第一步放入的节点
	其他用到的参数在这里略作解释:
		a)M Padding :每一个元素之间的间距
		b)M Arrange Type:这个列表创建处理的时候默认在哪,比如TopToBottom,那就是默认在最上方,然后可以向下滑动
		c)M Support Scroll Bar:是否支持滑动条,如果勾选了,需要有scrollView默认创建时候的滑动条
	3、在我们第一步的创建的节点上挂载一个cell的脚本,里面会用于数据的刷新。
		这里的SetItemData是后续会调用刷新的数据的一个方法

在这里插入图片描述

在这里插入图片描述

using SuperScrollView;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using static MainSceneBtnList;

public class MainSceneBtnListCell : MonoBehaviour
{
	public TextMeshProUGUI m_btnText;
	//一个是index 一个是数据
	private int m_ItemDataIndex = -1;
	private MainSceneBtnList.MainSceneBtnCellData m_ItemData;
	// Start is called before the first frame update
	void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

	public void Init()
	{
		
	}

	public void SetItemData(MainSceneBtnList.MainSceneBtnCellData itemData, int itemIndex)
	{
		m_ItemData = itemData;
		m_ItemDataIndex = itemIndex;
		m_btnText.text = itemData.name;
	}
}
	4、再创建一个脚本,进行列表的创建一个刷新功能。
		我这里这个脚本默认是不激活的状态,当我main脚本初始化完数据后,进行脚本的激活,调用start然后进行列的初始化
using JetBrains.Annotations;
using SuperScrollView;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using UnityEngine;

public class MainSceneBtnList : MonoBehaviour
{
	public LoopListView2 m_LoopListView;

	public struct MainSceneBtnCellData
	{
		public string name;
		public int index;
	}

	private List<MainSceneBtnCellData> m_dataSourceList = new List<MainSceneBtnCellData>();

	// Start is called before the first frame update
	void Start()
    {
		m_LoopListView.InitListView(-1, OnGetItemByIndex);
		refreshListViewData();
	}

	void refreshListViewData()
	{
        //这里处理数据
        for (int i = 0; i < 100; i++)
        {
			MainSceneBtnCellData tempData = new MainSceneBtnCellData();
			tempData.index = i;
			tempData.name = "新建地图" + i;
			m_dataSourceList.Add(tempData);
		}
		m_LoopListView.SetListItemCount(m_dataSourceList.Count);
		m_LoopListView.RefreshAllShownItem();
	}

    // Update is called once per frame
    void Update()
    {
        
    }

	LoopListViewItem2 OnGetItemByIndex(LoopListView2 listView, int index)
	{
		if (index < 0 || index >= m_dataSourceList.Count)
		{
			return null;
		}
		//get the data to showing
		MainSceneBtnCellData itemData = m_dataSourceList[index];
		/*get a new item. Every item can use a different prefab, 
		 the parameter of the NewListViewItem is the prefab’name. 
		And all the prefabs should be listed in ItemPrefabList in LoopListView2 Inspector Setting*/
		LoopListViewItem2 item = listView.NewListViewItem("ItemPrefab");
		//get your own component
		MainSceneBtnListCell itemScript = item.GetComponent<MainSceneBtnListCell>();
		//IsInitHandlerCalled is false means this item is new created but not fetched from pool.
		if (item.IsInitHandlerCalled == false)
		{
			item.IsInitHandlerCalled = true;
			itemScript.Init();// here to init the item, such as add button click event listener.
		}
		//update the item’s content for showing, such as image,text.
		itemScript.SetItemData(itemData, index);
		return item;
	}
}

5、以上的步骤完成后运行场景,便会发现我们希望的可复用的列表就完成了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值