软件编程
位置:首页>> 软件编程>> C#编程>> 基于Unity3D实现仿真时钟详解

基于Unity3D实现仿真时钟详解

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

标签:Unity3D,时钟

一、前言

今天实现一个时钟工具,其实在之前已经完成了一个简单的时钟工具:【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

0
投稿

猜你喜欢

  • Maven 多profile及指定编译要点项目A依赖项目B,项目A、B都有对应的多个profile,通过mvn –P参数指定profile,
  • 1. Limit实现分页1.1 为什么需要分页 减少数据的处理量1.2 使用Limit实现分页select * from user limi
  • 使用方法 首先在Github或者Gitee上面新建一个仓库复制仓库的链接用idea在本地新建一个demo项目点击菜单栏的VCS,按
  • 一、是什么当下很多公司都采取前后端分离的开发模式,前端和后端的工作由不同的工程师完成。在这种开发模式下,维持一份及时更新且完整的 Rest
  • LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,LRU缓存就是使用这种原理实现,简单的说就是缓存一定量
  • 在很多场景下,maven不能直接访问到外网时,使用代理是其中常见的一种方式。这篇文章整理一下常见的maven中设置代理的方法。代理服务器代理
  • spring中的bean依赖有大体上可以分为两类,共3中形式,下面简单介绍一下。第一类是构造方法中的循环依赖,这种会报错@Servicepu
  • java中引用数据类型有哪些Java中有俩种数据类型,其中主要有8中基本数据类型和引用数据类型,除了8中基本数据类型以外都是引用数据类型,8
  • java里有数字long来表示大的整数,如果两个数字的范围超过了long,要做加法算法怎么做呢?这个问题在面试中经常碰到,如果之前没有经历的
  • 限流背景在早期的计算机领域,限流技术(time limiting)被用做控制网络接口收发通信数据的速率。可以用来优化性能,减少延迟和提高带宽
  • 本文实例讲述了Java创建和启动线程的两种方式。分享给大家供大家参考,具体如下:方式1:继承Thread类步骤:1):定义一个类A继承于ja
  • 在上面的例子中多次使用到了Thread类的join方法。我想大家可能已经猜出来join方法的功能是什么了。对,join方法的功能就是使异步执
  • 也许是本人不才,初识Maven时,被各种不明所以的教程搞得一头雾水,而在后来的使用中,我发现Maven大部分功能没有想象的那么困难。本片文章
  • MyBatis全局配置文件MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(propertie
  • 背景传说里玉皇大帝派龙王马上降雨到共光一带,龙王接到玉皇大帝命令,立马从海上调水,跑去共光施云布雨,但粗心又着急的龙王不小心把海里的鲸鱼随着
  • //     获取国家省市区信息$(document).ready(function(){//从程序
  • 将通用算法放入具体类(HeapSorter),并将通用算法必须调用的方法定义在接口(HeapSorterHandle)中,从这个接口派生出D
  • @requestBody的作用及说明1、@requestBody注解常用来处理content-type不是默认的application/x-
  • 最近在开发的过程当中,对于已有的代码,想将相关类绘制成UML类图,虽然现在有很多UML类图的优秀软件,比如ProcessOn(可视化编辑)、
  • 这篇文章主要介绍了Java方法参数传递机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
手机版 软件编程 asp之家 www.aspxhome.com