【虛幻】用動畫曲線來驅動角色運動,實現最完美的運動方式——偽Root Motion
轉載請註明出處:http://www.cnblogs.com/shamoyuu/p/counterfeit_root_motion.html
一、角色運動分類
在虛幻或Unity3D中,角色的運動一般有2種方法來驅動:
1是直接(或間接)修改角色座標,然後計算上一幀和這一幀之間的距離差來算出速度,然後用速度來選擇播放哪個動畫(0=idle,300=walk,600=run)。
2是Root Motion,由動畫驅動。在動畫師做的動畫中,角色骨骼的root節點就自帶位移,然後遊戲引擎獲取到這些位移,以此來改變角色在遊戲中的位置。
二、各自優缺點
1優點是實現簡單,可控性高,對聯機的支援足夠好。缺點就是簡單,如果是步履蹣跚的走法,因為移動速度不恆定,會滑步(常見喪屍、老人之類的慢走)。
2優點是完全不會滑步,動畫裡怎麼移動,遊戲裡就會怎麼移動。缺點就是實現複雜,可控性差,對聯機支援不夠(無法預測下一幀時角色的位置),網路差的時候會很糟糕。
三、動畫曲線驅動的偽Root Motion
這種方式的移動還是交給程式碼(MovementComponent),但是它的移動速度卻由動畫曲線來控制,這樣就可以很好地整合前面兩種移動方式的優點,也避免了一些它們的缺點。
可以看到這兩個動畫(一個步履蹣跚,速度時快時慢,而且左右搖晃,另一個轉來轉去),雖然它們不是Root Motion,但是無論是移動還是旋轉,卻都沒有絲毫滑步現象。
實現起來其實很簡單
首先要把Root Motion中Root的位移旋轉等資訊轉換成曲線,這裡使用一個外掛Root Motion Extractor,去年的時候Epic免費送過,沒有的話就自己想辦法了。
轉換很簡單,把SourceFolder和TargetFolder選一下,然後所有選項都打鉤,然後點轉換就好了,唯一的兩個小問題就是,首先這個動畫不能是曲線動畫(得是3dmax裡做的那種常規的動畫),其次Root Motion的動畫資源裡要勾選“啟用根運動”。
這裡就是轉換好之後的InPlace動畫資源,可以看到裡面有很多的曲線,看名字就應該知道都是幹啥的了。
需要注意的是,這裡轉換完成之後,最好儲存重啟一下工程,不然曲線資料可能獲取不到。
然後這樣就可以獲取到當前動畫曲線的float值了,最後就是簡單把它放到Tick裡
在每一幀獲取曲線的值,然後設定對應的屬性就好了。
圖裡的-95和270是網格預設的旋轉和位置。
最後,就是修改動畫的邏輯,動畫的不能再由Speed來決定,而是應該交給按鍵axis值。
完結,散花