关卡 动画 蓝图 运行_动画蓝图 - Unreal Engine
為何選擇動畫藍圖?
"動畫藍圖“聽起來比”藍圖“更高深莫測。 藍圖用起來很有意思,但現在看起來動畫藍圖和藍圖的工作原理不太一樣,所以我想在此處討論一下。
首先,讓我們談一下如何在虛幻引擎中播放動畫。
我們有兩種在SkeletalMeshComponent上播放動畫的方法。 您可能已經知道了,SkeletalMeshComponent包含了具有植皮網格物體的骨骼層次結構,可供您播放動畫。 如果您拖曳動畫到關卡中,它會創建包含SkeletalMeshComponent的SkeletalMeshActor,并為您設置一些基礎信息。
當您選擇詳細信息面板中的actor時,請您特別注意下圖所標出的這部分數據。
每個SkeletalMeshComponent都具有動畫模式設置,我們可以在其中設置我之前談到過的播放動畫的兩種方式之一。
Use Animation Asset(使用動畫資源): 它將僅被應用于AnimSequence(動畫序列)或AnimComposite(動畫組合)。 一個資源可以沿著給定的時間軸產生有效的姿勢.
Use Animation Blueprint(使用動畫藍圖): 這個模式讓您可以播放動畫藍圖。
第一個選項比較簡單,但第二個選項需要一些解釋。
第二個選項是Use Animation Blueprint(使用動畫藍圖)。
如果您從內容瀏覽器中拖曳AnimBlueprint(動畫藍圖)到關卡視口中,它將會創建如下圖顯示的具有AnimBlueprint(動畫藍圖)設置的SkeletalMeshActor。 (類似于上方的操作,您可以將動畫序列拖曳到關卡視口中)
播放一個動畫比較簡單,但播放多個動畫并基于不同的情況來混合它們 – 舉例來說,播放不同的混合動畫 – 這就比較復雜了,所以我們要使用Animation Blueprint(動畫藍圖)。 它是基于當前狀態來運行的,諸如參數和當前時間等。
如果您創建任意的動畫藍圖,您都會看到兩個圖表,在下方的鏈接中進行了詳細解釋。
它包括了兩個圖表? - EventGraph(事件圖表)和AnimGraph(動畫圖表)。
事件圖表和用于AnimInstance(動畫實例)的藍圖相同。 您可以設置變量或調用函數,并且它具有觸發的事件。 您可以通過調用每個節點來獲得執行的操作序列。
AnimGraph(動畫圖表)不太一樣。 動畫在其中進行混合。 您可以把它想象為樹形結構,而非操作序列。 每個節點都具有其各自的流程步驟,因此,它會產生姿勢。
讓我們首先看一下事件圖表示例。
在您了解藍圖后,很容易就能明白。 它會觸發這個事件、更新動畫,而且在其進行此項操作時,它會設置Speed(速度),并在計算方向后設置Direction(方向)。
那么AnimGraph(動畫圖表)是如何運作的呢? 它的運行方法不太一樣。
上圖中將會播放走路的動畫,而它會轉到Final Animation Pose(最終動畫姿勢)。 評估的順序依然是從左到右,但您更應該把每個節點視作為狀態,而非一次性的操作。 當前它只有一個循環的動畫。 為讓其能繼續后期動畫,每個節點都必須保存臨時數據。 也就是狀態值。
當您需要基于[0, 1]間的浮點值來混合兩種動畫時該如何做呢?
在我們更新動畫系統時,它將會執行以下的一系列操作。
更新EventGraph(事件圖表)
更新AnimGraph(動畫圖表)
觸發事件
我們要首先更新EventGraph(事件圖表),這是因為這樣我們可以獲得所有最新的變量,這樣AnimGraph(動畫圖表)可以使用這些值來做相應的混合。
這樣做不會變更骨骼變換的任何內容。 這個操作實際上是基于時間的變化而更新“state”(狀態)。 接下來,我們應何時變更骨骼變換并對幀生成有效姿勢? 這個操作在Evaluate(評估)時進行。
在AnimGraph(動畫圖表)中發生3個事件。
初始化
更新
評估
因為EventGraph(事件圖表)不需要評估,所以只發生2個事件。
初始化
更新
一般來說,初始化只發生一次,但如果您變更一個“needs reinitialization”(需要重新初始化)的網格物體,初始化可能會再次發生。
更新和評估在每次更新時都會發生。 評估后會產生有效姿勢。 我們為什么將這些流程分開? 主要是為了最優化。 評估流程是整個動畫處理流程中最消耗系統資源的部分,它會對變換進行大量的數學運算,而且我們可以很方便地對其進行并行計算,因為它不需要與游戲進行任何互動。 另一方面,更新流程具有“Trigger Event”(觸發事件) – 諸如AnimNotifies(動畫通知),它經常意味著會調用藍圖函數。 這樣就需要與游戲的其它部分進行互動,所以要對它并行計算就很難了。
那么能不能改變骨骼變換? 應在什么位置進行此項操作?
看起來大多數人喜歡在藍圖中進行這項操作。 可能在藍圖中進行這種操作更加順手,但正確的方法是在Animation Blueprint(動畫藍圖)中進行此項操作。
由于在動畫藍圖中會運算所有的骨骼變換并產生最終結果。 所以如果我們在同一個位置進行這些操作,這樣會更好。 如果您在藍圖中進行此操作,根據Ticks(更新)的不同順序,您可能無法獲得最新的骨骼變換。 讓我們來考慮一下:
幀起始
….
您的藍圖更新骨骼變換
動畫藍圖被調用 – 更新所有的骨骼變換
….
幀結束
這樣操作將會讓您的變更無效,因為無論您是否修改骨骼變換都不會影響到動畫藍圖。 它會運行圖表,然后相應地更新變換。 如果我們反向操作則是有效的。
幀起始
….
動畫藍圖被調用 – 更新所有的骨骼變換
您的藍圖更新骨骼變換
….
幀結束
但是考慮一下,如果現在還有另一個藍圖也需要變更該如何處理。 這樣就變得非常復雜了。
最好的辦法是把骨骼變換的操作集中在動畫藍圖中進行操作,因為一個實例包含一個動畫藍圖。 您可以使用變換節點來修改骨骼變換。
您可以設置您想要修改的變換組件,以及其所處的空間。
動畫藍圖是非常好用的工具。 它提供了許多節點 – 比如,層混合、添加型動畫混合、按變量混合、狀態、變換等等。 我們在ContentExample項目中準備了Animation.umap文件,您應該看一下。
如需了解更多信息,請點擊以下鏈接,并在下方發表您的反饋。
總結
以上是生活随笔為你收集整理的关卡 动画 蓝图 运行_动画蓝图 - Unreal Engine的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DeOldify实现老照片上色(附直接使
- 下一篇: Python简单实现邂逅在迷宫无限十连自