Unity學(xué)習(xí)筆記 Vol.70 使用動畫綁定(Animation Rigging)制作程序化的角色動畫
摘要
????這節(jié),我們接著上一節(jié)繼續(xù)研究動畫綁定的內(nèi)容。詳細(xì)教程請參考官方視頻。

教程

????我們將學(xué)習(xí)如何使用動畫綁定(Animation? Rigging)包,為人物添加動畫 ,使用人物更具動態(tài),使骨架能程序化地查看周圍、看看關(guān)注點(diǎn)。場景中有兩個人物,他們都帶有骨架和閑置動畫,我們希望兩人閑置時可以到處看,讓人物更有生氣、更加有趣。我們可通過制作額外的動畫剪輯、切換動畫來實現(xiàn),不過還有個更簡單的方法。

????其實,我們可使用動畫綁定(Animaiton Rigging)工具來控制人物的身體部位,在播放閑置動畫的同時,疊加上頭部的位置變化。首先,我們需要在Package Manager中,將動畫綁定(Animation Rigging)包安裝到項目中。維京人已經(jīng)會到處看了,但弓箭手還是只盯著一個方向,那么我們先讓弓箭手在站著的時候能往四處看。

????我們首先需要為人物裝好動畫綁定(Rigging)工具,在人物根對象上添加Rig Builder組件,為了方便使用骨架,我們可以添加Bone Renderer腳本和骨骼的Transform來可視化骨架。


????新建一個頭部骨架(Head Rig),添加到Rig Builder中。

????關(guān)于使用動畫綁定(Animation Rigging)制作人物骨架的更多信息??刹榭创饲爸谱鞯幕A(chǔ)知識教學(xué),上一節(jié)有相關(guān)的內(nèi)容。
????接著,我們需要控制頭部的轉(zhuǎn)向,可使用Multi-Aim Constraint組件實現(xiàn),Mullti-Aim? Constraint組件,可以讓游戲?qū)ο筠D(zhuǎn)向場景中特定的點(diǎn)。

????在骨架中,新建游戲?qū)ο螅Q為Head Aim,添加Multi-Aim Constraint組件。

????在Aim的Transform中新加一個游戲?qū)ο螅Q為AimTarget,將其稍微拖到人物的前方,再添加一個效果器,來可視化目標(biāo)位置。

????在Multi-Aim Constraint組件中,將人物骨架的頭部Transform拖入作為Constrainted Object。

????將Aim Axis設(shè)為前方向,即在下拉菜單中選擇z,接著,將AimTarget設(shè)為源對象(Source Object),讓HeadTarget看到AimTarget。

????現(xiàn)在進(jìn)入Play模式,四處拖動Aim Target對象,閑置動畫依舊會在人物上播放,頭部則同時會向著AimTarget轉(zhuǎn)動。現(xiàn)在我們能控制人物閑置時的視線位置了,你可以通過為目標(biāo)添加動畫,來制作簡單的頭部動畫。

????但我已經(jīng)編寫了一個閑置動畫控制腳本,可隨時間推移隨機(jī)移動目標(biāo)位置,這下頭部每秒就會隨機(jī)轉(zhuǎn)動,為人物添加更多生氣,動畫已經(jīng)很不錯了,但人物的眼睛仍舊是靜止的,如果能讓眼睛獨(dú)立于頭部運(yùn)動,人物可以更加活靈活現(xiàn)。

????在骨架中新建游戲?qū)ο?,稱為 Eye Aim,在其中為每只眼添加游戲?qū)ο?,接著為左眼添加Multi-Aim? Constraint組件,將人物骨架中的左眼設(shè)為Constraint Object,將Aim Axis設(shè)為z,將頭部的Aim Target設(shè)為Source Object。

????右眼的操作相同,不過Aim Axis需要設(shè)為z,這時播放場景并沒有什么變化,這是因為眼睛和頭部的IK權(quán)重是相同的,兩者在跟蹤目標(biāo)時的移動距離是相同的。

????不過,如果我們選中頭部游戲?qū)ο?,在檢視器中更改權(quán)重,注意頭部回到了閑置位置,而眼睛依舊會鎖定 Aim Target四處轉(zhuǎn)動,如果將權(quán)重設(shè)為0.755,頭部依舊會向Aim Target移動,但速度要比眼睛慢得多,這種效果雖然不起眼,但可以為人物多添加一點(diǎn)生氣。另一種使用該功能添加人 物生氣的方法,是創(chuàng)建關(guān)注點(diǎn)(Point of Insterest)。目前,弓箭手并不會注意到維京人,如果他能關(guān)注到任何附近角色就好了,我希望弓箭手的Aim Position,在兩者之者的距離小于一定范圍時,可以盯著維京人的頭。

????我們可以為弓箭手添加簡單的overlapsphere計算,將維京人的頭作為關(guān)注點(diǎn)來實現(xiàn),我在弓箭手上編寫了一個稱為Look At Nearby腳本。

????腳本會執(zhí)行一個簡單的OverlaspSphere計算,以人物頭部為中心點(diǎn)向外輻射一定的半徑,為人物添加一個球型的視區(qū),來搜尋所有附近的碰撞體。

????腳本接著檢查球型視區(qū)中是否有碰撞體,如果有則檢查其是否帶有Point of Interest組件。

????Point of Interest組件是一個最簡單的組件,僅儲存一個瞄準(zhǔn)用的目標(biāo)Transform。

????當(dāng)Point of Insterest被指定到維京人上時,Look At Nearby腳本,會將Aim Target移向Point of Interest目標(biāo),當(dāng)目標(biāo)不再可見,Look At腳本會將目標(biāo)位置重設(shè)為原點(diǎn)。

????在弓箭手上,我們指定頭部Transform來配置好功能,確保型視區(qū)能從正確的高度投射出來。

????將Aim Target的Transform指定到弓箭手的骨架。

????暫時禁用Aim Idle腳本,防止與Look At Nearby腳本沖突。

????我在腳本中使用了OnDrawGizmo函數(shù),來在場景中可視化球型視區(qū)。

????我們來將Vision Radius設(shè)為1.25。

????將Lerp Speed設(shè)為20。

????接著我們只需將維京人設(shè)為人物的關(guān)注點(diǎn)就行了。如果我們將維京人設(shè)為碰撞體,添加Point of Interest組件,就能把頭部設(shè)定為視線的目標(biāo)。播放場景,當(dāng)維京人走過弓箭手時,弓箭手會盯著維京人,當(dāng)兩者距離夠遠(yuǎn),維京人走出視錐時,弓箭手頭部會返回到起始位置。

????我們也能為附近的對象添加Point of Interest腳本,讓人物能盯著它看。

????可以看到,動畫綁定(Animation Rigging)可為游戲制作更多動態(tài)人物,人物間可以相互互動,讓場景更具生氣。