1. 程式人生 > >在 unity 中使用三種簡單的方式實現實時時鐘動畫

在 unity 中使用三種簡單的方式實現實時時鐘動畫

目標
這非常容易實現。你需要寫幾行程式碼就可以實現了。在這篇文章中,我們將實現兩種動畫方式。

效果圖

  1. 數字時鐘型別
  2. 模擬時鐘型別

在開始編碼之前,我想要告訴你一些下面會用到的關於 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 將會獲得每秒的間隔,所以它看上去執行的很流暢。

若果你的遊戲是基於時間的,你想要顯示的實時動畫,那麼這篇文章將可能對你有幫助。

原帖地址: