Unity使用ScrollRect制作翻页
作者:非法关键字 时间:2023-05-22 09:10:44
本文实例为大家分享了使用ScrollRect制作翻页的具体代码,供大家参考,具体内容如下
1.标准的层级结构 ScrollRect->ViewPort->Content,Viewport负责显示区域的大小一般和Mask一起配合使用,Content使用Layout来布局,如果想使用代码来自动定位显示位置需要在Content加上Content size filter.
2.ScrollRectHelper
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections.Generic;
using System;
public class ScrollRectHelper : MonoBehaviour, IBeginDragHandler, IEndDragHandler
{
// 滑动速度
public float smooting = 5;
// 每页显示的项目
[SerializeField]
private int countPerPage = 10;
ScrollRect srect;
// 总页数
float totalPages;
// 是否拖拽结束
bool isDrag = false;
// 总页数索引比列 0-1
List<float> listPageValue = new List<float> { 0 };
// 滑动的目标位置
public float targetPos = 0;
// 当前位置索引
float nowindex = 0;
void Awake()
{
srect = GetComponent<ScrollRect>();
}
public string PageText()
{
return (nowindex + 1) + "/" + (totalPages + 1);
}
// 计算每页比例
public void CalcListPageValue<T>() where T : MonoBehaviour
{
T[] items = srect.content.GetComponentsInChildren<T>();
srect.content.rect.Set(srect.content.rect.width / 2, srect.content.rect.y, srect.content.rect.width, srect.content.rect.height);
totalPages = (int)(Math.Ceiling((float)items.Length / countPerPage) - 1);
if (items.Length != 0)
{
for (float i = 1; i <= totalPages; i++)
{
//Debug.Log(i / totalPages);
listPageValue.Add((i / totalPages));
}
}
}
void Update()
{
if (!isDrag)
{
srect.horizontalNormalizedPosition = Mathf.Lerp(srect.horizontalNormalizedPosition, targetPos,
Time.deltaTime * smooting);
}
// Debug
if (Input.GetKeyDown(KeyCode.LeftArrow)) PressLeft();
if (Input.GetKeyDown(KeyCode.RightArrow)) PressRight();
}
/// <summary>
/// 拖动开始
/// </summary>
/// <param name="eventData"></param>
public void OnBeginDrag(PointerEventData eventData)
{
isDrag = true;
}
/// <summary>
/// 拖拽结束
/// </summary>
/// <param name="eventData"></param>
public void OnEndDrag(PointerEventData eventData)
{
isDrag = false;
var tempPos = srect.horizontalNormalizedPosition; //获取拖动的值
var index = 0;
float offset = Mathf.Abs(listPageValue[index] - tempPos); //拖动的绝对值
for (int i = 1; i < listPageValue.Count; i++)
{
float temp = Mathf.Abs(tempPos - listPageValue[i]);
if (temp < offset)
{
index = i;
offset = temp;
}
}
targetPos = listPageValue[index];
nowindex = index;
}
public void PressLeft()
{
nowindex = Mathf.Clamp(nowindex - 1, 0, totalPages);
targetPos = listPageValue[Convert.ToInt32(nowindex)];
}
public void PressRight()
{
nowindex = Mathf.Clamp(nowindex + 1, 0, totalPages);
targetPos = listPageValue[Convert.ToInt32(nowindex)];
}
}
来源:https://www.cnblogs.com/linxmouse/p/10239098.html
标签:unity,scrollrect,翻页
0
投稿
猜你喜欢
汉字转拼音缩写示例代码(Silverlight和.NET 将汉字转换成为拼音)
2023-01-18 10:29:45
Mybatis Plus select 实现只查询部分字段
2022-07-23 18:51:32
c#根据网址抓取网页截屏生成图片的示例
2021-08-31 14:29:13
java格式化数值成货币格式示例
2023-01-31 06:27:45
java实现上传网络图片到微信临时素材
2022-09-21 08:43:23
java贪吃蛇游戏编写代码
2023-06-16 02:41:10
spring boot如何加入mail邮件支持
2021-09-27 15:12:57
详解Android TextView属性ellipsize多行失效的解决思路
2022-03-02 16:00:32
Java最长公共子序列示例源码
2023-08-20 13:25:37
C#计算程序执行过程花费时间的方法
2022-08-07 08:44:53
SpringBoot配置 Druid 三种方式(包括纯配置文件配置)
2021-06-03 01:41:19
Android实现左右摆动的球体动画效果
2023-08-31 02:28:45
Android基于OpenCV实现Harris角点检测
2023-07-16 12:19:47
详解Flutter中视频播放器插件的使用教程
2023-06-15 23:47:31
解决Springboot @Autowired 无法注入问题
2022-04-14 21:19:01
java为什么不建议用equals判断对象相等
2022-07-14 17:17:39
详解Android开发中Activity的四种launchMode
2023-05-19 08:30:27
Java标识接口的使用方法
2021-12-24 02:54:14
Android实现界面内嵌多种卡片视图(ViewPager、RadioGroup)
2023-03-06 15:48:31
java打jar包的几种方式详解
2021-09-27 08:43:59