- 前言
- 【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.Now
,DateTime.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的知识以达到查漏补缺 |