【Unity】如何在Unity 中创建带有缩放效果的滚动视图(具有吸附效果的实现与优化)?

效果预览:

目录

效果预览:

一、引言:

二、问题描述

三、解决方案:

三、优化:

四、结论


一、引言:

在Unity开发中,经常需要实现滚动视图(ScrollView)中的内容吸附到最近的项目,这样可以提高用户体验,使用户更容易找到他们感兴趣的内容。本文将介绍如何在Unity中实现这一功能,并提出一些优化,以确保代码的效率和可维护性。 

注:此处是Unity 中创建带有缩放效果的滚动视图的进阶版,前面项目搭建的步骤大家可以看这篇文章:

如何在 Unity 中创建带有缩放效果的滚动视图?(简单方法)

二、问题描述

在开发中,我们经常需要实现这样一个功能:当用户滑动ScrollView时,滚动停止后,ScrollView的内容应该自动吸附到最近的规定位置,以使用户更容易选择他们想要查看的内容。我们需要计算ScrollView中每个“项目Item对象”相对于ScrollView中心的距离,并找到距离中心最近的“项目Item对象”,然后将ScrollView的内容移动,使“最近的项目Item对象”出现在ScrollView的中心位置。 

三、解决方案:

我们可以通过以下步骤来实现这一功能:

1. 遍历ScrollView中的所有“项目Item对象”,计算每个对象相对于ScrollView中心的距离。

2. 找到距离中心最近的“项目Item对象”。

3. 计算需要将ScrollView内容移动的距离,并将其移动,使最近的“项目Item对象”出现在ScrollView的中心位置。

 下面是用C#实现的示例代码:

using UnityEngine;
using UnityEngine.UI;public class ScrollAdsorption : MonoBehaviour
{public ScrollRect scrollRect;private RectTransform[] items;public float scaleDifference = 0.5f; // 缩放差异public RectTransform contentRectTrans; // Scroll Rect Content的RectTransformfloat viewPortSize;float center;int itemCount;void Start(){// 获取ScrollView的视图大小300;viewPortSize = scrollRect.viewport.rect.height;Debug.Log("ScrollView的视图大小:" + viewPortSize);// 计算ScrollView的中心位置center = scrollRect.transform.position.y;// - viewPortSize / 2;       Debug.Log("ScrollView的中心位置:" + center);// 获取ScrollView中的所有子对象itemCount = scrollRect.content.childCount;items = new RectTransform[itemCount];for (int i = 0; i < itemCount; i++){items[i] = scrollRect.content.GetChild(i).GetComponent<RectTransform>();//Debug.Log("items[i]: " + i);}}void Update(){foreach (RectTransform item in items){// 计算每个项目的中心位置float itemCenter = item.transform.position.y;// - item.rect.height / 2;//Debug.Log("每个项目的中心位置: " + itemCenter);// 计算每个项目相对于ScrollView中心的偏移量float distanceFromCenter = Mathf.Abs(center - itemCenter);// 根据偏移量计算缩放比例float scale = Mathf.Clamp(1 - distanceFromCenter * scaleDifference / viewPortSize, 0.5f, 1f);//Debug.Log("根据偏移量计算缩放比例: " + scale);// 应用缩放item.localScale = new Vector3(scale, scale, 1f);}// 如果用户停止滑动,则吸附到最近的项目Itemif (scrollRect.velocity.magnitude == 0f){SnapToNearItem();Debug.Log("不移动了!");}}void SnapToNearestItem(){RectTransform closestItem = null;foreach (RectTransform item in items){float distance = Mathf.Abs(center - item.position.y);if (distance < 50)// 根据需求调整阈值{closestItem = item;//Debug.Log("closestDistance"+ closestDistance);Debug.Log("装入了一个Item");}}// 将最近的年份吸附到ScrollView的中心if (closestItem != null){// 计算需要移动的距离float distanceToMove = center - closestItem.position.y;// 将ScrollView的内容向上或向下移动,使最近的年份对象出现在ScrollView的中心scrollRect.content.anchoredPosition += new Vector2(0f, distanceToMove);}}
}

在这个示例中,我使用了一个阈值来确定哪些“项目Item对象”被认为是最近的。大家可以根据实际需求调整这个阈值。 

三、优化:

在实际项目中,为了提高性能和代码的可维护性,我们可以进行一些优化:

1. 缓存ScrollView中的年份对象,以避免每次调用都需要重新查找。

2. 考虑使用二分查找算法来找到距离中心最近的年份对象,以减少计算量。

3. 使用事件监听或回调机制来触发吸附效果,以确保在滑动停止后才执行吸附操作,而不是每帧都执行。

综上所述,通过以上步骤和优化,我们可以在Unity中实现ScrollView最近年份吸附效果,并确保代码的效率和可维护性。

四、结论

本文介绍了如何在Unity中实现ScrollView“项目Item对象”吸附效果的方法,并提出了一些优化方案,以提高性能和可维护性。这些技巧可以帮助开发者更好地实现用户友好的滚动视图功能,提升应用的用户体验。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/498283.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx 常用的基础配置(前端相关方面)

Nginx是一款高性能的Web服务器和反向代理服务器&#xff0c;广泛应用于互联网领域。作为一名前端同学&#xff0c;了解并掌握Nginx的配置是非常有必要的。 安装Nginx sudo apt-get update sudo apt-get install nginx查看Nginx版本 nginx -v启动、停止、重启Nginx服务 sudo …

【GAD】动态图的半监督异常检测

SAD: Semi-Supervised Anomaly Detection on Dynamic Graphs Limitations of existing semi-supervised methodsContributionRelated workMethodDeviation Networks with Memory BankContrastive Learning for Unlabeled Samples Experiments少样本评估2D t-SNE可视化消融实验 …

C++之queue和dqueue

1、queue queue&#xff08;队列&#xff09;&#xff0c;一种数据结构&#xff0c;可以让某些数据结构的操作变得简单。队列&#xff08;queue&#xff09;最大的特点就是先进先出。就是说先放入queue容器的元素一定是要先出队列之后&#xff0c;比它后进入队列的元素才能够出…

Unity(第十一部)场景

游戏有多个场景组成&#xff08;新手村&#xff0c;某某副本&#xff0c;主城&#xff09; 场景是有多个物体组成&#xff08;怪物&#xff0c;地形&#xff0c;玩家等&#xff09; 物体是有多个组件组成&#xff08;刚体组件&#xff0c;自定义脚本&#xff09; 创建场景 编辑…

逆向案例三:动态xhr包中AES解密的一般步骤,以精灵数据为例

补充知识&#xff1a;进行AES解密需要知道四个关键字&#xff0c;即密钥key,向量iv,模式mode,填充方式pad 一般网页AES都是16位的&#xff0c;m3u8视频加密一般是AES-128格式 网页链接:https://www.jinglingshuju.com/articles 进行抓包结果返回的是密文&#xff1a; 一般思…

Sui主网升级至V1.19.1版本

其他升级要点如下所示&#xff1a; #16190, #16193 现在CLI正确处理并修复了交易没有输入或命令时的输出表格。例如&#xff0c;调用 client call — package 0x2 — module kiosk — function default 现在具有正确格式的输出。 #15928 Move编译器的一系列变更 添加了宏函…

使用Axure RP并配置IIS服务结合内网穿透实现公网访问本地HTML原型页面

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

《Redis 设计与实现》读书概要

注&#xff1a; 《Redis 设计与实现》一书基于 Redis 2.9 版本编写&#xff0c;部分内容已过时&#xff0c;过时之处本文会有所说明。本文为读书笔记&#xff0c;部分简单和日常使用较少的知识点未记录。原书网页版地址 https://redisbook.com/ 一、底层数据结构 SDS(Simple Dy…

SVN教程-SVN的基本使用

SVN&#xff08;Apache Subversion&#xff09;是一款强大的集中式版本控制系统&#xff0c;它在软件开发项目中扮演着至关重要的角色&#xff0c;用于有效地跟踪、记录和管理代码的演变过程。与分布式系统相比&#xff0c;SVN 的集中式架构使得团队能够更加协同地进行开发&…

一、深度学习介绍

目录 1、深度学习与机器学习的区别 1.1 特征提取方面 1.2 数据量和计算性能要求 1.3 算法代表 2、深度学习应用场景 1、深度学习与机器学习的区别 1.1 特征提取方面 1.2 数据量和计算性能要求 1.3 算法代表 2、深度学习应用场景

Linux课程四课---Linux开发环境的使用(vim编辑器的相关)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

图神经网络实战——图论

图神经网络实战——图论 0. 前言1. 图属性1.1 有向图和无向图1.2 加权图与非加权图1.3 连通图非连通图1.4 其它图类型 2. 图概念2.1 基本对象2.2 图的度量指标2.2 邻接矩阵表示法 3. 图算法3.1 广度优先搜索3.2 深度优先搜索 小结系列链接 0. 前言 图论 (Graph theory) 是数学…