天天看點

Unity使用者手冊-動畫系統Animator

動畫系統Animator

動畫類型

Legacy 基礎的動畫

Generic 動畫,包含動畫狀态機

Humanoid 人形動畫,包含動畫狀态機

Update Mode

Normal 動畫播放将與Update同步更新,動畫播放的速度與目前的TimeScale相比對,如果TimeScale變慢,動畫播放速度也會變慢

Animate Physics 動畫播放将與FixedUpdate同步更新,即與實體系統綁定在一起。當使用實體互動來驅動物體運動時,使用此模式。

Unscaled Time 動畫播放将與Update同步更新,動畫播放的速度與目前的TimeScale無關,不管TimeScale變成多少,也會以原來的動畫播放速度播放動畫。

FixedUpdate與Update

FixedUpdate不受幀率變化的影響,以固定的時間間隔來調用。

而Update由于要渲染大場景或計算複雜邏輯,每幀的時間間隔是不一樣的。

正常在Unity的設定Time的Fixed TimeStep為0.02,理論上每秒的幀數是1 / 0.02 = 50幀,假設遊戲進行比較複雜的邏輯運算,在每幀裡消耗了大量時間,導緻最後Update隻調用了30次,也就是每秒隻有30幀,而FixedUpdate依然是50次調用,保持在50幀。

Culling Type

Always Animate 總是播放的,即使在螢幕外也不會被禁用

Cull Update Transforms 當不可見時,動畫重定向,IK(Inverse Kinematics)即反向動力學,和Transform的寫入都被禁用

Cull Completely 當不可見時,動畫系統被完全禁用

Based on Renderers(隻在Animation老動畫系統中可選) 當不可見(不被渲染)時,動畫系統被禁用

IK(Inverse Kinematics)即反向動力學

即可以使用場景中的各種物體來控制和影響角色身體部位的運動,一般來說骨骼動畫都是傳統的從父節點到子節點的帶動方式(即正向動力學),而IK則倒過來,由骨骼子節點帶動骨骼父節點,具體情況比如人物走路踩到了石頭就需要由腳的子節點來帶動全身骨骼做出踩到石頭的響應。IK可以使人物和場景更加貼合,進而達到更加真實的遊戲效果,如果大家玩過《波斯王子》或《刺客信條》系列,應該對主角的攀爬和飛檐走壁的能力印象深刻,這些都是應用了IK,使動畫貼合到具體的場景中進行的表現。

動畫轉換

int,float,bool,Trigger四種參數類型。

  • Trigger類型,本質上跟bool是一樣的。但Trigger會執行完畢後,将狀态設定為取反狀态。如果預設為false,那麼執行true之後,會将Trigger重置狀态為false。
  • 通過判斷state.normalizedTime >= 1.0f,來确定目前是否已經完成播放。
  • 在實際開發中,随着角色動畫越來越多,靠連線Make Transition指向一個新的動畫,會變得非常複雜。直接調用m_Animator.CrossFade("anm_dwarfHero_jump", 0.0f, -1, 0f)來播放動畫。設定最後一個參數為0.99f(設定為1,會回到開始),可以設定動畫到最後一幀。

動作融合 AvatarMask

Avatar Mask允許你丢棄的一些動畫資料,隻允許某些部位的動畫起作用。

當我們需要上半身播放開槍的動畫,下半身在播放跑步動畫。

  • 在Animator系統中,在BaseLayer中拖入跑步動畫,
  • 建立一個Layer,并為其建立一個AvatarMask,取消下半身的IK控制,同時,設定Layer的weight為1,表示覆寫BaseLayer的動畫, 然後在建立的Layer中,拖入開槍動畫。
  • 就可以完成上半身和下半身不同動作的融合了。

動畫重定向 Retarget

人形模型在設定動畫類型為Humanoid時,可以複用動畫Controller。解決不同骨骼間,複用動作的問題。解決方案:将不同的骨骼映射到Unity中的一套标準骨骼中。

動畫重定向技術就是一種時間換空間的思路,在運作時将一套動畫根據預計算好的骨骼差異資訊,得到目标模型骨架上可以适用的動畫資料,就可以生成目标角色的動畫效果。

重定向技術就是一種在将動畫資料從一個骨骼拷貝到另外一個骨骼的過程。

假設我們想讓一個female的模型複用一個male的動畫:

a) 導入male的模型,設定動畫類型為Humanoid,設定好Avatar上的骨骼映射關系;

b) 導入male的動畫檔案,設定其類型為Humanoid,講其Avatar設定為male的avatar;

c) 使用male的動畫制作一個Animator;

d) 導入female的模型檔案,設定動畫類型為Humanoid,同樣設定好Avatar上的骨骼映射關系;

e) 可以拖拽一個模型檔案到Scene中,然後把它的Animator設定為之前male的動畫制作的Animator,即可看到Retargeting之後的效果了。

動畫重定向遇到的問題記錄

在使用過程中,我們遇到了一些問題。

1. 第一個是角色的武器或者飄帶在使用Humanoid類型的動畫系統之後不會移動了,或者移動的位置有了很大的偏差。這時候可以在動畫檔案的屬性設定裡,檢視Mask下的Transform選項,裡面可能存在沒有被勾選的骨骼。我們目前的做法是把Transform下的所有骨骼對象都勾選上。

2. 某些角色在重定向之後的動畫中表現為腳不貼地,和地面之間有縫隙,原始動畫中沒有這一問題。設定T-Pos的姿勢,這裡我們可以對參考姿勢做微調。

Animator Override Controller:

  1. 是 “Animator Controller”的重載, Animation Controller可以認為它就是動畫狀态機, Animator動畫系統是通過Animator Controller來控制動畫播放的,裡面存着指向各個卡通片段Animation Clip的引用,和播放動畫的邏輯,比如狀态轉移等.
  2. 而Animator Override Controller則用于拓展一個已存在的Animtor Controller,它隻是在後者基礎上可以在某些狀态播新的動畫Clip,保持後者的狀态機邏輯,結構
  3. 應用方面,Animator Override Controller能做到一個狀态機(Animator Controller)實作多套動作,非常利于維護。
  4. 按官方說法就是:如果一類模型可以共用動畫狀态機,則可以弄一個基礎Animtor Controller,裡面是基本的動畫狀态邏輯,然後給某個模型使用就弄一個Animtor Override Controller,然後把其中不同的動畫Clip換成自己的,這樣就隻需維護一份動畫狀态機了,省心省力。比如NPC系統的各個NPC。許多怪物也可以共用。

Blendtree混合樹

1. 狀态轉移和混合樹,雖然兩者都是用來制作平滑動畫,但差別很大

2. 狀态轉移是從一個動畫狀态平滑轉移到另外一個動畫狀态

3. 動畫混合樹是把多個動畫混合起來, 将角色不同的部分混合,對一個部分而言,是混合所有動畫中該部分的動作,形成該部分的新動作,是混合動畫。

Bake Into Pose屬性,根骨骼動畫

  • 在引入模型時,模型附帶的Animation資訊,Root Transform Position/Root Transform Rotation的Bake Into Pose(烘焙在動作中)屬性,作用是是否将根骨骼的位置和旋轉,烘焙到動作中,如果應用了這個屬性,根骨骼的位置改變或旋轉,隻會影響它本身,而不會影響它在世界空間中的真實位置或旋轉。
  • 如果不應用這個屬性,動畫就是根骨骼動畫,将會用Animation動畫本身所帶的位置或旋轉,來驅動角色的位置或旋轉,進而影響它在世界空間中的真實位置或旋轉。
  • 角色idle動畫,不需要根骨骼動畫;帶有位移的動畫,可以采用根骨骼動畫。
  • 注意:要想使用根骨骼動畫,在Animator 元件上,需要勾選Apply Root Motion。
  • 在代碼中,可以接管根骨骼動畫的位移,實作MonoBehaviour的OnAnimatorMove()方法。

Sprite序列幀動畫

當Sprite是由一幀幀的貼圖組成的,可以選擇Sprite Mode為Multiple,在Sprite Editor中Slice切分成多個Sprite,選中需要做成動畫的Sprite,拖到場景中,Unity會自動生成序列幀動畫的Animator Controller和Animator Clip。

UV動畫——本質通過改變貼圖

UV動畫,主要用于序列幀、模拟無限重複的背景讓模型頂點對應的UV随時間變化,使其對應紋理像素不斷随時間變化但是無法達到讓物體“變形”的效果。UV動畫是一種常用的渲染技巧,經常用來描述水的流動、霓虹燈的閃爍等。實作的原理就是動态修改貼圖的UV坐标,使物體表面産生變化。

頂點動畫——本質通過改變頂點坐标

頂點動畫,原理和UV動畫有相同的地方,但是頂點動畫可以讓物體動起來的同時,達到變形的效果其主要原理是在 頂點着色器中對模型的頂點進行偏移,再将偏移後的頂點位置輸出到片元着色器中。與改變mesh頂點不同的是,在gpu中更改頂點資訊的效率遠高于在cpu中改變mesh的資料。這種渲染技巧普遍用于模拟自然界物體波動,如水流、草地、火焰等效果。

Animator的性能優化

性能瓶頸:狀态機,動作融合,IK

優化:

  • 限制Animator的數量,在移動端超過30個,對CPU壓力比較大
  • 關閉根骨骼動畫
  • 限制骨骼數量(<=30)
  • 采用Base On Render,但是從螢幕外進入螢幕的動畫,不能選擇這種模式
  • 控制動作的幀數,一般30fps
  • 用Animator,盡量用Generic,不用Humaniod
  • 盡量用Animation!!!