基于Unity3D實(shí)現(xiàn)仿真時(shí)鐘詳解
一、前言
今天實(shí)現(xiàn)一個(gè)時(shí)鐘工具,其實(shí)在之前已經(jīng)完成了一個(gè)簡(jiǎn)單的時(shí)鐘工具:【Unity3D應(yīng)用案例系列】時(shí)鐘、鐘表小組件開(kāi)發(fā)。
那么,今天的這個(gè)小工具跟之前的有啥區(qū)別呢?
之前的時(shí)鐘,是模擬真實(shí)時(shí)間時(shí)針?lè)轴樏脶樀男D(zhuǎn),比如:
可以當(dāng)個(gè)時(shí)鐘看。
二、時(shí)鐘小工具開(kāi)發(fā)
今天實(shí)現(xiàn)一個(gè)可以設(shè)置旋轉(zhuǎn)到指定的時(shí)間下的表盤,簡(jiǎn)單說(shuō)就是時(shí)鐘定時(shí)。
2-1、搭建UI
新建一個(gè)Image,命名為Image_Clock(名字隨意),作為時(shí)針和分針的父節(jié)點(diǎn),設(shè)置寬高為512:
在Image_Clock節(jié)點(diǎn)下新建Image_Hour和Image_Minute,設(shè)置寬高為512:
在它們的節(jié)點(diǎn)下分別新建一個(gè)Image,設(shè)置適合的寬高,位置放到表盤中心:
2-2、實(shí)現(xiàn)腳本
新建腳本命名SimClock.cs,雙擊打開(kāi)腳本編輯代碼:
using UnityEngine; using System.Collections; using System; using UniRx; public class SimClock : MonoBehaviour { /// <summary> /// 時(shí)針 /// </summary> [SerializeField] private Transform HourHands; /// <summary> /// 分針 /// </summary> [SerializeField] private Transform MinuteHands; /// <summary> /// 時(shí)針的角度 /// </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() { //設(shè)置分鐘 和完成的秒數(shù) SetTime(300, 6, () => { Debug.Log("完成"); }); } /// <summary> /// 恢復(fù)角度 /// </summary> private void RecoverAngles() { HourHands.localEulerAngles = Vector3.zero; MinuteHands.localEulerAngles = Vector3.zero; } /// <summary> /// 設(shè)置時(shí)間 /// </summary> /// <param name="minute">設(shè)置分鐘數(shù)</param> /// <param name="seconds">完成秒數(shù)</param> /// <param name="onComplete">委托函數(shù)</param> public void SetTime(float minute, float seconds, Action onComplete) { if (isInit == false) Init(); if (isStopClock == false) return; isStopClock = false; RecoverAngles(); // 角度 = 分鐘 / 60秒轉(zhuǎn)動(dòng)周數(shù) * 360度 float angles = minute / 60 * 360; // 轉(zhuǎn)動(dòng)的角度 = 角度 / 轉(zhuǎn)動(dòng)秒數(shù) * 0.1秒轉(zhuǎn)動(dòng)的角度 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(); } }); } }
注意:因?yàn)槟_本用到了UniRx插件,所以需要導(dǎo)入插件,在文章開(kāi)始提到的資源包中已經(jīng)有插件了。當(dāng)然,也可以去https://github.com/neuecc/UniRx/releases下載,然后導(dǎo)入到項(xiàng)目中。
將腳本附到Hiearchy視圖的Image_Clock對(duì)象上,將時(shí)針和分針對(duì)象拖進(jìn)去:
運(yùn)行后結(jié)果:
以上就是基于Unity3D實(shí)現(xiàn)仿真時(shí)鐘詳解的詳細(xì)內(nèi)容,更多關(guān)于Unity3D時(shí)鐘的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#基于SerialPort類實(shí)現(xiàn)串口通訊詳解
這篇文章主要為大家詳細(xì)介紹了C#基于SerialPort類實(shí)現(xiàn)串口通訊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01c# 編寫一個(gè)輕量級(jí)的異步寫日志的實(shí)用工具類(LogAsyncWriter)
這篇文章主要介紹了c# 如何編寫一個(gè)輕量級(jí)的異步寫日志的實(shí)用工具類(LogAsyncWriter),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03C#簡(jiǎn)單查詢SQLite數(shù)據(jù)庫(kù)是否存在數(shù)據(jù)的方法
這篇文章主要介紹了C#簡(jiǎn)單查詢SQLite數(shù)據(jù)庫(kù)是否存在數(shù)據(jù)的方法,涉及C#調(diào)用SQLite組件及針對(duì)SQLite數(shù)據(jù)庫(kù)基本的連接、查詢、關(guān)閉等使用技巧,需要的朋友可以參考下2016-07-07C#實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能(窗體)
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01C# ThreadPool之QueueUserWorkItem使用案例詳解
這篇文章主要介紹了C# ThreadPool之QueueUserWorkItem使用案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08C#中的XML與JSON數(shù)據(jù)處理的案例詳解
在現(xiàn)代軟件開(kāi)發(fā)中,數(shù)據(jù)交換和存儲(chǔ)的需求日益增長(zhǎng),而 XML 和 JSON 成為了兩種最常用的數(shù)據(jù)格式,它們各有特點(diǎn),在不同的場(chǎng)景下有著各自的優(yōu)勢(shì),本文將從 C# 的角度出發(fā),探討如何處理這兩種數(shù)據(jù)格式,并分享一些常見(jiàn)的問(wèn)題及解決方法,需要的朋友可以參考下2024-09-09