【Unity实战篇】| 快速制作一个简易时钟,包括2D和3D时钟

news2024/11/25 1:03:13

请添加图片描述

      • 前言
  • 【Unity实战篇】| 快速制作一个时钟,包括2D和3D时钟
    • 一、2D时钟制作
      • 1.1 钟表盘制作
      • 1.2 指针制作
      • 1.3 钟表搭建
      • 1.4 设置时钟的中心点
      • 1.5 时钟旋转逻辑
    • 二、3D时钟制作
      • 2.1 搭建表盘和指针
      • 2.2 调整指针的位置和节点
      • 2.3 时钟旋转逻辑
  • 总结

请添加图片描述


前言

  • 时钟 这个东西想必不用多说,应该没有小伙伴不知道吧。
  • 本篇文章来写一下怎样使用Unity引擎快速制作一个时钟,包括2D和3D时钟。
  • 废话不多说,下面一起来看下具体做法是怎样的吧!

【Unity实战篇】| 快速制作一个时钟,包括2D和3D时钟

请添加图片描述

请添加图片描述


一、2D时钟制作

1.1 钟表盘制作

2D时钟制作时首先需要找一张背景图作为钟表盘,例如下面这种,找一张切图备用。

在这里插入图片描述

将切图放到Unity工程中,将图片类型Texture Type改为Sprite,就可以放到UI中的Image组件使用了。
在这里插入图片描述

如果想自己制作一张也很简单,找一张圆形图,然后按自己的喜欢添加一下代表时间的周边环纹即可。

1.2 指针制作

最基础的钟表中一般都包含时针、分针、秒针这三个指针,可以找一下相关的指针切图使用,也可以使用Unity直接制作三个指针。

新建三个Image组件,然后调整一下长宽就可以用了。
在这里插入图片描述

1.3 钟表搭建

新建一个游戏对象,在下面新建四个节点,分别用于钟表盘、时针、分钟、秒针,并按合适的位置进行摆放。

如下图所示:
在这里插入图片描述

1.4 设置时钟的中心点

有一个关键点需要注意,三个指针的 Pivot中心点 需要调整到表盘的最中心处,不然旋转起来之后就会乱七八糟,各转个的了。
在这里插入图片描述

这样设置之后再旋转的时候才会围绕表盘中心进行旋转,符合钟表的旋转逻辑。

1.5 时钟旋转逻辑

钟表是一个圆,转一圈需要360°,换算成时、分、秒的结果就是:

  • 时针 每小时旋转的角度= 360f / 12
  • 分针 每分钟旋转的角度 = 360f / 60
  • 秒针 每秒旋转的角度 = 360f / 60

所以只需要获取当前的具体时间,拿到小时数、分钟数及秒数,并将时针、分针及秒针分别旋转指定的角度即可完成钟表的功能逻辑。

通过Unity的API 可以拿到当前时间,包括当前的小时数、分钟数以及秒数。:DateTime.NowDateTime.Now.TimeOfDay

打印结果如下:
在这里插入图片描述

DateTime.Now可以获取当前的时间,不过返回的时间是整数型,只能实现秒针按秒进行跳动,不能平滑的旋转。而DateTime.Now.TimeOfDay可以获取精度更高的时间,实现秒针更平滑的旋转效果。

随后调用Unity让物体旋转的API Quaternion.Euler(Vector3 v3)将旋转的角度传进去即可实现效果。

完整代码如下:

using System;
using UnityEngine;

public class ClockTest : MonoBehaviour
{
    public Transform hourTrans;
    public Transform minuteTrans;
    public Transform secondTrans;

    //是否平滑旋转
    public bool isContinuous;

    private const float hoursToDegrees = 360f / 12f;//时针每小时旋转的角度
    private const float minutesToDegrees = 360f / 60f;//分针每分钟旋转的角度
    private const float secondsToDegrees = 360f / 60f;//秒针每秒旋转的角度


    void Update()
    {
        if (isContinuous)
        {
            TimeSpan timespan = DateTime.Now.TimeOfDay;
            //拿到当前的时、分、秒后,将时针、分针、秒针分别旋转指定的角度
            hourTrans.localRotation = Quaternion.Euler(0f, 0f, (float)timespan.TotalHours * -hoursToDegrees);
            minuteTrans.localRotation = Quaternion.Euler(0f, 0f, (float)timespan.TotalMinutes * -minutesToDegrees);
            secondTrans.localRotation = Quaternion.Euler(0f, 0f, (float)timespan.TotalSeconds * -secondsToDegrees);
        }
        else
        {
            DateTime time = DateTime.Now;
            hourTrans.localRotation = Quaternion.Euler(0f, 0f, time.Hour * -hoursToDegrees);
            minuteTrans.localRotation = Quaternion.Euler(0f, 0f, time.Minute * -minutesToDegrees);
            secondTrans.localRotation = Quaternion.Euler(0f, 0f, time.Second * -secondsToDegrees);
        }
    }
}

将脚本挂载到场景中,并将时/分/秒三个对象拖到脚本中,通过控制isContinuous可以实现是否使用平滑旋转的效果。
在这里插入图片描述

实现效果如下:
请添加图片描述


二、3D时钟制作

3D时钟的旋转逻辑与2D时钟一致,只不过表盘及指针换成3D效果展示,下面来快速演示一下实现的过程。

2.1 搭建表盘和指针

在场景中创建一个Capsule圆柱体,调整大小做成钟表的表盘,接着创建一些Cube调整大小做成表盘上的刻度,最后创建三个Cube立方体,调整长宽高做成指针。
在这里插入图片描述

2.2 调整指针的位置和节点

指针的位置和节点非常重要,如果调节的不正确,则指针就无法按照正常的钟表逻辑进行旋转。

这里调整的方法有多种,来展示一下本文使用到的一种方式。

新建三个游戏对象 h、m、s作为时分秒针的父节点,将这三个游戏对象放置到表盘的中心点。

接着将前面制作好的时分秒三个指针对象各自放置到这三个节点下,并调好位置,如下图所示:
在这里插入图片描述

2.3 时钟旋转逻辑

时钟旋转的逻辑与前面UI时钟的逻辑一致,将脚本挂载到场景中,将时分秒三个游戏对象拖到脚本中即可。
在这里插入图片描述

using System;
using UnityEngine;

public class ClockTest : MonoBehaviour
{
    public Transform hourTrans;
    public Transform minuteTrans;
    public Transform secondTrans;

    public bool isContinuous;

    private const float hoursToDegrees = 360f / 12f;//时针每小时旋转的角度
    private const float minutesToDegrees = 360f / 60f;//分针每分钟旋转的角度
    private const float secondsToDegrees = 360f / 60f;//秒针每秒旋转的角度


    void Update()
    {
        if (isContinuous)
        {
            TimeSpan timespan = DateTime.Now.TimeOfDay;
            //拿到当前的时、分、秒后,将时针、分针、秒针分别旋转指定的角度
            hourTrans.localRotation = Quaternion.Euler(0f, 0f, (float)timespan.TotalHours * -hoursToDegrees);
            minuteTrans.localRotation = Quaternion.Euler(0f, 0f, (float)timespan.TotalMinutes * -minutesToDegrees);
            secondTrans.localRotation = Quaternion.Euler(0f, 0f, (float)timespan.TotalSeconds * -secondsToDegrees);
        }
        else
        {
            DateTime time = DateTime.Now;
            hourTrans.localRotation = Quaternion.Euler(0f, 0f, time.Hour * -hoursToDegrees);
            minuteTrans.localRotation = Quaternion.Euler(0f, 0f, time.Minute * -minutesToDegrees);
            secondTrans.localRotation = Quaternion.Euler(0f, 0f, time.Second * -secondsToDegrees);
        }
    }
}

演示效果如下:

请添加图片描述


总结

  • 本文介绍了怎样使用Unity制作一个简易时钟,包括2D和3D时钟的制作。
  • 制作的功能点在于如何让指针按正确的逻辑旋转,以及如何拿到当前的时间。
  • 功能比较简单,适合新手练习,可以优化UI和3D对象,尝试制作出更精美的时钟效果!

  • 🎬 博客主页:https://xiaoy.blog.csdn.net

  • 🎥 本文由 呆呆敲代码的小Y 原创 🙉

  • 🎄 学习专栏推荐:Unity系统学习专栏

  • 🌲 游戏制作专栏推荐:游戏制作

  • 🌲Unity实战100例专栏推荐:Unity 实战100例 教程

  • 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 📆 未来很长,值得我们全力奔赴更美好的生活✨

  • ------------------❤️分割线❤️-------------------------

请添加图片描述请添加图片描述请添加图片描述

请添加图片描述

资料白嫖,技术互助

学习路线指引(点击解锁)知识定位人群定位
🧡 Unity系统学习专栏 🧡入门级本专栏从Unity入门开始学习,快速达到Unity的入门水平
💛 Unity实战类项目 💛进阶级计划制作Unity的 100个实战案例!助你进入Unity世界,争取做最全的Unity原创博客大全。
❤️ 游戏制作专栏 ❤️ 难度偏高分享学习一些Unity成品的游戏Demo和其他语言的小游戏!
💚 游戏爱好者万人社区💚 互助/吹水数万人游戏爱好者社区,聊天互助,白嫖奖品
💙 Unity100个实用技能💙 Unity查漏补缺针对一些Unity中经常用到的一些小知识和技能进行学习介绍,核心目的就是让我们能够快速学习Unity的知识以达到查漏补缺

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

租房项目之并发缺失数据问题

前奏:本项目是一个基于django的租房信息获取项目。本次博客牵扯到两个版本,集中式分布以及分布式部署(两个版本的ui不同,集中式用的是老版ui,分布式使用的是新版ui); 项目链接:http…

Peewee,一个既小巧又强大的 Python 库-轻松实现数据库的增删改查

目录 01初识 Peewee 为什么选择 Peewee? 02安装与配置 安装 Peewee 配置 Peewee 03定义模型 定义简单模型 定义复杂模型 04基本操作 创建记录 查询记录 更新记录 删除记录 05高级操作 复杂查询 事务处理 使用信号 模型迁移 06实战案例 简单博客系统 任务管…

2024年金地杯山西省大学生数学建模竞赛B题D题论文代码分析

2024金地杯数学建模B题和金地杯数学建模D题32页论文和代码已完成,代码为B题D题全部问题的代码,论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解(问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求…

elasticsearch过滤器filter:原理及使用

码到三十五 : 个人主页 目录 一、引言二、Elasticsearch的过滤器概述三、使用DSL进行过滤操作术语过滤范围过滤复合过滤 四、优化策略五、结语 一、引言 Elasticsearch是一个功能强大的开源搜索引擎,广泛应用于各种数据检索和处理场景。在Elasticsearch…

C++ | Python气泡表面张力和预期形态及上升速度数值模型

📜模型-用例 📜流体力学:C风流和MATLAB | Python | CUDA 库埃特流泊肃叶流薄膜流体 | 📜神经网络:Python捕捉重叠气泡单体运动,算法测速 ✒️C风成和风蚀建模 风成过程是指由风在地表或近地表引起的侵蚀…

大跨度气膜综合馆有哪些应用场景—轻空间

1. 体育场馆 气膜综合馆广泛应用于各类体育场馆,如足球场、篮球场、网球场、游泳馆等,满足不同体育项目的需求。 2. 大型展览 气膜馆的宽敞空间和灵活布局,非常适合举办各类大型展览、交易会和博览会,提供充足的展示和活动空间。…

深入剖析 Laravel 框架:构建高效PHP应用的最佳实践

引言 随着互联网的高速发展,PHP 作为一门广泛使用的服务器端脚本语言,始终备受开发者青睐。而在众多 PHP 框架中,Laravel 凭借其优雅的设计和高效率,成为了构建现代 Web 应用的热门选择。本文将从零开始,探讨如何使用 …

聊聊redis中的字典的实现

写在文章开头 redis作为非关系数据库,其底层采用了字典(也称为映射)保存键值对。本文会基于源码分析的方式带你了解redis中这一常见数据结构的精巧设计,希望对你有帮助。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java c…

需求虽小但是问题很多,浅谈JavaScript导出excel文件

最近我在进行一些前端小开发,遇到了一个小需求:我想要将数据导出到 Excel 文件,并希望能够封装成一个函数来实现。这个函数需要接收一个二维数组作为参数,数组的第一行是表头。在导出的过程中,要能够确保避免出现中文乱…

【单片机】DS2431芯片,读写128个字节,程序

ds2431pt&r stm32读写程序&#xff1a; 部分程序&#xff1a; #include "sys.h" #include "delay.h" #include "usart.h"#include <stdio.h> #include <stdlib.h> #include <string.h>#include "sys.h" #incl…

使用代理IP常见问题及解答

代理IP在互联网数据收集和业务开展中发挥着重要作用&#xff0c;它充当用户客户端和网站服务器之间的“屏障”&#xff0c;可以保护用户的真实IP地址&#xff0c;并允许用户通过不同的IP地址进行操作。然而&#xff0c;在使用代理IP的过程中&#xff0c;用户经常会遇到一些问题…

车载学习:UDS诊断、ECU刷写、OTA升级、Tbox测试、CANoe实操

每天的直播时间&#xff1a; 周一至周五&#xff1a;20&#xff1a;00-23&#xff1a;00 周六与周日&#xff1a;9&#xff1a;00-12&#xff1a;00&#xff0c;14&#xff1a;00-17&#xff1a;00 TBOX 深圳 涉及过T-BOX测试吗Ota升级涉及的台架环境是什么样的&#xff1f;上…

全球潮流集结:海外盲盒小程序引领消费新风尚

随着全球化的加速和互联网的普及&#xff0c;消费者的购物选择不再局限于本土市场&#xff0c;而是越来越多地关注国际潮流和时尚趋势。在这个背景下&#xff0c;海外盲盒小程序应运而生&#xff0c;以其独特的购物模式和全球化的商品选择&#xff0c;迅速成为引领消费新风尚的…

Elasticsearch:智能 RAG,获取周围分块(二)

在之前的文章 “Elasticsearch&#xff1a;智能 RAG&#xff0c;获取周围分块&#xff08;一&#xff09; ” 里&#xff0c;它介绍了如何实现智能 RAG&#xff0c;获取周围分块。在那个文章里有一个 notebook。为了方便在本地部署的开发者能够顺利的运行那里的 notebook。在本…

522. 最长特殊序列 II(Rust)

题目 给定字符串列表 strs &#xff0c;返回其中 最长的特殊序列 的长度。如果最长特殊序列不存在&#xff0c;返回 -1 。 特殊序列 定义如下&#xff1a;该序列为某字符串 独有的子序列&#xff08;即不能是其他字符串的子序列&#xff09;。 s 的 子序列可以通过删去字符串…

Linux中nginx.conf如何配置【搬代码】

Nginx 是一个独立的软件。 它是一款高性能的 Web 服务器、反向代理服务器和负载均衡器等&#xff0c;具有强大的功能和广泛的应用场景。它通常需要单独进行安装和配置来发挥其作用。 下载网址&#xff1a;http://nginx.org/en/download.html nginx.conf写法&#xff1a; #配置…

怎么样为您的步进电机设计选择正确的驱动器

步进电机已成为从车辆气候控制到工业剂量泵和剧院舞台照明等应用的动态定位解决方案。更好的性能、更小的尺寸和更低的成本都有助于它们进入主流应用。 正如电机及其应用的发展一样&#xff0c;控制电机所需的驱动电子设备也在不断发展。特别是&#xff0c;汽车设计人员已经实…

宋仕强论道之华强北假货

宋仕强论道之华强北假货&#xff0c;在华强北发展的初期&#xff0c;假货是华强北一大特点&#xff0c;一般分为翻新&#xff08;拆机&#xff09;货、散新货、换标货、虚标货、国产替换货等几种。金航标kinghelm&#xff08;www.kinghelm.com.cn&#xff09;和萨科微slkor&…

【Docker】解决访问难题:搭建私有的Docker镜像代理

什么是Nexus 3 Nexus 3是由Sonatype公司开发的一款强大的包管理和仓库服务工具&#xff0c;它广泛应用于自动化的构建系统和持续集成/持续部署(CI/CD)流程中。Nexus 3支持多种包格式&#xff0c;包括但不限于Maven、npm、Docker、NuGet等&#xff0c;能够为软件开发中的依赖管…

【Android】安Android Studio环境搭建注意点

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…