Unity scrollRect 无限滚动实现

本文介绍了如何在Unity中使用ScrollRect组件实现竖直下拉和横向翻页的无限滚动效果。通过设置最小显示个数、GridGroupConnect组件的约束以及Content Size Fitter,可以创建出流畅的滚动体验。同时,文章提到了Prefab的设置,包括pivot的调整,以确保计算的统一。代码示例和更多Unity2018教程可在指定网站找到,还有开发人员的直播分享供学习交流。
摘要由CSDN通过智能技术生成

首先是竖直下拉,效果如下:

效果图

其中的minAmount是显示最少需要的个数,个数是整个屏幕最多能放下的个数+1 比如效果中,最多能放下三组,所以设置的是4(这里因为显示效果一行三个为1组 使用1哥prefab)

然后在 scrollRect的 connect组建中 需要使用如下组件

 

image.png

当前是竖向下拉 所以在GridGroupConnect中需要把 constraint 按照如下设置 在content size fitter中设置为竖向为最佳尺寸

然后是横向翻页的效果

5555.gif

 

image.png

 

connect的设置如下

 

 

需要注意的是 当时为了方便计算 在使用时需要将

image.png

prefab 进行如下设置

image.png

prefab的所有父物体(到scrollrect为止 包括scrollrect)的pivot 也要试着为0 1 这样操作是为了计算式统一通过左上角进行计算 如果有其他需求可修改计算过程中的具体代码

代码如下:

using UnityEngine;
using System.Collections.Generic;
using UnityEngine.UI;
using System.Collections;
//lsh 
public class InfinityPackgeTool : MonoBehaviour
{

    public enum Axies
    {
        horizontal = 0,
        vertical = 1
    }

    public int minAmount;
    public ScrollRect scrollRect;
    public Transform itemPrefab;

    public delegate void UpdateChildrenCallBack(int index, Transform trans);
    public UpdateChildrenCallBack updateChildrenDelegate = null;

    private GameObject scrollContent;
    private GridLayoutGroup gridLayoutGroup;
    private ContentSizeFitter contentSizeFitter;

    private List<RectTransform> childTransList;
    private Dictionary<Transform, int> childStartIndexDic;
    private Dictionary<int, Vector2> childStartAnchordPosition;

    private Vector2 connectStartSize;
    private Vector2 connectStartAnchordPos;
    private int childItemNum;
    private int realEndIndex = -1;
    private int amount;
    private RectTransform rectTransform;
    private RectTransform scrollRectTrans;
    private Vector2 lastPosition;
    private Vector2 gridLayoutStartSize;
    private Axies axies;

    private bool isNeedAutoChangeConnectScale;
    private bool isRegistEvent = false;


    /// <summary>
    /// 
    /// </summary>
    /// <param name="num">item的数量</param>
    /// <param name="isNeedAutoChangeScale">是否需要自动修改大小 若为true则直接设置为最大大小并不自动更改 否则根据当前位置自动更改connect大小</param>
    public void SetAmount(int num,bool isNeedAutoChangeScale)
    {
        amount = num;
        isNeedAutoChangeConnectScale = isNeedAutoChangeScale;
        StartCoroutine(InitManager());
    }

    IEnumerator InitManager()
    {
        if (!isRegistEvent)
        {
            for (int i = 0; i < minAmount; i
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值