引言
对于背包界面,排行榜列表,聊天消息,等有大量的UI列表的界面,
常规做法是为每一条数据生成一个格子,在数据量越大的情况下,会生成越来越多的Gameobject,引起卡顿。
这个组件就是为了优化这个问题诞生的,
就以联盟宝箱为例子,联盟宝箱最多可以容纳300个宝箱,如果一下子生成300个,整个界面就会卡到爆炸,
这个组件的做法是就生成视图可见的个数,然后拖动的时候循环复用,
比如向下拖动,上面的item看不见了,就挪到下面复用。
![8d1aa4e77f5ba3678bbb244e0dc3b76b.png](https://i-blog.csdnimg.cn/blog_migrate/98e3392345cc97a881b7eb39b6d37073.jpeg)
lua层使用
/// <summary>
/// 初始化循环滚动
/// </summary>
/// <param name="loopItems">要生成的item列表</param>
/// <param name="curIndex">第几个item作为列表顶部</param>
/// <param name="loopMax">循环列表生成最大个数</param>
/// <param name="listener">注册拖动回调,给item赋值</param>
/// <param name="isLocation">第二次调用的时候,是否复位,true的话会复位到原来的位置</param>
public virtual void InitLoop(RectTransform[] loopItems, int curIndex, int loopMax, System.Action<int, int> listener, bool isLocation)
一、在预制上挂LoopScrollRect组件
![7e95de38f5f358eb00e60a110374d855.png](https://i-blog.csdnimg.cn/blog_migrate/776f7a4a534c77ce9f41fd8bdbf2d494.png)
二、导出节点
![e83c1f04016c28dfcde23de95a1f1032.png](https://i-blog.csdnimg.cn/blog_migrate/5c8bcc447fa777e5ef8a7fbddf416687.png)
三、lua层注册调用接口InitLoop,初始化组件,注册滑动事件
self.Scroll:InitLoop(childItems, 0, giftNum, handler(self, self.OnRefreshGiftItem),toTop)
四、滑动事件回调会将现有item对象数据初始化,
并且在每次滑动的时候回调事件,初始化item,
回调传回的参数是对象索引,所以需要我们记录item对象列表:self._giftItems和item对应的数据self._giftList ,用来初始化
//C# 的索引是从0开始的,lua的索引是从1开始的,所以要+1
function AllianceGiftView:OnRefreshGiftItem(objIdx, dataIdx)
local giftData = self._giftList[dataIdx + 1]
local giftItem = self._giftItems[objIdx + 1]
self._giftItemDic[giftData:GetGiftID()] = giftItem
giftItem:SetInfo(giftData)
end
源码学习:
魔改版源码:
https://github.com/Aver58/Tools/tree/master/UnityProject/Assets/Scripts/Component
想要更深入了解的可以参考开源源码:
qiankanglai/LoopScrollRect