【Unity】构建简单实用的年份选择器(简单原理示范)

在许多应用程序和游戏中,年份选择是一个常见的需求。无论是在日历应用程序中查看事件,还是在历史类游戏中选择时间段,年份选择器都是用户体验的重要组成部分,下面实现一个简易的年份选择器。

一、效果预览: 

目录

一、效果预览: 

二、步骤

2.1 场景准备

 2.2 项目准备

2.3 编写脚本

三、总结 


二、步骤

2.1 场景准备

1. 创建场景新建Image调整大小为宽360,高300(原理:年份内容显示5个,每个宽100,高60,总共60*5,于是高设置为300)。

2. 为Image添加mask组件(遮挡其他年份)和ScrollRect 组件,使其作为滚动视图的容器,最后调整参数,我这里垂直滚动,于是取消了Horizontal选项。

3. 在Image下创建空物体GameObject(用来存放后面运行生成的年份)。

4.为空物体GameObject添加Grid Layout Group和Content Size Fitter组件,调整参数(这里可以在其下创建几个Image查看效果)。

5. 在Image的ScrollRect 组件中拖入相应物体。

 2.2 项目准备

创建Text预制体(用来显示年份) ,字体等参数可以根据自己需要调整。

2.3 编写脚本

using UnityEngine;
using UnityEngine.UI;

public class SlidingAdsorption : MonoBehaviour
{
    public GameObject yearTextPrefab; // 预设的年份Text对象
    public ScrollRect scrollRect;
    public float scaleDifference = 0.5f; // 缩放差异
    public RectTransform contentRectTrans; // Scroll Rect Content的RectTransform
    
    
    private RectTransform[] items;//用来存放生成的年份
    int yearsCount =40; // 年份总数
    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);


        for (int i = 0; i < yearsCount; i++)
        {
            GenerateYearText(1950 + i);
        }
        // 获取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);
        }


        // 如果用户停止滑动,则吸附到最近的年份
        if (scrollRect.velocity.magnitude <= 20.0f)
        {
            SnapToNearestYear();
            Debug.Log("不移动了!");
        }
    }
    private void GenerateYearText(int year)
    {
        GameObject yearText = Instantiate(yearTextPrefab, contentRectTrans);
        yearText.transform.SetAsFirstSibling();
        yearText.transform.GetComponent<Text>().text = year.ToString();
    }

    void SnapToNearestYear()
    {
        RectTransform closestItem = null;

        foreach (RectTransform item in items)
        {
            float distance = Mathf.Abs(center - item.position.y);
            if (distance < 35)// 根据需求调整阈值
            {
                closestItem = item;
                Debug.Log("装入了一个Item");
            }
        }

        // 将最近的年份吸附到ScrollView的中心
        if (closestItem != null)
        {
            // 计算需要移动的距离
            float distanceToMove = center - closestItem.position.y;

            // 将ScrollView的内容向上或向下移动,使最近的年份对象出现在ScrollView的中心
            scrollRect.content.anchoredPosition += new Vector2(0f, distanceToMove);
        }
    }
}

 将脚本挂载在Canvas上,并将相应物体拖入。

此处原理可以参考我这两篇文章:如何在 Unity 中创建带有缩放效果的滚动视图?(简单方法) 

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

三、总结 

通过本文探讨了在Unity中创建年份选择器的基本步骤,无论是在日历应用、历史游戏还是其他类型的应用中,一个功能完善的年份选择器都能够为用户提供更好的体验,提升应用的质量和竞争力。希望本文能够对读者在Unity开发中实现年份选择器有所帮助,为其未来的项目开发提供有益的指导和参考。

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

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

相关文章

浅谈mysql mvcc

目录 前言 mvcc 是如何工作的&#xff1f; 数据的更新 前言 mvcc 与一个事物的隔离级别有关&#xff0c;未提交读永远读的是当前值&#xff0c;串行化是通过加锁实现&#xff0c;这两种隔离级别都与mvcc 没有任何关系。只要一提到mvcc应该想到的是读提交以及可重复读&#…

Node.js中的缓存策略和缓存技巧

在Node.js中&#xff0c;缓存策略和缓存技巧是提升应用性能和用户体验的关键因素。通过有效地利用缓存&#xff0c;我们可以显著减少系统资源的消耗&#xff0c;加快数据访问速度&#xff0c;从而提升整体的网站性能。本文将针对Node.js中的缓存策略和缓存技巧展开深入探讨&…

php PhpSpreadsheet 读取日期变数字问题解决

问题描述&#xff1a; 使用PhpSpreadsheet 读取表格数据&#xff0c;日期格式读取后变成数字&#xff0c;如下图&#xff1a; 解决方案&#xff1a; $cell $sheet->getCell(H . $row)->getValue(); $toTimestamp \PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimes…

CentOS安装GUI图形界面

CentOS安装图形界面 CentOS minimal环境安装图形界面。 列出所有可用的Environment Groups yum group list yum groupinfo "GNOME Desktop"选择GNOME Desktop软件包组进行安装 yum groupinstall -y GNOME Desktop1 如果要通过GUI配置网络需要安装Server with GU…

深入理解Java泛型及其在实际编程中的应用

第1章&#xff1a;泛型的起源与重要性 大家好&#xff0c;我是小黑&#xff0c;在Java里&#xff0c;泛型&#xff08;Generics&#xff09;是一种不可或缺的特性&#xff0c;它允许咱们在编码时使用类型&#xff08;Type&#xff09;作为参数。这听起来可能有点绕&#xff0c…

倒模专用制作耳机壳UV树脂:改性丙烯酸树脂

倒模专用制作耳机壳的UV树脂是经过改性的丙烯酸树脂&#xff0c;具有高透明度、高粘度、快速固化的特点。这种树脂可以通过紫外线光固化&#xff0c;快速形成坚硬的表面&#xff0c;并且具有较高的硬度和耐磨性&#xff0c;因此非常适合用于制作耳机壳。 此外&#xff0c;改性丙…

anaconda简介以及安装(Windows)

介绍 Anaconda是一个开源的Python发行版本&#xff0c;它是一个打包的集合&#xff0c;里面预装了conda、Python、众多packages、科学计算工具等。Anaconda的目的是方便使用Python进行数据科学研究&#xff0c;它涵盖了数据科学领域常见的Python库&#xff0c;并且自带了专门用…

SpringBoot 整合WebService

文章目录 WebService1.简单介绍WebService1.1. 类型1.2. 架构1.3. 主要特点1.4. 使用场景1.5. Web服务标准和技术 2.案例-WebServiceDemo2.1.引入配置文件2.2.创建接口2.3.创建接口实现类2.4.创建WebService配置类2.5.测试 WebService Web服务&#xff08;Web Services&#xf…

【C语言】指针初阶2.0版本

这篇博文我们来继续学习指针的其他内容 指针2.0 传值调用与传址调用传值调用传址调用 一维数组与指针理解数组名使用指针深入理解一维数组 二级指针指针数组二维数组与指针 传值调用与传址调用 在开始之前&#xff0c;我们需要先了解这个概念&#xff0c;后面才能够正常的学习…

android移动应用开发基础答案,安卓工程师面试题

一线企业的app都是多线程和多进程的&#xff0c;而Android进程间通信机制就是Binder&#xff0c;原生的线程间通信则是Handler&#xff0c;Binder和Handler是了解安卓运行机制必须要掌握的一个知识点&#xff0c;更是一线企业面试必问的知识点&#xff01; 以下几道就是大厂关于…

Ansible的playbook的编写和解析

目录 什么是playbook Ansible 的脚本 --- playbook 剧本 实例部署&#xff08;使用playbook安装启动httpd服务&#xff09; 1.编写一个.yaml文件 在主机下载安装http&#xff0c;将配置文件复制到opt目录下 运行playbook 在192.168.17.77主机上查看httpd服务是否成功开启…

Codeforces Round 930 (Div. 2)题解

A. Shuffle Party&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;给定一个n长数组&#xff0c;并使得a[i]i&#xff0c;现在定义一种操作swap(k):找出k的最大不等于自己的除数d&#xff0c;交换a[k]和a[d]&#xff0c;k从1开始直到n结束&#xff0c;问…

训练1 : 老头

以前用blender做的特效 总结 头发很费时间, 需要参考和练习眼窝周边结构还有些待准确把握从光与影中揣摩轮廓形状 从少量面掌握大体, 从多数面雕刻细节

云时代【5】—— LXC 与 容器

云时代【5】—— LXC 与 容器 三、LXC&#xff08;一&#xff09;基本介绍&#xff08;二&#xff09;相关 Linux 指令实战&#xff1a;使用 LXC 操作容器 四、Docker&#xff08;一&#xff09;删除、安装、配置&#xff08;二&#xff09;镜像仓库1. 分类2. 相关指令&#xf…

教师招聘和事业编d类有什么区别吗

每年都有大批怀揣教育梦想的年轻人&#xff0c;站在职业的十字路口&#xff0c;对未来充满期许与疑惑。他们中的许多人都会面临这样一个问题&#xff1a;教师招聘和事业编D类&#xff0c;到底有什么区别&#xff1f;今天&#xff0c;就让我来为你揭开这两者的神秘面纱。 别被这…

基于session注册JAva篇springboot

springboot3全家桶&#xff0c;数据库 &#xff1a;redis&#xff0c;mysql 背景环境&#xff1a;邮箱验证码&#xff0c;验证注册 流程&#xff1a;先通过邮箱验证&#xff0c;发送验证码&#xff0c;将获取到的session和验证码&#xff0c;存入redis里&#xff08;发送邮箱…

3d模型版本转换器注意事项---模大狮模型网

在使用3D模型版本转换器时&#xff0c;有一些注意事项可以帮助您顺利完成模型转换并避免不必要的问题&#xff1a; 数据完整性&#xff1a;在进行模型转换之前&#xff0c;确保您的原始3D模型文件没有损坏或缺失数据。损坏的文件可能导致转换器无法正常处理或输出错误的结果。 …

【前端素材】推荐优质在线大气数码商城电商网页ClassiList平台模板(附源码)

一、需求分析 1、系统定义 电子数码电商平台是专门销售电子数码产品&#xff08;如手机、电脑、相机、智能设备等&#xff09;的在线电子商务平台。这些平台提供了一个便捷的购物环境&#xff0c;让消费者可以方便地浏览、比较和购买各种电子数码产品。 2、功能需求 在线大…

常见外设学习以及无线通信频率

常见外设 UART UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发器&#xff09;是一种异步、串行、全双工的通信总线。 UART 有3根线&#xff0c;分别是&#xff1a;发送线&#xff08;TX&#xff09;、接收线&#xff08;RX&#xff…

找不到msvcp140.dll无法运行程序如何处理?分享5种解决方法

在计算机系统运行过程中&#xff0c;如果无法找到必要的动态链接库文件msvcp140.dll&#xff0c;可能会引发一系列的问题与故障。这个特定的dll文件是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于此编译环境开发的应用程序至关重要。缺失msvcp…