温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

基于Unity3D如何实现仿真时钟

发布时间:2023-02-01 09:55:15 来源:亿速云 阅读:122 作者:iii 栏目:开发技术

本篇内容介绍了“基于Unity3D如何实现仿真时钟”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

时钟小工具开发

1、搭建UI

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

基于Unity3D如何实现仿真时钟

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

基于Unity3D如何实现仿真时钟

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

基于Unity3D如何实现仿真时钟

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插件,所以需要导入插件。

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

基于Unity3D如何实现仿真时钟

运行后结果:

基于Unity3D如何实现仿真时钟

“基于Unity3D如何实现仿真时钟”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI