在開發遊戲的過程中,為了讓遊戲更加生動,我們一定會在角色上加上動畫,最常見的有走路、跑步、跳躍等等。
一般來說,我們只要將調好的動畫素材套用到Unity的Animator上,人物就可以根據動畫檔調整好的節點播放指定動畫。然而這些動作只是最基本的而已,如果遊戲中有更多複雜的操作,那我們就勢必得加入相應的動畫。

一般動畫有什麼難點

對於跑跳這類,不太需要跟角色本身以外的物體互動的動作來說,直接撥放事先錄製好的動畫檔就可以輕鬆滿足需求,同時也有很好的效果。
但是對於像是FPS遊戲中的持槍,動作遊戲中的攀爬等,這些需要與其他物體互動的動作來說,顯然使用事先錄製好的動畫檔的效果就會不理想,因為我們總不可能在錄製動畫檔時,就事先知道這些物體在遊戲開始後的位置,對吧。

如何解決?

因此,為了能讓角色的動作看起來更生動自然,我們希望動畫可以動態的根據目標物體進行調整。
也就是角色的手會根據槍的位置,或是牆壁上的頂點來移動。
要做到這個效果就必須學習反向運動學(Inverse Kinematics,簡稱IK)技術!

正向運動學FK v.s. 反向運動學IK

竟然叫做反向運動學,就代表一定有正向運動學(Forward Kinematics,簡稱FK)。
FK其實就是我們一般情況下使用的動畫,運動時是由模型的父節點帶動子節點,也就是如果我們移動了角色的手臂,手臂下的手肘、手掌、手指都會連帶一起移動,非常的直觀。
而IK就是整個反過來,運動時是由模型的子節點反向帶動父節點,也就是如果我們移動了手掌,手掌就會反向的帶動手肘、手臂移動。
因此我們就可以利用IK反向帶動父節點的特性,來讓指定物體帶動希望移動的部位,做出更逼真的動畫。

在Unity中實現IK的方法

現在想在Unity中實現IK非常的簡單,也有很多方式可以選擇。
像是Unity Avator就有自帶的IK系統,可以透過程式碼實現腳貼在地板上、頭的轉向等等功能。
Asset Store上也有很多強大的IK套件,最著名的非Final IK莫屬,雖然是不便宜的付費套件,但卻能做到非常細微IK控制,許多動畫大師都會使用他。
不過今天要介紹的是Unity近幾年推出的免費官方IK套件,Animation Rigging。
Animation Rigging 可以很簡單的對角色骨架設置約束(Constraint),讓指定的部位跟隨指定物體移動,幫助我們這些即便不是專業動畫師的開發者,也能方便的製作高品質的角色動畫。

安裝Animation Rigging

使用Unity 2019後的版本,在Package Manager搜尋Animation Rigging 安裝就可以了。
安裝完就會看到工具列出現Animation Rigging 的菜單。

基本介紹

在使用Animation Rigging之前,要先了解一些基本的元件,以及他們的結構。
首先我們要先認識Animation Rigging的3個最基本的元件,Rig Builder、Rig、Constraints

  • Rig Builder: 使用Animation Rigging最核心的元件,負責控制所有Rig,必須要跟Animator放在同一個物件下。
  • Rig: 可以存放一個或多個Constraints的容器,並可以調整weight權重,控制Constraints影響整體動畫的比例。
  • Constraints: 動作的約束,也就是設定IK的元件,所有的IK效果都是透過這個元件實現。Animation Rigging提供多個Constraint元件,來實現各種不同的IK效果。


他們三者的階層關係必須是

  • Rig Builder要放在跟Animator同一個物件(根物件)
  • Rig要放在Rig Builder的子物件以下
  • Constrains要放在Rig的子物件以下

有了最基本概念之後,就可以開始使用Animation Rigging來製作IK動畫了。

準備

首先要準備一個角色模型跟動畫檔。這次範例使用的角色模型是Steven做的人物,動畫素材則是Asset Store上的Basic Motions FREE
這裡大家可以隨意使用自己喜歡的模型與動畫素材,只要是標準的骨架就可以了。
因為Animation Rigging需要依賴Animator配合使用,所以也要先幫角色加入Animator元件。然後這個Animator Controller就是單純的循環撥放Idle動畫。

註:Player底下的Amature與Body是模型自帶的骨架與皮膚。

開始使用

那我們第一個來做的IK就是讓角色的頭可以看向指定物體,要做到這個效果可以透過Multi Aim Constraint元件來實現。

設置Rig Builder與Rig

首先我們要先在有Animator的Player物件下新增Rig Builder,因為前面有提到Rig Builder是Animation Rigging最核心的元件,所以要先加入才可以使用後續的功能。

再來是負責存放Constraint的Rig組件,我們可以在Player物件底下新增一個空物件,叫做Head Rig(名稱隨意),並新增Rig元件。

新增後會看到Rig提示我們這個Rig元件還沒有跟Rig Builder關聯起來,我們可以回到Player物件,將Head Rig拖進Rig Builder裡面,如此一來Rig Builder就可以控制Head Rig了。

Multi Aim Constraint

接著在Head Rig物件下再新增一個空物件,叫做Multi Aim Constraint(名稱隨意),並新增Multi Aim Constraint元件。

這個元件顧名思義,就是用來做瞄準動作的約束,最常見的使用場景就是即將要做的角色的頭看向指定物體的IK效果。
然後在Head Rig下再新增一個空物件,叫做Head Target(名稱隨意),用來當作角色要看向的物體,並把這個物體拖進Multi Aim Constraint元件的Source Objects中。

這個Head Target不一定要放在Head Rig物件底下,只是為了方便管理選擇放這裡而已。
下一步要將被約束的骨頭放進Constrainted Object裡面,也就是角色的頭的骨頭。

設定好後,就可以按下Play執行遊戲,在場景中拖動Head Target物件,就會看到我們角色的頭會一直看向這個物件囉!

註:如果在Play模式下,調整Head Target到你想要的位置後,要記得複製一下他的座標數值,不然結束Play後就會還原到原本的位置喔。

Two Bone IK Constraint

接下來介紹Two Bone IK Constraint,顧名思義,就是控制兩個骨頭IK的元件,使用場景是最常見的手部或腳部IK,像是角色要拿場景上的物品、FPS遊戲中的持槍、人物上樓梯腳會貼在階梯上、攀爬的效果等等,可以說是應用非常廣泛的元件。
一樣在Player物件下新增一個空物件,叫Hand Rig(名稱隨意),並新增Rig元件,然後跟Rig Builder關聯起來。

然後在Hand Rig下新增叫Right Hand Constraint(名稱隨意)的空物件,並新增Two Bone IK Constraint
元件。

這個元件比較特別,需要3個被約束的骨頭,同時也需要2個Source Object。
3個被約束的骨頭Root、Mid、Tip,必須在骨架中是相連的父子關係,像是手臂、手肘、手掌或是大腿、小腿、腳掌。
這裡我們就將Player的手臂、手肘、手掌分別放進Root、Mid、Tip。

2個Source Object Target、Hint,分別是控制Tip與Mid骨頭位置的參考物件,這裡一樣在Hand Rig底下新增兩個空物件,Hand Target與Hand Hint,然後放進去Target、Hint。

Hand Target與Hand Hint也是不一定要放在Hand Rig物件底下,一樣只是為了方便管理選擇放這裡而已。
設定完後,按下Play進入遊戲後,拖動Hand Target與Hand Hint看看效果。

註:如果在Play模式下,調整Hand Target與Hand Hint到你想要的位置後,要記得複製一下他們的座標數值,不然結束Play後就會還原到原本的位置喔。

Multi Rotation Costraint

最後來介紹Multi Rotation Costraint,顧名思義,這就是一個可以控制骨頭旋轉量的元件,可以在像是需要讓角色彎腰的情況使用。
還是一樣先在Player下新增空物件,叫Spine Rig(名稱隨意),新增Rig元件後與Rig Builder關聯起來。

在Spine Rig下新增空物件,叫Multi Rotation Costraint(名稱隨意),新增Multi Rotation Costraint元件。

然後在Spine Rig下再新增空一個物件Spine Target(名稱隨意),拖進Multi Rotation Costraint元件的Source Object。

接著設定要被約束的骨頭,就是角色的腰,把角色骨架中的spine02拖進Constrained Object裡面。

設定完後就可以Play進入遊戲,旋轉Spine Target看看效果囉!

註:如果在Play模式下,調整Spine Target到你想要的旋轉量後,要記得複製一下他的旋轉量值,不然結束Play後就會還原到原本的位置喔。

到這裡我們介紹了3個常用的Constraints,當然Animation Rigging還有其他好用的Constraints,像是Multi Position Constraint,使用上都大同小異,非常好上手。
另外如果想做更細微的控制的話,大家也可以自己調整看看這些Constraints的參數,像是權重、偏移量等等,官方文檔中也有完整的資料可以參考。

其他

Rig Transform

有的時候我們可能會把Source Object物件放在某個物件底下,並希望在移動這個物件的時候,也能夠控制IK動畫,但這是行不通的。

如果我們也想要可以藉由這個物件控制IK動畫的話,就需要在這個物件上新增Rig Transform元件。

新增Rig Transform元件後,這個物件就也可以控制IK動畫囉!

Bone Renderer

在我們對骨頭設置約束時,需要一層一層點開角色模型的骨架,這樣非常不方便,因此Animation Rigging提供Bone Renderer元件,讓我們可以看到角色的骨架,並且只需要點擊骨頭,就可以直接選中。
首先,選中角色的根物件,也就是Player,然後在Animation Rigging菜單中選擇Bone Renderer Setup,就會發現Player自動新增了Bone Renderer元件,並在Editor中顯示出藍色的骨架輪廓。

使用Animation Rigging的注意事項

注意在Rig Builder底下所有的子物件,及所有的後代物件的名稱不可以重複,不然會報錯。

總結

製作3D遊戲中,角色動畫往往都是成本非常高同時也是最重要的環節之一,任何一個小動作的動畫背後都需要大量的時間及專業知識,一般的獨立開發者通常只能望而卻步。
但隨著遊戲開發的技術日趨成熟,現在只需要熟悉掌握IK套件,任何人都可以更輕鬆地做出高品質的動畫,讓我們的遊戲更加生動!

__END__