首先是竖直下拉,效果如下:
效果图
其中的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