首先我们实现分页,有两种,一个是左右分页,一个是上下分页,当然这就会有人说了,上下分页和左右分页,只要看一个代码就够了。确实,不过改的时候也许一个不易发现的地方就可以玩死自己。所以我还是写出来。
废话不多说上代码:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections.Generic;
using System;
public class MyScrollRectHelper : MonoBehaviour, IBeginDragHandler, IEndDragHandler
{
private float smooting; //滑动速度
private float normalSpeed = 3;
private float highSpeed = 10;
/// <summary>
/// 每页显示的项目(Btn_1)
/// </summary>
private int pageCount = 1;
/// <summary>
/// content
/// </summary>
public GameObject Content;
private ScrollRect sRect;
/// <summary>
/// 总页数
/// </summary>
private float pageIndex;
/// <summary>
/// 是否拖拽结束
/// </summary>
private bool isDrag = true;
/// <summary>
/// 总页数索引比列 0-1
/// </summary>
private List<float> listPageValue = new List<float> { 0 }; //
/// <summary>
/// 滑动的目标位置
/// </summary>
private float m_targetPos = 0; //
/// <summary>
/// 当前位置索引
/// </summary>
private float nowindex = 0;
/// <summary>
/// 开始索引的位置
/// </summary>
private float beginDragPos;
/// <summary>
/// 结束索引的位置
/// </summary>
private float endDragPos;
/// <summary>
/// 灵敏度
/// </summary>
private float sensitivity = 0.15f;
/// <summary>
/// 每页的数量
/// </summary>
private int onePageCount =8;
void Awake()
{
//获取组件
sRect = this.GetComponent<ScrollRect>();
//
ListPageValueInit();
//滑度
smooting = normalSpeed;
}
//每页比例
void ListPageValueInit()
{
//总页数 总页数/每页显示的项目item(1)
pageIndex = (Content.transform.childCount / pageCount) - 1;
if (Content != null && Content.transform.childCount != 0)
{
for (float i = 1; i <= pageIndex; i++)
{
listPageValue.Add((i / pageIndex));//设置(写出)页数
}
}
}
void Update()
{
if (!isDrag)
sRect.verticalNormalizedPosition = Mathf.Lerp(sRect.verticalNormalizedPosition, m_targetPos, Time.deltaTime * smooting);
}
/// <summary>
/// 拖动开始 接口
/// </summary>
public void OnBeginDrag(PointerEventData eventData)
{
isDrag = true;
//记录拖拽的起点
beginDragPos = sRect.verticalNormalizedPosition;
}
/// <summary>
/// 拖拽结束
/// </summary>
public void OnEndDrag(PointerEventData eventData)
{
isDrag = false;
//记录放开时的点
endDragPos = sRect.verticalNormalizedPosition;
//判断 终点》起点? 是:终点+灵敏度(换页) 否:终点-灵敏度(不换页)
endDragPos = endDragPos > (beginDragPos) ? endDragPos + sensitivity : endDragPos - sensitivity;
int index = 0;
// 拖动的绝对值 数值决定翻几页
float offset = Mathf.Abs(listPageValue[index] - endDragPos);
//遍历全页数
for (int i = 1; i < listPageValue.Count; i++)
{
int a = (listPageValue.Count - i);
//返回绝对值 例如 1.4-1 = 0.43 、 1.4 - 2= 0.6 、 1.4 -3 = 1.6 、 1.4-4 = 3.6f、4.6
float temp = Mathf.Abs(endDragPos - listPageValue[i]);
if (temp < offset)
{
index = i;
offset = temp;
}
}
m_targetPos = listPageValue[index];
nowindex = index;
}//horizontalNormalizedPosition 0-1 0表示左侧 vertical 0-1 0表示底部
}
第一步:脚本挂在scrollview上,并且将Content(Level_Btns)放上指定位置。
第二步:在Level_Btns挂上组件,如下图
第三步:在Btn_1 2 3 4 5 6 7 8这些小的组也挂上,如下图
然后我们在这些Btn里放入图片如图
我们就会获得这样一个垂直的scrollview
调整Content的屏幕范围为全屏则会得到下图的效果
这样我们就实现了翻一页的效果
注意:如果你发现你拖了它还是不翻页,那么点到你的Content(Level_Btns) Inspector面板
拉成这样就可以了。
反之,如果你要做水平翻页,就把他反过来,拉成水平就可以了,记得参数也要调回来,当然,水平需要调的脚本参数
字段的 private bool isDrag = true;改成false;
所有的sRect.verticalNormalizedPosition
改成 sRect.horizontalNormalizedPosition
Content面板的
Scrollview面板的
如果有什么问题,可以留言,我会尽快回复的~