首頁 > 軟體

基於Unity3D實現模擬時鐘詳解

2023-02-01 18:00:09

一、前言

今天實現一個時鐘工具,其實在之前已經完成了一個簡單的時鐘工具:【Unity3D應用案例系列】時鐘、鐘錶小元件開發

那麼,今天的這個小工具跟之前的有啥區別呢?

之前的時鐘,是模擬真實時間時針分針秒針的旋轉,比如:

可以當個時鐘看。

二、時鐘小工具開發

今天實現一個可以設定旋轉到指定的時間下的錶盤,簡單說就是時鐘定時。

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時鐘的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com