近期初学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、以上的步骤完成后运行场景,便会发现我们希望的可复用的列表就完成了。