在 unity 中使用三種簡單的方式實現實時時鐘動畫
目標
這非常容易實現。你需要寫幾行程式碼就可以實現了。在這篇文章中,我們將實現兩種動畫方式。
效果圖
- 數字時鐘型別
- 模擬時鐘型別
在開始編碼之前,我想要告訴你一些下面會用到的關於 unity 的知識。
什麼是材質
在 unity 中,材質是用來給一個物件的細節,所以我們可以決定它會看起來像什麼。在大多數情況下,材料將以紋理為引數。
例如,如果你想給牆一個磚塊紋理,那麼你可以拖拽紋理到材質上。在本例中我們不會使用任何紋理,我們只使用顏色屬性。我們有時也會給一個材質兩個或更多的紋理。
什麼是 TimeSpan?
Timespan 將會代表很長的時間。我們可以在 C# 程式中建立或處理 Timespan 例項。
什麼是 DataTime?
DateTime 將會在每一秒給我們一個日期和時間,Timespan 將會在每秒都進行更新,所以它將會給我們實時的輸出效果。
什麼是 Quaternion?
Quaternion 基於複雜的數字,用來表示 3D 旋轉。雖然它比簡單的 3D 向量更難理解,但是它有一些更有用的特性。
什麼是 Quaternion.Euler?
下面的程式碼將會但會返回 rotation。
public Quaternion rotation = Quaternion.Euler(0,30,0);
什麼是 Transform.localRotation?
transform 的旋轉是相對於父 transform 的旋轉。每當你必須旋轉一個物件,並且是子物件,使用這種方法。
Transform.rotation 和 Transform.localRotation 之間的差異是什麼?
如果你的遊戲物件是其他物件父物件那麼用 transform.localrotation 否則使用 Transform.rotation。如果你的遊戲物件沒有父物件那麼使用這這種方法都可以。
第一步 建立基本的工程
建立一個工程
- 開啟 unity
- 點選並建立一個新的工程
- 選擇 3D 工程
- 然後點選建立
- 在工程中視窗中建立 3 個資料夾,分別命名為下面的三個名字
- Assets >> Material
- Assets >> Scene
- Assets >> Scripts
- 現在儲存場景到場景資料夾
- 現在通過點選 Hierarchy 面板,然後選擇 Directional 光照並新增到場景中。Light >> Directional Light.現在工程建立好了,讓我們開始新增一些物件到場景中吧。
第二步 設定場景
2.1 設定層次結構
- 首先在層級檢視中通過滑鼠右鍵,選擇 Create Empty,新增一個空的遊戲物件。
- 重新命名這個物件為 Clock。
- 然後在 Clock 物件上建立 3 個空的子游戲物件,在 Clock 上右鍵選擇 Create Empty。
- 現在讓我們給這個遊戲物件一個有意義的名字吧。分別重新命名為Hour,Minute,Second。
- 然後在每一個我們建立的遊戲物件上在分別建立一個 3D 立方體物件。
看上去應該像下面這樣:
- Hour > Cube
- Minute > Cube
Second > Cube
確保它們的位置都在(0, 0, 0)。
設定 Cube 物件
- 使用這個立方體,我們要顯示時鐘的動畫。
- 為每一個立方體物件使用下面的位置的縮放。
- 首先選擇特定的立方體物件然後在檢視面板中設定這些屬性。
Hour > Cube | Position 0,1,0.5 | **Scale 0.5,2,0.5 |
---|---|---|
Minute > Cube | Position 0,1.5,0 | Scale 0.25,3,0.25 |
Second > Cube | Position 0,2,-0.5 | Scale 0.1,4,0.1 |
做完了上面的操作,看上去會是下面這樣
2.3 為每一個立方體物件設定材質
- 很容易理解,我們不得不改變立方體的顏色,所以我們可以容易的找到哪個立方體對應哪個遊戲物體。
- 所以,你就需要建立材質並應用到立方體上。
- 在材質資料夾上右鍵點選建立 Material
- 我們將要建立3個材質,分辨命名為 Red, Blue 和 Green.
- 現在我門為每一個材質都設定了一個顏色。
- Hour 設定為紅色
- Minute 設定為綠色
- Second 設定為藍色
- 做完這些,它會看起來像下面這樣:
現在
- Hour > Cube: 應用紅色材質。
- Minute > Cube: 應用綠色材質。
- Second > Cube: 應用藍色材質。
## 第三步 動畫指令碼
3.1 建立指令碼
- 進入 Assets >> Script資料夾,右鍵點選並建立一個新的 C# 指令碼。
- 命名為 ClockAnimation。
- 然後雙擊開啟它。
3.2 建立變數
- 首先我們需要 transform 的引用來旋轉物件。
public Transform hourTransform, minuteTransform, secondTransform;
- 旋轉還需要三個 float 型別的變數。
private float degreesInHour, degreesInMinute, degreesInSecond;
- 以及一個 bool 型別的變數,來判斷是模擬還是數字時鐘選中。
public bool analog;
3.3 開始方法
- 在 Start 方法裡,寫下面的程式碼。
- degreesInHour 將表示一小時旋轉多少度。
- degreesInMinute 將表示一分鐘旋轉多少度。
- degreesInSecond 將表示一秒鐘旋轉多少度。
void Start ()
{
degreesInHour = 360 / 12; // rotate 360/12 in hour.
degreesInMinute = 360 / 60; // rotate 360/60 in minute.
degreesInSecond = 360 / 60; // rotate 360/60 in second.
}
3.4 更新方法
現在在 Update 方法裡新增下面的程式碼。每一幀都會呼叫 update 方法。所以使用這個方法來設定時鐘的旋轉。使用 Quaternion.Euler 方法來改變區域性的旋轉。
void Update ()
{
if (analog)
{
TimeSpantimespan = DateTime.Now.TimeOfDay;
hourTransform.localRotation = Quaternion.Euler(0f, 0f, (float)timespan.TotalHours * - degreesInHour);
minuteTransform.localRotation = Quaternion.Euler(0f, 0f, (float)timespan.TotalMinutes * -degreesInMinute);
secondTransform.localRotation = Quaternion.Euler(0f, 0f, (float)timespan.TotalSeconds * -degreesInSecond);
}
else
{
DateTime time = DateTime.Now;
hourTransform.localRotation = Quaternion.Euler(0f, 0f, time.Hour * -degreesInHour);
minuteTransform.localRotation = Quaternion.Euler(0f, 0f, time.Minute * - degreesInMinute);
secondTransform.localRotation = Quaternion.Euler(0f, 0f, time.Second * - degreesInSecond);
}
}
3.5 給指令碼賦值
- 現在拖拽剛剛的指令碼到層級檢視中的 Clock 遊戲物件上。
- 指定指令碼的引用。
完成了!現在儲存工程,然後運行遊戲,你就可以看到實時的始終了。
你可以檢查模擬時鐘的移動,它看上去就像一個簡單的時鐘。
挑戰
1.在這裡,我們已經使用四元數旋轉變換,但有我們可以不使用四元數來完成變換嗎?
2.使用 Timespan 來建立秒錶(Stopwatch)。
3.逆時針旋轉。
總結
所以在這我們可以得出這樣的結論:使用 DataTime 將會獲得秒數,而 Timespan 將會獲得每秒的間隔,所以它看上去執行的很流暢。
若果你的遊戲是基於時間的,你想要顯示的實時動畫,那麼這篇文章將可能對你有幫助。