一、前言
這是Timline學(xué)習(xí)系列的第二篇,本節(jié)內(nèi)容主要講解Timeline基本的工作流程。通過(guò)本章,你將學(xué)會(huì)如何創(chuàng)建Timeline,如何用Timeline來(lái)制作動(dòng)畫,以及使用humanoid動(dòng)畫等知識(shí)。
本章主要包含下列5個(gè)小節(jié)的內(nèi)容:
- 創(chuàng)建Timeline資源和Timeline實(shí)例
- 通過(guò)Infinite clip記錄簡(jiǎn)單動(dòng)畫
- 把Infinite clip轉(zhuǎn)化成Animation Clip
- 創(chuàng)建humanoid動(dòng)畫
- 使用Animation Override Tracks和Avatar Masking
前方多圖預(yù)警,用手機(jī)閱讀的朋友,盡量在wifi環(huán)境下閱讀:)。BTW,圖片資源來(lái)自Unity的官方手冊(cè)。
二、創(chuàng)建Timeline資源和Timeline實(shí)例
要在場(chǎng)景里面使用Timeline資源,要借助Playable Director組件來(lái)關(guān)聯(lián)Timeline資源和GameObject。和Playable Director組件關(guān)聯(lián)后的Timeline資源會(huì)產(chǎn)生一個(gè)Timeline實(shí)例。需要注意的是,擁有Playable Director組件的GameObject必須同時(shí)也要有Animator組件。
在創(chuàng)建Timeline資源的時(shí)候,Timeline也會(huì)自動(dòng)創(chuàng)建Timeline實(shí)例,同時(shí)Timeline編輯器也會(huì)自動(dòng)創(chuàng)建所依賴的其他組件,例如Animator。
你可以通過(guò)下面的步驟來(lái)創(chuàng)建Timeline:
選中場(chǎng)景中的GameObject。
打開Timeline編輯器(菜單:Window > Timeline).如果你選擇的GameObject沒(méi)有PlayableDirector或者PlayerDirector的Playable 還沒(méi)有設(shè)置Timeline資源,那么Timeline編輯器會(huì)提示你點(diǎn)擊Create按鈕。

1.點(diǎn)擊Create. Unity會(huì)彈出一個(gè)對(duì)話框提示你將被創(chuàng)建的Timeline資源的名字和保存路徑。你也可以修改要要保存的路徑和文件名。
2.點(diǎn)擊Save.
前面兩步操作,Unity做了下列事情:
保存Timeline資源到工程。如果你沒(méi)有修改Timeline資源要保存的名字和位置,Timeline資源的默認(rèn)命名將會(huì)使用被選中的GameObject的名字加上“Timeline”為后綴。例如,選中的GameObject的名字是“Enemy”,那么默認(rèn)保存在工程中的Timeline資源的名字叫“EnemyTimeline”
添加一個(gè)空的Animation Track到Timeline資源上
添加一個(gè)Playable Director組件到選中的GameObject上,并且設(shè)置把Playable的屬性設(shè)置成Timeline資源(這樣會(huì)創(chuàng)建Timeline實(shí)例)。
在Playable Director的Bindings中,Animation track被設(shè)置為被選中的GameObject。由于Animation track還沒(méi)有clip,因此被選中的GameObject將靜止不動(dòng)。
添加Animator組件到選中的GameObject上。Animator組件通過(guò)Timeline實(shí)例來(lái)驅(qū)動(dòng)GameObject。
三、通過(guò)Infinite clip錄制簡(jiǎn)單動(dòng)畫
本節(jié)內(nèi)容講解在Timeline中錄制動(dòng)畫。
你可以直接在Animation track里面錄制動(dòng)畫。當(dāng)你直接往一個(gè)空的Animation track錄制動(dòng)畫的時(shí)候,你就創(chuàng)建了一個(gè)Infinite clip.
什么是Infinite clip呢?我們定義為通過(guò)Timeline的編輯器窗口錄制的關(guān)鍵幀動(dòng)畫為Infinite動(dòng)畫。Infinite clip不能修改位置,裁剪,或者分離,這是因?yàn)镮nfinite clip覆蓋了整個(gè)Animation track,沒(méi)有確切的大小。
在創(chuàng)建Infinite clip之前,必須要先為GameObject添加一個(gè)空的Animation track。點(diǎn)擊軌道的中的Record按鈕,開啟動(dòng)畫錄制模式。Record按鈕只適用于用來(lái)制作簡(jiǎn)單的動(dòng)畫,例如立方體,球體,燈光等。如果綁定的是類人形的GameObject,則Record按鈕是不可用的。

當(dāng)Track進(jìn)入錄制模式時(shí),Clip區(qū)域被繪制成紅色,并且提示有“Recording…”的信息。同時(shí)Record按鈕保持閃爍。

在錄制模式下,對(duì)GameObject的動(dòng)畫相關(guān)屬性的任何修改,都會(huì)在Timeline的播放頭(playhead)的位置設(shè)置一個(gè)Key。動(dòng)畫相關(guān)屬性包括transform以及添加到GameObject的所有組件。
創(chuàng)建一個(gè)動(dòng)畫時(shí),首先要把Timeline的播放頭放在第一個(gè)關(guān)鍵幀的位置,然后按下面其中的的一種方法來(lái)操作:
在Inspector窗口中,右鍵點(diǎn)擊屬性的名字,然后選擇Add Key。這個(gè)操作為屬性添加一個(gè)關(guān)鍵幀,但不會(huì)改變它的值。同時(shí)可以看到,一個(gè)白色的菱形出現(xiàn)在infinite clip的播放頭的位置,表示當(dāng)前的Key。
在Inspector窗口中,改變屬性的值。Timeline用修改后的值為屬性添加一個(gè)關(guān)鍵幀到infinite clip。
在場(chǎng)景視圖里面,移動(dòng)、旋轉(zhuǎn)或者縮放GameObject,Timeline將自動(dòng)為修改后的屬性添加一個(gè)關(guān)鍵幀到infinite clip中去。


把播放頭移動(dòng)到Timeline的不同位置,并修改GameObject動(dòng)畫相關(guān)的屬性,在每一個(gè)位置,Timeline編輯器為修改的屬性添加一個(gè)白色的菱形到Infinite clip上,同時(shí)添加對(duì)應(yīng)的動(dòng)畫曲線。
在錄制模式下,你可以右鍵點(diǎn)擊屬性的名字,執(zhí)行一些有用的操作。例如添加一個(gè)key而不修改它的值,切換到前一個(gè)或者后一個(gè)key,刪除key等等。例如,右鍵點(diǎn)擊Position,并在右鍵菜單中選擇Add Key。

再次點(diǎn)擊閃爍的Record按鈕,結(jié)束動(dòng)畫錄制。使用Curves view可以編輯關(guān)鍵幀。另外你也可以雙擊Infinite Clip,然后通過(guò)Animation編輯器來(lái)編輯關(guān)鍵幀。
通過(guò)保存場(chǎng)景和工程來(lái)保存Timeline資源和Infinite clip. Timeline編輯器把關(guān)鍵幀動(dòng)畫從Infinite clip保存成資源。資源命名為“Recorded”并且保存在TimeAsset內(nèi)部。

對(duì)于數(shù)量超過(guò)1個(gè)的Infinite clip的情況下,后面的clip的命名從數(shù)字1開始。例如一個(gè)Timeline資源有3個(gè)已經(jīng)錄制好的Infinite clips,他們的命名為:“Recorded”,“Recored(1)”, 以及“Recored(2)”。需要注意的是:如果刪除一個(gè)Timeline資源,它所包含的所有clips也會(huì)被刪除。
四、把Infinite clip轉(zhuǎn)化成Animation Clip
由于Infinite clip占用了整個(gè)Animation track,因此我們不能裁剪,分離,以及修改位置。如果我們想要執(zhí)行這些操作,首選需要把Infinite clip轉(zhuǎn)化為Animation clip。

點(diǎn)擊Track 菜單圖標(biāo)(紅圈位置)然后選擇Convert to Clip Track。另外也可以右鍵點(diǎn)擊軌道,然后在彈出的菜單里面選擇Convert to Clip Track。

五、創(chuàng)建Humanoid動(dòng)畫
本節(jié)內(nèi)容主要講解通過(guò)Timeline來(lái)驅(qū)動(dòng)一個(gè)人形角色、以及如何匹配Clip的偏移,手動(dòng)調(diào)整Clip偏移,以及創(chuàng)建兩個(gè)Clip的融合來(lái)盡量消除兩個(gè)動(dòng)畫之間的抖動(dòng)和滑步。盡管本節(jié)所舉的例子是使用的人形角色,但是這個(gè)調(diào)整動(dòng)畫的方法是適用于任何GameObject的。
首先我們假設(shè)這里已經(jīng)創(chuàng)建了一個(gè)Timeline實(shí)例,把一個(gè)人形角色的GameObejct綁定到Animation track

從工程里拖拽一個(gè)motion clip到Animation track中來(lái)創(chuàng)建一個(gè)新的Animation clip。例如,拖拽一個(gè)Idle姿態(tài)的動(dòng)畫到Timeline編輯器。

添加第二個(gè)motion clip。在這個(gè)例子中,一個(gè)命名為Run_Left的動(dòng)畫片段被拖拽進(jìn)Animation track.調(diào)整Run_Left的長(zhǎng)度到合適的大小。在例子中,Run_Left調(diào)整為包含一個(gè)循環(huán),因此守衛(wèi)可以一邊跑一邊向左轉(zhuǎn)向。

在播放Timeline實(shí)例的時(shí)候,注意守衛(wèi)的位置在兩個(gè)動(dòng)畫為來(lái)回跳。因?yàn)槭匦l(wèi)在Idle動(dòng)畫結(jié)束時(shí)候的位置和Run_Left開始播放時(shí)的位置不匹配導(dǎo)致的。

要修正這個(gè)問(wèn)題,需要匹配兩個(gè)動(dòng)畫clip的位置偏移。Timeline編輯器提供了幾個(gè)不同的方法來(lái)匹配偏移,在本例中,要實(shí)現(xiàn)第二個(gè)動(dòng)畫匹配第一個(gè)動(dòng)畫的偏移,選中Run_Left clip, 點(diǎn)擊右鍵,然后在彈出的界面中選擇 Match Offsets to Previous Clip


接下來(lái)再一次播放Timeline,盡管位置朝向都已經(jīng)匹配了。我們?nèi)匀豢梢园l(fā)現(xiàn)兩個(gè)動(dòng)畫Clip之間依然有抖動(dòng),這是由于動(dòng)畫在不同的姿態(tài)之間切換。在第idle動(dòng)畫結(jié)束的時(shí)候,守衛(wèi)是保持雙腳并攏的端正站姿。而在Run_Left開始的時(shí)候,守衛(wèi)向前屈身且雙腳是分開的。
通過(guò)創(chuàng)建兩個(gè)動(dòng)畫之間的融合過(guò)渡來(lái)消除抖動(dòng)。通過(guò)調(diào)整clip的大小,讓Clip重疊來(lái)構(gòu)造融合區(qū)域。在本例中,Idle動(dòng)畫和Run_Left動(dòng)畫的過(guò)渡中,Idle動(dòng)畫調(diào)整為延遲到36幀,Run_Left動(dòng)畫拖動(dòng)到從25幀開始。剩下的屬性保留他們的默認(rèn)值。

當(dāng)Idle動(dòng)畫過(guò)渡到Run_Left的時(shí)候,融合消除了兩個(gè)不同姿態(tài)之間的明顯抖動(dòng),身體的大多數(shù)部位的過(guò)渡都很自然。然而還是不完美,因?yàn)樵诓煌恢玫哪_之間混合會(huì)導(dǎo)致不自然的滑步。要修正滑步,你可以手動(dòng)調(diào)整動(dòng)畫Clip的root offset,讓兩個(gè)動(dòng)畫之間的腳的位置盡量地靠攏,以此來(lái)減輕滑步的情況。選中Timeline編輯器中的動(dòng)畫Clip來(lái)手動(dòng)調(diào)整root offset。在Inspector 編輯器窗口中,展開Animation Playable Asset然后展開Clip Root Motion Offsets。

Clip Root Motion Offsets中,位置和旋轉(zhuǎn)都不為0,這是由于之前我們執(zhí)行過(guò)Match Offsets to Previous Clip,已經(jīng)把他們?cè)O(shè)置為和前一個(gè)動(dòng)畫結(jié)束時(shí)的值一樣。
在Clip Root Motion Offsets下面,打開調(diào)整位移和旋轉(zhuǎn)的工具,工具線框繪制在場(chǎng)景視圖中。可以使用下面任一種方法來(lái)調(diào)整動(dòng)畫片段的root offset position。
在在場(chǎng)景視圖中,拖動(dòng)線框
在Inspector窗口中,直接修改成想要的值。

六、使用Animation Override Tracks和Avatar Masking
本節(jié)主要講解如何使用Animaton Override track和Avatar Mask取代Animation track的上半身動(dòng)畫。通過(guò)這個(gè)方法可以用來(lái)在Timeline中實(shí)現(xiàn)例如在跑的同時(shí),同時(shí)揮手的動(dòng)畫表現(xiàn)。
本節(jié)內(nèi)容只展示在TImeline中如何使用Avatar Mask,同時(shí)假設(shè)你已經(jīng)為一個(gè)守衛(wèi)創(chuàng)建了一個(gè)有動(dòng)畫的Timeline實(shí)例,例如跑步動(dòng)畫。

右鍵點(diǎn)擊Animation Track,在彈出的右鍵菜單中選擇Add Override Track。一個(gè)命名為Override 0的Animation Override track關(guān)聯(lián)到被選中的Animation track。需要注意的是,Animation override track不需要綁定GameObject。因?yàn)镺verride track被綁定到上面的Animation track,因此它實(shí)際上是被綁定到的同一個(gè)GameObject:守衛(wèi)。

從項(xiàng)目中拖拽一個(gè)上半身動(dòng)畫到Override track。例如這里我們拖拽一個(gè)站立的同時(shí)揮手的動(dòng)畫(Waving_Arms),同時(shí)把這個(gè)動(dòng)畫的在Timeline中的長(zhǎng)度調(diào)整到和Run_Forward一樣。

播放Timeline,Waving_Arms動(dòng)畫完全覆蓋Run_Forward動(dòng)畫。我們可以通過(guò)給Animation Override track指定一個(gè)Avatar Mask來(lái)實(shí)現(xiàn)把Waving_Arms 動(dòng)畫的上半身和Run_Forward動(dòng)畫的下半身組合到一起。

從工程里面,拖拽AvatarMask到AvatarMask屬性中去,勾選Apply Avatar Mask的按鈕。然后,Avatar Mask圖標(biāo)將會(huì)出現(xiàn)在Track 名字的旁邊。


再次播放Timeline,我們可以到守衛(wèi)的上半身動(dòng)畫來(lái)自Waving_Arms,下半身動(dòng)畫來(lái)自Run_Forward??梢酝ㄟ^(guò)點(diǎn)擊Avatar Mask圖標(biāo)來(lái)臨時(shí)關(guān)閉Avatar Mask。

七、總結(jié)
這是Timeline系列的第二篇,主要講Timeline的基本工作流程的,接下來(lái)的一篇,我會(huì)寫Timline編輯器的相關(guān)具體功能和使用。
BTW:Timeline的官方手冊(cè)早就讀完了,把自己理解的東西通過(guò)文字寫出來(lái),確實(shí)是個(gè)耗時(shí)但是又有趣的事情,希望自己能堅(jiān)持寫作下去。我們?cè)陧?xiàng)目中也有一些Timline的進(jìn)階使用,以后會(huì)專門用一篇文章來(lái)進(jìn)階用法。