基于Unity3D实现仿真时钟详解

作者:恬静的小魔龙 时间:2021-05-24 15:11:34 

一、前言

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

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

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

基于Unity3D实现仿真时钟详解

可以当个时钟看。

二、时钟小工具开发

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

2-1、搭建UI

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

基于Unity3D实现仿真时钟详解

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

基于Unity3D实现仿真时钟详解

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

基于Unity3D实现仿真时钟详解

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实现仿真时钟详解

运行后结果:

基于Unity3D实现仿真时钟详解

来源:https://blog.csdn.net/q764424567/article/details/128797083

标签:Unity3D,时钟
0
投稿

猜你喜欢

  • RabbitMQ延迟队列及消息延迟推送实现详解

    2023-11-15 15:31:31
  • WinForm实现的图片拖拽与缩放功能示例

    2021-06-18 09:17:26
  • 详解JVM之运行时常量池

    2022-08-04 03:41:03
  • Java中计算时间差的方法

    2023-11-15 10:35:44
  • springboot如何使用logback-spring配置日志格式,并分环境配置

    2023-11-10 04:37:34
  • SpringBoot集成Redis的实现示例

    2022-10-22 14:50:33
  • Ajax实现省市区三级联动

    2023-01-14 05:09:58
  • java实战之猜字小游戏

    2022-03-31 14:48:01
  • idea输入sout无法自动补全System.out.println()的问题

    2023-11-28 21:34:03
  • SpringBoot项目为何引入大量的starter?如何自定义starter?

    2022-12-28 21:39:02
  • 如何安装java的运行环境IDEA

    2022-09-20 10:42:38
  • 推荐两款java开发实用工具 hutool 和 lombok

    2022-04-06 10:20:14
  • Java编程经典小游戏设计-打砖块小游戏源码

    2021-07-08 01:17:28
  • Javaweb开发环境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程

    2023-11-15 21:47:05
  • 详解Java匿名内部类

    2023-04-30 14:51:28
  • java8 利用reduce实现将列表中的多个元素的属性求和并返回操作

    2021-09-29 06:53:38
  • 基于Java ActiveMQ的实例讲解

    2023-08-24 08:39:38
  • spring boot多数据源动态切换代码实例

    2022-03-11 00:37:09
  • Java通过PropertyDescriptor反射调用set和get方法

    2023-10-11 19:34:17
  • 为什么不建议使用Java自定义Object作为HashMap的key

    2021-09-21 06:15:05
  • asp之家 软件编程 m.aspxhome.com