原文:Unreal Engine 4 Animation Tutorial
作者:Tommy Tran
譯者:Shuchang Liu
在本篇教程中,你將學(xué)習(xí)導(dǎo)入,使用動畫資源。
你會發(fā)現(xiàn),現(xiàn)在基本沒有游戲是不需要用到動畫的,因為動畫是表現(xiàn)動作的關(guān)鍵。沒有動作,角色奔跑看起來就不像在奔跑,而是在滑行。
Unreal的動畫系統(tǒng)做的很優(yōu)秀,能使開發(fā)者在短時間內(nèi)完成角色動畫。
在本篇教程中,你將能學(xué)會:
- 導(dǎo)入帶有骨骼的網(wǎng)格資源
- 導(dǎo)入動畫資源
- 創(chuàng)建動畫藍圖,實現(xiàn)不同動畫的切換
- 實現(xiàn)動畫切換的平滑過渡
請注意,本篇教程涉及藍圖部分內(nèi)容。如果你需要復(fù)習(xí)有關(guān)內(nèi)容,請查看藍圖教程。
注意:本篇教程只是Unreal Engine 4系列教程的其中一篇:
起步入門
下載示例項目并解壓。在文件根目錄,可以看到名為Animation Assets的文件夾。這個文件夾里有我們需要引入的角色和動畫資源。
進入項目文件夾,雙擊SkywardMuffin.uproject打開項目。
注意:如果你看到了項目是由較早的引擎版本創(chuàng)建的提示,這很正常(因為引擎經(jīng)常更新版本)。你可以選擇以拷貝副本的形式打開,也可以直接轉(zhuǎn)換項目版本打開。
按下Play可以運行游戲。游戲玩法是盡可能踩著天空云朵往上跳躍,同時避免掉落地面,點擊左鍵跳躍地面。
我們要用一只可愛的蘑菇小人來替換游戲里的紅色球形:
蘑菇小人帶有一套骨架用于動畫表演。
什么是骨架?
在3D軟件里,一套骨架是一組彼此連接的關(guān)節(jié)點集合。比如下圖的每個球體都是一個關(guān)節(jié)。
注意: Unreal里有時也用骨骼來指代關(guān)節(jié),兩者意思相同。
通過操控關(guān)節(jié),角色可以擺出了不同的姿勢。
當(dāng)角色從一個姿勢切換到另一個姿勢,動畫就產(chǎn)生了。
當(dāng)角色反復(fù)切換前后兩個姿勢,我們可以看到這樣的動畫:
在Unreal中,任何帶有骨架的網(wǎng)格稱之為骨架網(wǎng)格。首先我們先導(dǎo)入蘑菇小人的骨架網(wǎng)格。
導(dǎo)入骨架網(wǎng)格
在Content Browser打開Characters\Muffin,點擊Import,在選擇面板打開SkywardMuffinStarter\Animation Assets目錄,選擇SK_Muffin.fbx并點擊Open。
在導(dǎo)入窗口中,取消勾選Mesh設(shè)置的Create Physics Asset選項。Physics Asset是Unreal用于創(chuàng)建ragdoll(布娃娃)效果的組件,由于教程并不需要這種效果,這里就不勾選了。
由于項目已經(jīng)導(dǎo)入了蘑菇的材質(zhì)和貼圖,所以不用再次引入了。取消勾選Import Materials和Import Textures選項。
其他設(shè)置保持默認(rèn)不變,點擊Import,Unreal將創(chuàng)建以下資源:
- SK_Muffin:骨架網(wǎng)格資源,基本上這是一個鏈接上骨架資源的網(wǎng)格資源。
- SK_Muffin_Skeleton:骨架資源,帶有關(guān)節(jié)列表及其層級信息。
現(xiàn)在你已經(jīng)導(dǎo)入了蘑菇資源,接著看怎么使用它們。
使用骨架網(wǎng)格
在我們使用骨架網(wǎng)格之前,需要先給它加上材質(zhì),否則它只是個灰色模型。雙擊SK_Muffin打開它。
查看Asset Details面板Material Slots部分設(shè)置,將材質(zhì)指定為M_Muffin然后關(guān)閉SK_Muffin。
現(xiàn)在需要將SK_Muffin設(shè)置為玩家角色,在Content Browser 雙擊BP_Muffin.
在Components面板選中Mesh (Inherited)組件,在Details面板的Mesh設(shè)置里,將Skeletal Mesh屬性設(shè)置為SK_Muffin。
點擊Compile并回到主編輯器。按下Play用蘑菇小人體驗游戲!
游戲感覺好多了!下一步要做的是給蘑菇小人加上一些動畫表現(xiàn),讓它變得活靈活現(xiàn)。
導(dǎo)入動畫
在Content Browser點擊Import,在選擇面板打開SkywardMuffinStarter\Animation Assets目錄,選擇以下文件:
- SK_Muffin_Death.fbx
- SK_Muffin_Fall.fbx
- SK_Muffin_Idle.fbx
- SK_Muffin_Jump.fbx
- SK_Muffin_Walk.fbx
選中并點擊Open。
在導(dǎo)入窗口中,取消勾選Mesh設(shè)置的Import Mesh選項,避免重復(fù)導(dǎo)入骨架網(wǎng)格。
接著,確保Skeleton屬性設(shè)置成SK_Muffin_Skeleton,這個設(shè)置指定了動畫會應(yīng)用在哪個骨架上。
最后,點擊Import All,就成功導(dǎo)入剛才選中的那些動畫了。
現(xiàn)在,我們已經(jīng)有了所有動畫資源了,還需要找到方法播放它們。我們可以通過動畫藍圖(Animation Blueprint)來完成這件事。
創(chuàng)建動畫藍圖
動畫藍圖很像普通的藍圖。然而,它還有一個專門用于完成動畫任務(wù)的圖表。
首先在Content Broswer點擊Add New按鈕,選擇Animation\Animation Blueprint創(chuàng)建動畫藍圖。
在彈出窗口里,找到Target Skeleton屬性并選擇SK_Muffin_Skeleton,然后點擊OK按鈕創(chuàng)建動畫藍圖。
將新建資源命名為ABP_Muffin。接著雙擊資源打開動畫藍圖編輯器。
動畫藍圖編輯器
動畫藍圖編輯器跟藍圖編輯器非常相像,不過額外多了4個面板:
- Anim Graph:這個圖表專門用于處理動畫,在這里可以播放你的動畫
- Preview Scene Settings:這個面板用于調(diào)整預(yù)覽場景的參數(shù)
- Anim Preview Editor:你所創(chuàng)建的變量會展示在這里,利用這個面板可以實時看到動畫的變量值
- Asset Browser:這個面板展示了一組當(dāng)前可用的動畫列表
為了確定每個動畫的播放時機,我們可以使用狀態(tài)機(State Machine)。
什么是狀態(tài)機?
狀態(tài)機本質(zhì)是一組狀態(tài)和規(guī)則的集合。在本篇教程中為了方便理解,你可以認(rèn)為每個狀態(tài)都是一個動畫。
狀態(tài)機在任一時刻都只能處于一種狀態(tài)下,要從一種狀態(tài)切換到另一種狀態(tài),必須滿足其切換條件。
下圖是一個簡單的狀態(tài)機例子,它展示了跳躍狀態(tài),其與其他狀態(tài)切換的規(guī)則條件。
狀態(tài)切換還可以是雙向的。如下圖所示,跳躍和下落狀態(tài)可以互相切換。
如果沒有這種雙向關(guān)系,角色就沒辦法實現(xiàn)空中二段跳了,因為角色只有在地面站立狀態(tài)下才能切換到跳躍狀態(tài)。
關(guān)于狀態(tài)機簡單了解到這里就足夠了。下面來動手創(chuàng)建一個狀態(tài)機。
創(chuàng)建狀態(tài)機
確保界面處于Anim Graph,右鍵點擊空白區(qū)域,從彈出菜單中選擇Add New State Machine。
這樣圖表上會多出一個狀態(tài)機節(jié)點,將其重命名為Locomotion。隨后,連接Locomotion狀態(tài)機與Final Animation Pose節(jié)點。
現(xiàn)在,Locomotion狀態(tài)機就能直接影響蘑菇小人的動作表現(xiàn)了。
接著,雙擊打開Locomotion狀態(tài)機,可以看到狀態(tài)機內(nèi)部有個Entry節(jié)點。
任何與之相連的節(jié)點就是默認(rèn)狀態(tài)。在本篇教程中,默認(rèn)狀態(tài)就是站立動畫。在圖表空白處右鍵點擊,從彈出菜單中選擇Add State,將其重命名為Idle。
現(xiàn)在,連接Entry節(jié)點與Idle狀態(tài)。拖拽Entry引腳至Idle狀態(tài)的灰色區(qū)域,釋放鼠標(biāo)進行連接。
當(dāng)我們用彈出菜單創(chuàng)建狀態(tài)后,它其實還沒有關(guān)聯(lián)任何動畫,下面來做下動畫關(guān)聯(lián)。
動畫關(guān)聯(lián)狀態(tài)
雙擊打開Idle狀態(tài)。
為了關(guān)聯(lián)動畫,在Asset Browser 拖拽SK_Muffin_Idle動畫至圖表的空白處添加動畫。
接著,連接Play SK_Muffin_Idle節(jié)點與Final Animation Pose節(jié)點。
為了使用動畫藍圖,我們還需要更新BP_Muffin。
使用動畫藍圖
點擊Compile并切換到BP_Muffin。
在Components面板選中Mesh (Inherited)組件,在Details面板的Animation設(shè)置,將Animation Mode改成Use Animation Blueprint,然后Anim Class改成ABP_Muffin。
現(xiàn)在,骨架網(wǎng)格就會使用ABP_Muffin作為動畫藍圖了。
點擊Compile并關(guān)閉BP_Muffin。在主界面點擊Play運行游戲測試動畫藍圖。由于Idle就是默認(rèn)狀態(tài),蘑菇會自動播放站立動作。
接下來,我們將會創(chuàng)建跳躍和掉落狀態(tài)。
創(chuàng)建跳躍和掉落狀態(tài)
回到ABP_Muffin并切換到Locomotion狀態(tài)機圖表,我們可以通過點擊圖表上方的Locomotion導(dǎo)航快速跳轉(zhuǎn)過去。
與其創(chuàng)建狀態(tài)再關(guān)聯(lián)上動畫,不如直接創(chuàng)建關(guān)聯(lián)好動畫的狀態(tài),我們改用另一種方法來創(chuàng)建跳躍狀態(tài)。
在Asset Browser中,拖拽SK_Muffin_Jump動畫至圖表空白處,就能創(chuàng)建帶有動畫的狀態(tài)。
將其重命名為Jump。
重復(fù)以上步驟,將SK_Muffin_Fall生成的狀態(tài)重命名為Fall。
現(xiàn)在我們就有三個狀態(tài)了:Idle,Jump和Fall。
接著,我們要連接這些狀態(tài)。我們可以通過拖拽起始狀態(tài)的灰色區(qū)域至目標(biāo)狀態(tài)的灰色區(qū)域來創(chuàng)建連接。
創(chuàng)建連接狀態(tài)如下:
- Idle到Jump
- Jump到Fall
- Fall到Jump
- Fall到Idle
現(xiàn)在有了狀態(tài)切換,還需要確定什么情況下會發(fā)生狀態(tài)切換,這就要使用過渡規(guī)則(Transition Rule)了。
過渡規(guī)則
下面圖標(biāo)表示過渡規(guī)則:
每個過渡規(guī)則都有一個帶有boolean輸入的Result節(jié)點。
當(dāng)輸入為true時,就會發(fā)生狀態(tài)切換。
接著,我們要創(chuàng)建變量用于表明玩家角色處于跳躍還是下落狀態(tài),過渡規(guī)則里會用到這些變量。
檢查玩家處于跳躍還是下落
創(chuàng)建兩個boolean變量命名為IsJumping和IsFalling。
首先,我們需要設(shè)置IsJumping的值。切換到Event Graph并找到Event Blueprint Update Animation節(jié)點,這個節(jié)點看起來類似于Event Tick節(jié)點。
為了判斷玩家是否處于跳躍狀態(tài),如下圖設(shè)置圖表:
這樣就能確認(rèn)玩家Z軸的速度是否大于0。如果是,說明玩家處于跳躍狀態(tài),將IsJumping變量設(shè)置為true。
注意:要確保目標(biāo)使用了動畫藍圖,這樣你才能在動畫預(yù)覽編輯器預(yù)覽變量。
要判斷玩家是否處于下落狀態(tài),我們就要做反之相反的檢查設(shè)置。添加如下高亮節(jié)點:
現(xiàn)在,當(dāng)玩家的Z軸速度小于0時,IsFalling就會設(shè)置為true。
是時候?qū)⑦@些變量應(yīng)用到過渡規(guī)則里去了。
定義過渡規(guī)則
首先,你需要定義Idle到Jump的過渡規(guī)則。切換到Locomotion狀態(tài)機。雙擊打開Idle到Jump過渡規(guī)則。
創(chuàng)建IsJumping節(jié)點并連接Result節(jié)點。
現(xiàn)在,當(dāng)IsJumping為true時,Idle狀態(tài)就能切換到Jump狀態(tài)上。
重復(fù)以上步驟來設(shè)置Jump到Fall和Fall到Jump過渡規(guī)則,分別使用如下變量:
- Jump到Fall: IsFalling
- Fall到Jump: IsJumping
現(xiàn)在,Jump和Fall狀態(tài)就能正常互相切換了。
還剩下一個過渡規(guī)則沒有定義。我們接著打開Fall到Idle過渡規(guī)則。
要過渡到Idle狀態(tài),玩家肯定不能處于跳躍或掉落狀態(tài)。要實現(xiàn)這樣的判斷檢查,我們可以使用NOR節(jié)點。還有當(dāng)它的輸入都為false時,它的輸出才為true。
創(chuàng)建NOR節(jié)點,并連接IsJumping和IsFalling節(jié)點。隨后,連接NOR節(jié)點與Result節(jié)點。
現(xiàn)在,當(dāng)IsJumping和IsFalling節(jié)點都為false時,Fall狀態(tài)就能切換到Idle狀態(tài)。
點擊Compile并回到主編輯器。按下Play來測試動畫轉(zhuǎn)換。
注意:你也能通過在動畫預(yù)覽編輯器編輯變量來測試動畫轉(zhuǎn)換。
現(xiàn)在,當(dāng)蘑菇小人在地面移動時只會滑行,這是因為我們還沒用上步行動畫!
除了像上面那樣為步行創(chuàng)建一個新狀態(tài)外,我們還可以使用混合空間(Blend Space)。
什么是混合空間?
混合空間是一種動畫資源,它基于輸入把兩種不同的動畫插值混合在一起。在本篇教程中,我們將以玩家的速度作為輸入。
混合空間有助于簡化我們的狀態(tài)機。下圖是如果不使用混合空間的情況下,Locomotion狀態(tài)機的樣子:
使用了混合空間,我們只需要替換Idle動畫即可。
了解完混合空間的魔力,讓我們來創(chuàng)建試試。
創(chuàng)建混合空間
在Content Browser里點擊Add New,從彈出菜單中選中Animation\Blend Space 1D。
注意:Blend Space跟Blend Space 1D的區(qū)別在于前者有2個輸入,后者只有1個輸入。
從彈出窗口中,選擇SK_Muffin_Skeleton。
將新建資源命名為BS_IdleWalk,雙擊打開動畫編輯器。
當(dāng)我們打開混合空間,可以看到如下圖的面板。這就是混合空間編輯器,我們要在這里添加動畫。
讓我們試試往上面添加些動畫。
混合空間添加動畫
首先,我們需要先修改變量(輸入)軸的名稱,在Asset Details面板找到Axis Settings設(shè)置,將Horizontal Axis\Name字段改成Speed。
現(xiàn)在,我們可以開始添加動畫了。在Asset Browser 拖拽SK_Muffin_Idle動畫至混合空間網(wǎng)格的左側(cè),讓動畫放置在0.0數(shù)值處。
注意:如果想要展示動畫名稱,可以點擊網(wǎng)格面板左上角的label圖標(biāo)。
隨后,將SK_Muffin_Walk動畫添加到100.0數(shù)值處。
現(xiàn)在,混合空間會根據(jù)輸入值混合站立與步行動畫。
如果輸入為0,只會播放站立動畫。如果輸入是100,會播放步行動畫。其他的中間值就會播放兩者插值混合后的動畫。
注意:最大最小輸入值可以設(shè)定成任意值。比如,你可以把最大值設(shè)置成500,這樣只有在更大的速度下,才會播放步行動畫。
你可以在Asset Details面板的Axis Settings設(shè)置值范圍。
現(xiàn)在就讓我們來使用混合空間吧。
使用混合空間
關(guān)閉BS_IdleWalk并打開ABP_Muffin。切換到Locomotion狀態(tài)機并打開Idle狀態(tài)。
首先,刪除Play SK_Muffin_Idle節(jié)點。
接著,通過拖拽添加BS_IdleWalk。隨后,連接BS_IdleWalk節(jié)點與Final Animation Pose節(jié)點。
現(xiàn)在,BS_IdleWalk被設(shè)置為默認(rèn)狀態(tài),會自動播放了。然而我們能發(fā)現(xiàn),由于Speed輸入一直為0,它只會播放站立動畫。
要解決這個問題,我們需要給它提供玩家速度。
獲取玩家速度
創(chuàng)建名為Speed的float變量,隨著切換到Event Graph。
在Sequence節(jié)點添加新引腳并添加下圖高亮節(jié)點:
這樣設(shè)置就可以恒定將玩家速度設(shè)置給Speed變量了。
切換回Idle狀態(tài)圖表,將Speed變量與BS_IdleWalk節(jié)點的Speed輸入相連。
現(xiàn)在,BS_IdleWalk就能在混合表現(xiàn)站立和步行動畫了。
還剩下最后一個動畫沒用到:死亡動畫!
使用死亡動畫
在游戲里,很顯然蘑菇小人只有在站立狀態(tài)(處于地面)才能切換到死亡狀態(tài)。然而,設(shè)想下如果它能在任何狀態(tài)下切換到死亡狀態(tài),我們的第一想法就是創(chuàng)建Death狀態(tài)并將其與其他所有狀態(tài)相連。這當(dāng)然也是一種選擇,但它將很快導(dǎo)致圖表變成一團亂麻。
另一種解決方案是使用Blend Poses by bool節(jié)點。這個節(jié)點能夠根據(jù)boolean值輸入決定兩種動畫的切換。
再我們創(chuàng)建節(jié)點前,先創(chuàng)建一個可以保存玩家死亡狀態(tài)的變量。
檢查玩家是否死亡
回到ABP_Muffin并創(chuàng)建名為IsDead的boolean變量。隨后,切換到Event Graph。
在Sequence節(jié)點添加新引腳并添加如下圖高亮節(jié)點:
這樣設(shè)置就可以恒定將玩家死亡狀態(tài)設(shè)置給IsDead變量了。
接著,我們再來使用Blend Poses by bool節(jié)點。
使用Blend Poses by bool節(jié)點
切換到Anim Graph并添加SK_Muffin_Death動畫,選中動畫,并在Details面板取消勾選Loop Animation屬性。
這樣確保死亡動畫只會播放一次。
接著,創(chuàng)建Blend Poses by bool節(jié)點。
選中Blend Poses by bool節(jié)點的情況下,在Details面板的Option設(shè)置部分勾選Reset Child on Activation屬性。
由于死亡動畫只會播放一次,這個選項可以確保動畫每次播放前會先自動重置到第一幀。
最后,添加IsDead變量,如下圖連接圖表:
現(xiàn)在,當(dāng)IsDead為true時,會播放死亡動畫。當(dāng)IsDead為false時,會播放Locomotion狀態(tài)機的當(dāng)前動畫。
點擊Compile并關(guān)閉ABP_Muffin。按下Play運行游戲試試死亡動畫吧!
后續(xù)學(xué)習(xí)
你可以在這里下載完整項目。
這個游戲看起來打磨得更好了,對吧?雖然你已經(jīng)可以根據(jù)所學(xué)實現(xiàn)一些東西了,然而還有很多知識點沒有涉及!推薦你閱讀Unreal引擎文檔關(guān)于骨架動畫系統(tǒng)部分內(nèi)容,了解其他類型動畫資源和具體用法。
如果你還想繼續(xù)學(xué)習(xí)引擎其他內(nèi)容,點擊下篇教程,將講解如何在游戲中使用音樂音效。