基于Unity3D实现仿真时钟详解
作者:恬静的小魔龙 时间:2021-05-24 15:11:34
一、前言
今天实现一个时钟工具,其实在之前已经完成了一个简单的时钟工具:【Unity3D应用案例系列】时钟、钟表小组件开发。
那么,今天的这个小工具跟之前的有啥区别呢?
之前的时钟,是模拟真实时间时针分针秒针的旋转,比如:
可以当个时钟看。
二、时钟小工具开发
今天实现一个可以设置旋转到指定的时间下的表盘,简单说就是时钟定时。
2-1、搭建UI
新建一个Image,命名为Image_Clock(名字随意),作为时针和分针的父节点,设置宽高为512:
在Image_Clock节点下新建Image_Hour和Image_Minute,设置宽高为512:
在它们的节点下分别新建一个Image,设置适合的宽高,位置放到表盘中心:
2-2、实现脚本
新建脚本命名SimClock.cs,双击打开脚本编辑代码:
using UnityEngine;
using System.Collections;
using System;
using UniRx;
public class SimClock : MonoBehaviour
{
/// <summary>
/// 时针
/// </summary>
[SerializeField]
private Transform HourHands;
/// <summary>
/// 分针
/// </summary>
[SerializeField]
private Transform MinuteHands;
/// <summary>
/// 时针的角度
/// </summary>
private Quaternion HourHandsAngle;
/// <summary>
/// 分针的角度
/// </summary>
private Quaternion MinuteHandsAngle;
/// <summary>
/// 是否初始化了
/// </summary>
private bool isInit = false;
/// <summary>
/// 是否停止了
/// </summary>
private bool isStopClock = true;
/// <summary>
/// 初始化
/// </summary>
private void Init()
{
HourHandsAngle = HourHands.rotation;
MinuteHandsAngle = MinuteHands.rotation;
}
private void Start()
{
//设置分钟 和完成的秒数
SetTime(300, 6, () => { Debug.Log("完成"); });
}
/// <summary>
/// 恢复角度
/// </summary>
private void RecoverAngles()
{
HourHands.localEulerAngles = Vector3.zero;
MinuteHands.localEulerAngles = Vector3.zero;
}
/// <summary>
/// 设置时间
/// </summary>
/// <param name="minute">设置分钟数</param>
/// <param name="seconds">完成秒数</param>
/// <param name="onComplete">委托函数</param>
public void SetTime(float minute, float seconds, Action onComplete)
{
if (isInit == false)
Init();
if (isStopClock == false) return;
isStopClock = false;
RecoverAngles();
// 角度 = 分钟 / 60秒转动周数 * 360度
float angles = minute / 60 * 360;
// 转动的角度 = 角度 / 转动秒数 * 0.1秒转动的角度
float interval = angles / seconds * 0.1f;
float count = 0;
IDisposable dispose = null;
dispose = Observable.Interval(TimeSpan.FromSeconds(0.1f)).Subscribe(param => {
MinuteHands.Rotate(Vector3.back, interval);
HourHands.Rotate(Vector3.back, (interval / 360) * (360 / 12));
count += interval;
if (count >= angles)
{
isStopClock = true;
onComplete();
dispose.Dispose();
}
});
}
}
注意:因为脚本用到了UniRx插件,所以需要导入插件,在文章开始提到的资源包中已经有插件了。当然,也可以去https://github.com/neuecc/UniRx/releases下载,然后导入到项目中。
将脚本附到Hiearchy视图的Image_Clock对象上,将时针和分针对象拖进去:
运行后结果:
来源:https://blog.csdn.net/q764424567/article/details/128797083
标签:Unity3D,时钟
0
投稿
猜你喜欢
Spring Boot实现文件上传下载
2021-11-22 21:19:36
Android手机屏幕同步工具asm.jar
2023-10-31 20:01:26
WPF使用DrawingContext实现绘制刻度条
2023-06-19 08:35:17
SpringBoot+SpringSession+Redis实现session共享及唯一登录示例
2023-10-07 07:56:17
Kotlin中的对象表达式和对象声明的具体使用
2022-05-31 04:08:18
浅谈java 增强型的for循环 for each
2023-03-30 18:51:05
Java实现多线程断点下载实例代码(下载过程中可以暂停)
2021-06-09 18:02:41
JSONObject toJSONString错误的解决
2021-09-14 07:17:32
浅谈Java堆外内存之突破JVM枷锁
2022-10-19 19:46:50
Android设置透明状态栏和透明导航栏
2021-09-22 07:19:41
Windows下C#的GUI窗口程序中实现调用Google Map的实例
2022-01-10 10:31:07
Android 定时器实现图片的变换
2021-05-28 00:33:13
android中AutoCompleteTextView的简单用法(实现搜索历史)
2023-01-08 18:33:01
SpringBoot2零基础到精通之数据与页面响应
2022-08-25 22:26:41
如何解决android Toast重复显示
2023-08-19 00:36:56
解析在内部循环中Continue外部循环的使用详解
2023-09-24 08:03:50
C#单例类的实现方法
2023-12-01 02:13:30
java冷知识:javac AbstractProcessor详解
2022-08-01 19:32:09
基于C#技术实现身份证识别功能
2023-10-01 14:16:26
Java在Excel中创建透视表方法解析
2021-11-03 05:49:45