一、前言今天实现一个时钟工具,其实在之前已经完成了一个简单的时钟工具:【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对象上,将时针和分针对象拖进去:
运行后结果:
以上就是基于Unity3D实现仿真时钟详解的详细内容,
|