【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的RectTransform

    float 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);
        }


        // 如果用户停止滑动,则吸附到最近的项目Item
        if (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对象”吸附效果的方法,并提出了一些优化方案,以提高性能和可维护性。这些技巧可以帮助开发者更好地实现用户友好的滚动视图功能,提升应用的用户体验。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

印象笔记 - Markdown 入门指南

一、Markdown 是什么&#xff1f; Markdown 是一种轻量级的「标记语言」&#xff0c;创始人为约翰格鲁伯&#xff0c;用简洁的语法代替排版&#xff0c;目前被越来越多的知识工作者、写作爱好者、程序员或研究员广泛使用。其常用的标记符号不超过十个&#xff0c;相对于更为复…

一张图读懂人工智能

一、生成人工智能的概念和应用&#xff0c;以及如何使用大型语言模型进行聊天和创造原创内容。这项技术将会对人类和企业产生深远影响。 计算机获得学习、思考和交流的能力&#xff0c;被称为生成人工智能。生成人工智能可以立即获得人类所有知识的总和&#xff0c;并回答任何…

【Intel oneAPI实战】使用英特尔套件解决杂草-农作物检测分类的视觉问题

目录 一、简介&#xff1a;计算机视觉挑战——检测并清除杂草二、基于YOLO的杂草-农作物检测分类2.1、YOLO简介2.2、基于YOLO的杂草-农作物检测分类解决方案 三、基于YOLO的杂草-农作物检测分类系统设计3.1、基于flask框架的demo应用程序后端3.2、基于Vue框架的demo应用程序前端…

c++中使用lambda表达式的作用和用法

lambda表达式&#xff1a; 这是C11引入的一种新特性&#xff0c;它可以让您在需要定义函数对象的地方&#xff0c;直接编写一个匿名的、可以捕获上下文变量的函数体&#xff0c;非常适合用作回调函数、临时计算或定义小型函数对象。 lambda表达式与普通函数类似&#xff0c;也有…

[MYSQL数据库]--mysql的基础知识

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、数据库…

上门废品回收小程序开发,从传统到线上,到“高收益”

随着我国社会经济不断发展&#xff0c;人们的消费水平能力也在不断提升&#xff0c;日常生活中会产生非常多的废弃物品&#xff0c;为废品回收行业带来了大量的机遇。在回收行业的发展前景下&#xff0c;也为年轻人带来了创业机会&#xff0c;既获得利润&#xff0c;也能为社会…

六、OpenAI之嵌入式(Embedding)

嵌入模式 学习怎么将文本转换成数字&#xff0c;解锁搜索等案例。 新的嵌入模型 text-embedding-3-small 和 text-embedding-3-large&#xff0c;是目前最新的并且性能最好的嵌入模型&#xff0c;成本低&#xff0c;支持多语言&#xff0c;拥有控制所有大小的新参数 1. 什么是…

周鸿祎免费课演示AI新品,瞬时流量暴增现场增加服务器

2月29日&#xff0c;360创始人周鸿祎首堂AI免费课开讲&#xff0c;吸引千万网友围观。演讲现场周鸿祎演示了两款AI驱动的新产品。在演示测试版360AI搜索时&#xff0c;由于用户体验火爆&#xff0c;瞬时流量暴增44倍&#xff0c;为满足用户和全网用户需求临时增加了服务器。产品…

solidity编程

一.Solidity 简介 Solidity 是⼀种⽤于编写以太坊虚拟机&#xff08; EVM &#xff09;智能合约的 编程语⾔。我认为掌握 Solidity 是参与链上项⽬的必备技 能&#xff1a;区块链项⽬⼤部分是开源的&#xff0c;如果你能读懂代码&#xff0c;就可以 规避很多亏钱项⽬。…

LeetCode 2265.统计值等于子树平均值的节点数

给你一棵二叉树的根节点 root &#xff0c;找出并返回满足要求的节点数&#xff0c;要求节点的值等于其 子树 中值的 平均值 。 注意&#xff1a; n 个元素的平均值可以由 n 个元素 求和 然后再除以 n &#xff0c;并 向下舍入 到最近的整数。 root 的 子树 由 root 和它的所…

大模型量化技术原理-ZeroQuant系列

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;从而导致模型变得越来越大&#xff0c;因此&#xff0c;我们需要一些大模型压缩技术来降低模型部署的成本&#xff0c;并提升模型的推理性能。 模型压缩主要分…

什么是VR紧急情况模拟|消防应急虚拟展馆|VR游戏体验馆加盟

VR紧急情况模拟是利用虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术来模拟各种紧急情况和应急场景的训练和演练。通过VR技术&#xff0c;用户可以身临其境地体验各种紧急情况&#xff0c;如火灾、地震、交通事故等&#xff0c;以及应对这些紧急情况的…

IM(即时通讯-聊天工具):一文读懂,技术栈和界面设计。

大家好&#xff0c;我是贝格前端工场&#xff0c;本期继续分享IM&#xff08;即时通讯&#xff09;的设计&#xff0c;欢迎大家关注&#xff0c;如有B端写系统界面的设计和前端需求&#xff0c;可以联络我们。 一、什么是IM&#xff08;聊天工具) IM即时通讯工具是指一类用于…

C++——类和对象(2):构造函数、析构函数、拷贝构造函数

2. 类的6个默认成员函数 我们将什么成员都没有的类称为空类&#xff0c;但是空类中并不是什么都没有。任何类中都会存在6个默认成员函数&#xff0c;这6个默认成员函数如果用户没有实现&#xff0c;则会由编译器默认生成。 6个默认成员函数包括&#xff1a;负责初始化工作的构造…

怎么调用文心一言的api接口生成一个简单的聊天机器人(python代码)

寒假在学习大模型&#xff0c;但也没弄出多少眉目&#xff0c;电脑性能还有点小问题&#xff0c;大模型总跑不起来&#xff0c;只会简单调用一下现有的大模型的接口&#xff0c;例如&#xff1a;文心一言&#xff0c;下面展示一下代码&#xff1a; import tkinter as tk impor…

Linux中如何在创建子线程的时候设置为分离属性

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<unistd.h> #include <pthread.h> void *mythread(void *arg) {printf("id[%ld]\n",pthread_self()); } int main() { //定义pthread_…

力扣550 游戏玩法分析 IV

目录 题目描述 思路整理 1. 首次登录日期 2. 第二天登录 3. 计算比率 实现思路 完整代码及解释 题目描述 Table: Activity ----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int | | ev…

华为自动驾驶技术详解报告分享

ADS2.0首发搭载问界M5智驾版&#xff0c;城市NCA计划年底全国开通。2023年4月16日华为在智能汽车解决方案发布会上发布了最新的ADS2.0产品&#xff0c;硬件数量减少至27个(11个摄像头12个超声波雷达3个毫米波雷达1个激光雷达,ADS1.0有34个)&#xff0c;车载计算平台改为MDC610&…

苹果ios群控软件开发常用源代码分享!

在移动软件开发领域&#xff0c;苹果设备由于其封闭性和安全性受到了广大开发者的青睐&#xff0c;然而&#xff0c;这也为开发者带来了一些挑战&#xff0c;特别是在进行群控软件开发时。 群控软件是指可以同时控制多台设备的软件&#xff0c;这在自动化测试、批量操作等场景…

网络编程难点之select、poll与epoll详解

前言 为什么需要I/O多路复用技术&#xff1f; 首先&#xff0c;I/O多路复用技术主要被应用在需要高性能的网络服务器程序中。 高性能网络服务器程序需要做的事情就是供多个客户端同时进行连接并处理客户端传送过来的数据请求&#xff1a; 对于这种情况&#xff0c;很多人自然…