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

请添加图片描述

      • 前言
  • 【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.mfbz.cn/a/716045.html

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

相关文章

【C++】数据类型、函数、头文件、断点调试

四、基本概念 这部分和C语言重复的部分就简写速过,因为我之前写过一个C语言的系列,非常详细。C和C这些都是一样的,所以这里不再一遍遍重复码字了。感兴趣的同学可以翻看我之前的C语言系列文章。 1、数据类型 编程的本质就是操作数据。 操…

PyCharm配置教程,手把手教你如何配置

文章目录 引言1. 安装 PyCharm1.1 下载和安装1.2 初次启动 2. 基本配置2.1 设置界面2.2 常用配置项 3. 项目配置3.1 创建新项目3.2 配置解释器 4. 虚拟环境配置4.1 创建虚拟环境4.2 使用已有虚拟环境4.3 管理依赖 5. 插件和扩展5.1 安装插件5.2 推荐插件 6. 调试配置6.1 配置调…

React+TS前台项目实战(九)-- 全局常用组件弹窗Dialog封装

文章目录 前言Dialog公共弹窗组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局公共弹窗Dialog组件封装,将用到上篇封装的模态框Modal组件。有时在前台项目中,偶尔要用到一两个常用的组件,如 弹窗&#x…

Linux常⽤服务器构建-samba

目录 1. 介绍 2. 安装 3. 配置 3.1 创建存放共享⽂件的路径 3.2 创建samba账户 4 重启samba 5. 访问共享⽂件 5.1 mac下访问⽅式 5.2 windows下访问⽅式 1. 介绍 Samba 是在 Linux 和 UNIX 系统上实现 SMB 协议的⼀个免费软件,能够完成在 windows 、 mac 操作系统…

6.12ctf练习

[西湖论剑 2022]Node Magical Login 源码在这里:GitHub - CTF-Archives/2022-xhlj-web-node_magical_login: A web challenge in 2022 西湖论剑大赛打开 打开环境是个登录框,先进行了扫描和抓包都没有看见什么有价值的东西,看源码 大致连接…

LeetCode136只出现一次的数字

题目描述 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 解析 需要想到异或运算&#…

【BES2500x系列 -- RTX5操作系统】系列文章索引

💌 所属专栏:【BES2500x系列】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &#x1f49…

如何将asf转换成mp4?教你3种轻松转换方法

如何将asf转换成mp4?ASF是一种视频格式,但在现代的视频编辑和播放中,MP4格式因其广泛的兼容性和高质量的压缩技术而备受欢迎。因此,将ASF转换为MP4格式的需求时常出现。MP4还采用了高效的压缩技术,能在保证视频质量的同…

前端JS必用工具【js-tool-big-box】学习,打开全屏和关闭全屏

这一小节,我们说一下 js-tool-big-box 工具库中,打开全屏和关闭全屏的方法学习。 我们知道,浏览器想打开全屏,按一下 F11 键就可以了,但一来这个功能不一定所有使用的用户都知道,二来在一些例如大屏的需求…

芯片封测从入门到精通

文章目录 📑前言一、作者简介二、书籍亮点三、内容简介四、适读人群 📑前言 在科技日新月异的今天,芯片作为现代电子设备的核心部件,其性能与可靠性直接决定了整个产品的竞争力。而芯片封测,作为确保芯片性能与可靠性…

《Windows API每日一练》4.3 点和线的绘制

理论上,所有的图形设备驱动程序所需要的就是SetPixel函数和GetPixel函数。其余的一切都可以使用在GDI模块中实现的更高层的例程来处理。例如,画一条线,GDI可以不停地调整x和y坐标,然后连续调用多次SetPixel函数来实现。 事实上&a…

了解压电传感器:压电效应

压电加速度计的个关键方面是压电效应。一般来说,压电材料在受到机械应力时可以产生电力。 相反,对压电材料施加电场可以使其变形并产生小的机械力。尽管大多数电子工程师都熟悉压电效应,但有时并没有完全理解这种有趣现象的细节。 更深入地…

电脑剪贴板历史记录查看,让你的信息管理更加有序!

剪贴板是电脑中一个非常实用的功能,允许用户在不同的应用程序之间复制和粘贴文本、图像、文件等内容。然而,默认情况下,剪贴板只能存储最近一次复制的内容,这可能会限制我们的工作效率。幸运的是,电脑剪贴板历史记录查…

水滴式粉碎机:玉米饲料加工的新篇章

在饲料加工业中,玉米作为一种重要的原料,其加工方式直接影响到饲料的品质以及动物对饲料的消化吸收率。近年来,随着科技的进步,越多的环保的饲料加工设备被引入到饲料生产中,其中,水滴式粉碎机以其独特的优…

系统安全(补充)

网闸的“代理”可看成数据“拆卸”,拆除应用协议的“包头和包尾”,只保留数据部分,在内/外网之间只传递净数据容灾技术的主要目的是在灾难发生时保证计算机系统能继续对外提供服务。根据保护对象的不同,容灾可以分为数据容灾和应用…

docker容器基本原理简介

一、docker容器实例运行的在linux上是一个进程 1)、我们通过docker run 通过镜像运行启动的在linux上其实是一个进程,例如我们通过命令运行一个redis: docker run -d --name myredis redis2)、可以看到首先我们本地还没有redis镜…

Aigtek功率放大器参数怎么选型的

功率放大器是电子系统中重要的组成部分,选型合适的功率放大器对系统的性能和可靠性至关重要。本文下面安泰电子将介绍如何选型功率放大器的关键步骤和考虑因素。 首先,确定应用需求。在选型功率放大器之前,确定应用需求是至关重要的第一步。了…

高中数学:数列-等比数列

一、概念 二、通项公式 1、与函数的关系 类似一个指数函数 2、重要性质 三、求和公式 错位相减法 四、练习 例题1 例题2

基于GTX的64B66B编码IP生成(高速收发器二十)

点击进入高速收发器系列文章导航界面 1、配置GTX IP 相关参数 前文讲解了64B66B编码解码原理,以及GTX IP实现64B66B编解码的相关信号组成,本文生成64B66B编码的GTX IP。 首先如下图所示,需要对GTX共享逻辑进行设置,为了便于扩展&a…

如何废掉一个项目经理?

1、缺乏明确的目标和方向: 一个项目经理如果没有清晰的目标和方向,就像一艘没有指南针的船,很容易迷失在茫茫大海中。 解决方案:项目经理需要与上级、客户和团队成员共同制定明确的项目目标,并确保这些目标被充分理解…