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