Unity3D小工具Unity3D中实现仿真时钟表盘仿原神时钟

Posted 恬静的小魔龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D小工具Unity3D中实现仿真时钟表盘仿原神时钟相关的知识,希望对你有一定的参考价值。

推荐阅读

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

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

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

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


可以当个时钟看。

二、时钟小工具开发

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

资源、 插件、源工程已经上传CSDN,可以自行下载:
https://download.csdn.net/download/q764424567/87404431

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开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

以上是关于Unity3D小工具Unity3D中实现仿真时钟表盘仿原神时钟的主要内容,如果未能解决你的问题,请参考以下文章

虚拟仿真Unity3D中实现鼠标的单击双击拖动的不同状态判断

虚拟仿真Unity3D中实现InputField组件表格Tab或者Enter换行实现

虚拟仿真Unity3D中实现UI跟随3D模型旋转移动UI一直面朝屏幕

虚拟仿真Unity3D中实现UI跟随3D模型旋转移动UI一直面朝屏幕

Unity3D自学记录Unity3D之自制小钟表

Unity3D日常开发Unity3D中实现计时器工具类-正计时倒计时暂停计时加速计时