设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间23 现在时间23 缓存数据 安全感不是来源于爱,而是偏爱。人只有确定自己是那个例外,才能安心。晚安,好梦。

安全感不是来源于爱,而是偏爱。人只有确定自己是那个例外,才能安心。晚安,好梦。

查看: 772|回复: 0

基于Unity3D实现仿真时钟详解

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:176
  • 打卡月天数:0
  • 打卡总奖励:2692
  • 最近打卡:2023-08-27 08:33:59
等级头衔

等級:晓枫资讯-上等兵

在线时间
33 小时

积分成就
威望
0
贡献
430
主题
484
精华
0
金钱
4233
积分
932
注册时间
2022-12-25
最后登录
2023-8-27

发表于 2023-1-31 14:12:53 | 显示全部楼层 |阅读模式
一、前言

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

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

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

2023013016593226.jpg

可以当个时钟看。


二、时钟小工具开发

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


2-1、搭建UI

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

2023013016593227.jpg

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

2023013016593228.jpg

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

2023013016593229.jpg


2-2、实现脚本

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

  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4. using UniRx;

  5. public class SimClock : MonoBehaviour
  6. {
  7.     /// <summary>
  8.     /// 时针
  9.     /// </summary>
  10.     [SerializeField]
  11.     private Transform HourHands;

  12.     /// <summary>
  13.     /// 分针
  14.     /// </summary>
  15.     [SerializeField]
  16.     private Transform MinuteHands;

  17.     /// <summary>
  18.     /// 时针的角度
  19.     /// </summary>
  20.     private Quaternion HourHandsAngle;

  21.     /// <summary>
  22.     /// 分针的角度
  23.     /// </summary>
  24.     private Quaternion MinuteHandsAngle;

  25.     /// <summary>
  26.     /// 是否初始化了
  27.     /// </summary>
  28.     private bool isInit = false;

  29.     /// <summary>
  30.     /// 是否停止了
  31.     /// </summary>
  32.     private bool isStopClock = true;

  33.     /// <summary>
  34.     /// 初始化
  35.     /// </summary>
  36.     private void Init()
  37.     {
  38.         HourHandsAngle = HourHands.rotation;
  39.         MinuteHandsAngle = MinuteHands.rotation;
  40.     }

  41.     private void Start()
  42.     {
  43.         //设置分钟 和完成的秒数
  44.         SetTime(300, 6, () => { Debug.Log("完成"); });
  45.     }

  46.     /// <summary>
  47.     /// 恢复角度
  48.     /// </summary>
  49.     private void RecoverAngles()
  50.     {
  51.         HourHands.localEulerAngles = Vector3.zero;
  52.         MinuteHands.localEulerAngles = Vector3.zero;
  53.     }

  54.     /// <summary>
  55.     /// 设置时间
  56.     /// </summary>
  57.     /// <param name="minute">设置分钟数</param>
  58.     /// <param name="seconds">完成秒数</param>
  59.     /// <param name="onComplete">委托函数</param>
  60.     public void SetTime(float minute, float seconds, Action onComplete)
  61.     {
  62.         if (isInit == false)
  63.             Init();

  64.         if (isStopClock == false) return;

  65.         isStopClock = false;
  66.         RecoverAngles();

  67.         // 角度 = 分钟 / 60秒转动周数 * 360度
  68.         float angles = minute / 60 * 360;
  69.         // 转动的角度 = 角度 / 转动秒数 * 0.1秒转动的角度
  70.         float interval = angles / seconds * 0.1f;
  71.         float count = 0;
  72.         IDisposable dispose = null;

  73.         dispose = Observable.Interval(TimeSpan.FromSeconds(0.1f)).Subscribe(param => {
  74.             MinuteHands.Rotate(Vector3.back, interval);
  75.             HourHands.Rotate(Vector3.back, (interval / 360) * (360 / 12));
  76.             count += interval;
  77.             if (count >= angles)
  78.             {
  79.                 isStopClock = true;
  80.                 onComplete();
  81.                 dispose.Dispose();
  82.             }
  83.         });
  84.     }
  85. }
复制代码

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

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

2023013016593230.jpg

运行后结果:

2023013016593231.jpg

以上就是基于Unity3D实现仿真时钟详解的详细内容,


晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表