Unity 重复可利用滑动列表

文章介绍了在Unity游戏开发中如何优化列表组件的性能,特别是处理大量数据时如何减少内存占用和DrawCall。关键策略包括使用RectMask2D替代Mask以降低DrawCall,以及实现列表的重复循环利用,当滑动超过一定距离时,将超出部分的列表项移动到顶部或底部,以此提高效率。代码示例展示了监听滑动事件和更新列表信息的方法。
摘要由CSDN通过智能技术生成

列表在游戏开发中是比较常用的功能,unity自带的列表组件,随着数量的增多,它所占用的内存和DrawCall也会相应的增多,所以列表的重复循环利用变得至关重要,废话不多说,直接上代码。

1、列表组件自带的Mask替换成RectMask2D,可以减少相当多的DrawCall,unity也有相应的工具可以很直观的看出效果。

2、最重要的重复可利用列表:就拿上下滑动列表举例说明原理:每当滑动的距离超过一个列表的高度时候,就把超过的列表放到Content子物体的顶部或者底部,并刷新所有的列表信息。代码如下:注册监听列表组件滑动事件。

 private void OnHandleValueChange( Vector2 vec )
    {
        UpdateListView();
    }

    private void UpdateListView()
    {
        scrollTrans.GetLocalCorners( rectCorners );

        RectTransform firstTrans = contentTrans.GetChild( 0 ) as RectTransform;

        firstTrans.GetWorldCorners( childCorners );

        Vector3 pos1 = scrollTrans.InverseTransformPoint( childCorners[0] );

        Vector3 pos2 = scrollTrans.InverseTransformPoint( childCorners[1] );

        if( scrollType == ScrollType.BottomToTop )
        {
            if( pos1.y > rectCorners[1].y )
            {
                if( startIndex >= totalCount )
                {
                    return;
                }

                startIndex++;

                RectTransform lastTrans = contentTrans.GetChild( contentTrans.childCount - 1 ) as RectTransform;

                firstTrans.SetAsLastSibling();

                firstTrans.anchoredPosition = lastTrans.anchoredPosition + Vector2.down * itemPadding;

                contentTrans.sizeDelta += Vector2.up * itemPadding;

                moveCallBack?.Invoke( contentTrans, startIndex );

                return;
            }

            if( pos2.y < rectCorners[1].y )
            {
                float height = contentTrans.sizeDelta.y - itemPadding;

                if( height < initHeight )
                {
                    return;
                }

                --startIndex;

                RectTransform lastTrans = contentTrans.GetChild( contentTrans.childCount - 1 ) as RectTransform;

                lastTrans.SetAsFirstSibling();

                lastTrans.anchoredPosition = firstTrans.anchoredPosition + Vector2.up * itemPadding;

                contentTrans.sizeDelta += Vector2.down * itemPadding;

                moveCallBack?.Invoke( contentTrans, startIndex );

                return;
            }
        }

}

这里仅贴出了主要的代码,

 private void OnHandleItemMove( Transform trans, int index )
    {
        int childLength = trans.childCount;

        for( int i = 0; i < childLength; i++ )
        {
            Transform childTrans = trans.GetChild( i );

            if( null == itemArr[i] )
            {
                itemArr[i] = new SongItem( childTrans, index + i, OnHandleItemClick );
            }
            else
            {
                itemArr[i].RefreshItem( childTrans, index + i, OnHandleItemClick );
            }
        }
    }

这里是对列表信息刷新的函数。

当然也可以扩展为从上到下、从下到上、从左到右、从右到左的滚动,源码后续会贴出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑夜里的四叶草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值