经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » unity » 查看文章
基于Unity3D实现仿真时钟详解
来源:jb51  时间:2023/2/1 9:35:32  对本文有异议

一、前言

今天实现一个时钟工具,其实在之前已经完成了一个简单的时钟工具:【Unity3D应用案例系列】时钟、钟表小组件开发

那么,今天的这个小工具跟之前的有啥区别呢?

之前的时钟,是模拟真实时间时针分针秒针的旋转,比如:

可以当个时钟看。

二、时钟小工具开发

今天实现一个可以设置旋转到指定的时间下的表盘,简单说就是时钟定时。

2-1、搭建UI

新建一个Image,命名为Image_Clock(名字随意),作为时针和分针的父节点,设置宽高为512:

在Image_Clock节点下新建Image_Hour和Image_Minute,设置宽高为512:

在它们的节点下分别新建一个Image,设置适合的宽高,位置放到表盘中心:

2-2、实现脚本

新建脚本命名SimClock.cs,双击打开脚本编辑代码:

  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4. using UniRx;
  5.  
  6. public class SimClock : MonoBehaviour
  7. {
  8. /// <summary>
  9. /// 时针
  10. /// </summary>
  11. [SerializeField]
  12. private Transform HourHands;
  13.  
  14. /// <summary>
  15. /// 分针
  16. /// </summary>
  17. [SerializeField]
  18. private Transform MinuteHands;
  19.  
  20. /// <summary>
  21. /// 时针的角度
  22. /// </summary>
  23. private Quaternion HourHandsAngle;
  24.  
  25. /// <summary>
  26. /// 分针的角度
  27. /// </summary>
  28. private Quaternion MinuteHandsAngle;
  29.  
  30. /// <summary>
  31. /// 是否初始化了
  32. /// </summary>
  33. private bool isInit = false;
  34.  
  35. /// <summary>
  36. /// 是否停止了
  37. /// </summary>
  38. private bool isStopClock = true;
  39.  
  40. /// <summary>
  41. /// 初始化
  42. /// </summary>
  43. private void Init()
  44. {
  45. HourHandsAngle = HourHands.rotation;
  46. MinuteHandsAngle = MinuteHands.rotation;
  47. }
  48.  
  49. private void Start()
  50. {
  51. //设置分钟 和完成的秒数
  52. SetTime(300, 6, () => { Debug.Log("完成"); });
  53. }
  54.  
  55. /// <summary>
  56. /// 恢复角度
  57. /// </summary>
  58. private void RecoverAngles()
  59. {
  60. HourHands.localEulerAngles = Vector3.zero;
  61. MinuteHands.localEulerAngles = Vector3.zero;
  62. }
  63.  
  64. /// <summary>
  65. /// 设置时间
  66. /// </summary>
  67. /// <param name="minute">设置分钟数</param>
  68. /// <param name="seconds">完成秒数</param>
  69. /// <param name="onComplete">委托函数</param>
  70. public void SetTime(float minute, float seconds, Action onComplete)
  71. {
  72. if (isInit == false)
  73. Init();
  74.  
  75. if (isStopClock == false) return;
  76.  
  77. isStopClock = false;
  78. RecoverAngles();
  79.  
  80. // 角度 = 分钟 / 60秒转动周数 * 360度
  81. float angles = minute / 60 * 360;
  82. // 转动的角度 = 角度 / 转动秒数 * 0.1秒转动的角度
  83. float interval = angles / seconds * 0.1f;
  84. float count = 0;
  85. IDisposable dispose = null;
  86.  
  87. dispose = Observable.Interval(TimeSpan.FromSeconds(0.1f)).Subscribe(param => {
  88. MinuteHands.Rotate(Vector3.back, interval);
  89. HourHands.Rotate(Vector3.back, (interval / 360) * (360 / 12));
  90. count += interval;
  91. if (count >= angles)
  92. {
  93. isStopClock = true;
  94. onComplete();
  95. dispose.Dispose();
  96. }
  97. });
  98. }
  99. }

注意:因为脚本用到了UniRx插件,所以需要导入插件,在文章开始提到的资源包中已经有插件了。当然,也可以去https://github.com/neuecc/UniRx/releases下载,然后导入到项目中。

将脚本附到Hiearchy视图的Image_Clock对象上,将时针和分针对象拖进去:

运行后结果:

以上就是基于Unity3D实现仿真时钟详解的详细内容,更多关于Unity3D时钟的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号