UGUI学习笔记(十一)自制优化版滚动视图

本文介绍了一种优化的滚动视图实现方法,避免了性能消耗和内存浪费。通过手动计算子元素数量,动态调整内容大小,并利用数据驱动实时更新子物体,实现高效且节省资源的滚动效果。

一、效果展示

二、使用自带组件实现

为了让「Scroll View」组件实现内容框自适应大小,我们可以在「Content」上挂载「Vertical Layout Group」组件和「Content Size Fitter」组件。

效果如下

但这种实现方式有诸多问题。一方面,「Vertical Layout Group」这类排序组件可能会增加性能消耗;另一方面,「Content Size Fitter」必须靠子项才能撑开,当子项数量较多但又只需要展示少数几条时,会造成内存的浪费。因此我们需要自己实现一个优化版的滚动视图。

三、手动实现

3.1 准备工作

首先在场景中创建一个「Scroll View」并命名为「ScrollViewPlus」,在其上挂载一个同名脚本。创建一个子物体脚本命名为「ScrollViewPlusItem」。创建名为「ScrollViewPlusItem」的预制体,用于之后实例化子物体。

3.2 生成子物体

在生成子物体之前,首先要计算出最少需要的子物体数量。子物体的数量通过子物体的高度与间距就可以计算出来,但需要考虑到当前视口高度无法整除子物体高度加间距的情况。这种情况下就需要向上取整。另外还需要在计算出来的数量上加1,以避免在滚动时“露馅”。

代码如下:

public class ScrollViewPlus : MonoBehaviour
{
   
   
    // 子物体预制体
    public GameObject ItemPrefab;
    // 子物体间距
    public float ItemOffset;
    // 子物体高度
    private float _itemHeight;
    private RectTransform _content;
    private List<ScrollViewPlusItem> _items;
    void Start()
    {
   
   
        _items = new List<ScrollViewPlusItem>();
        _content = transform.Find("Viewport/Content").GetComponent<RectTransform>();
        _itemHeight = ItemPrefab.GetComponent<RectTransform>().rect.height;
        int num = GetShowItemNum(_itemHeight, ItemOffset);
        SpawnItem(num, ItemPrefab);
    }
    /// <summary>
    /// 获取展示区域子元素个数
    /// </summary>
    /// <param name="itemHeight"></param>
    /// <param name="itemOffset"></param>
    /// <returns></returns>
    private int GetShowItemNum(float itemHeight, float itemOffset)
    {
   
   
        float height = GetComponent<RectTransform>().rect.height;
        return Mathf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值