Mecanim動畫
1:舊版動畫系統只能通過代碼來控制動畫播放,隨着動畫種類變多,代碼復雜度也會增加,同時動畫過渡也需要非常繁瑣的代碼控制,為了讓有經驗的動畫師開發動畫,unity推出了針對人物角色的Mecanim動畫系統;
2:Mecanim支持運動重定向(Retargeting)功能,即把動畫從一個角色模型應用到另一個角色模型;
3: Mecanim允許使用“肌肉”來控制不同骨骼的運動范圍;覺得某個動畫太誇張的時候,可以用"肌肉"來限制一下。
4: Mecanim動畫系統三要素:
(1)Avatar: 從Mecanim系統的簡化人形骨架結構(Unity抽象出來的骨架結構)到用戶實際提供的骨架結構的映射(自己模型所對應的骨架結構);只要我們命名比較規范,這個映射是可以自動識別的。
(2)Animator Controller: 動畫控制器用來控制動畫的播放和過渡條件
(3)Animation Clip: 動畫剪輯;
Mecanim動畫實例
1.創建Unity工程和文件目錄
2.導入資源文件包body_anim.unitypackage(第56)
3.打開Models文件夾,點擊模型Boy,設置Rig---->Animation Tyoe---->Humanoid(人形動畫)
4.配置Avatar
a: 導入模型后,將模型的動畫模式配置成Humanoid模式。
None: 無模式, Legacy: 舊版動畫模式, Generic 其他動畫模式, Humanoid 人形角色動畫模式;
b: 系統將會自動生成模型對應的Avatar文件, 並作為其子對象;展開模型Boy可以看到一個BoyAvatar。
c: 大部分情況下Mecanim都能正確的生成Avatar文件,
Configure這個前面會有一個勾,點擊Configue,能查看到
映射情況,如果有錯誤,點擊Configue,手動做好人形骨骼的映射。
點擊Configure,Scene視圖里面會呈現模型,綠色的一條一條的就是Unity抽象出來的骨架結構。右邊Mapping就是映射的結果,沒有綠色填充的就是美術沒有設計這個骨骼。有紅色的點就是沒有映射成功的,可以手動拖進去。
d:Mapping: Clear清除映射, AutoMap自動映射;
e 如果骨骼綁定正確,但是角色姿勢不對(不是標准的T形),
在Scene中可看到消息“Character not in T-Pose”,解決此問題
可通過Pose->Enforce T-Pose或旋轉其它的骨骼。
f:Muscle配置:對於過於誇張的一些動作,比如動畫重定向過來的時候,小孩的動畫用在大人身上,可以通過對骨骼限定范圍來進行調整,讓這個骨骼運動在這個范圍內,這樣,就不用重新制作動畫;
(1)點擊Muscles & Settings欄
(2)點擊要限制的骨骼;
(3)調整骨骼的運動范圍的參數,旋轉運動的幅度;
g.配置完成后點擊Done---->Apply
5.把模型Boy拖進場景中,會自己掛載一個Animator的組件
Controller屬性放動畫控制器
Avator屬性放映射的BoyAvator文件
6.在res文件夾下創建一個動畫控制器Create---->Animator Controller,叫做anim_ctrl,雙擊打開,可以用鼠標中鍵按下拖動背景
7.動畫控制器配置
a:動畫控制器anim_ctrl打開:Parameters是動畫控制器所帶的參數列表,Layers是當前的動畫層
b: 動畫狀態機
(1) 動畫狀態機必然包含有3個動畫狀態單元 Any State, Exit, Entry;
(2) 動畫狀態機可以包含多個動畫狀態單元;
(3) 還可以包含子動畫狀態機;
c: 動畫狀態單元的創建:
在創建之前可以查看這個動畫的效果,在Assets\Animations\AnisForFight目錄下,點擊某一個,再點擊Animation欄,下面的播放按鈕可以播放。
方法(1): Animator窗口中鼠標右鍵 在菜單中選擇 Create State-->Empty;第一次創建的時候會被設置為默認動畫狀態並顯示為黃色,Entry會直接指向它,
再創建一個就不會是默認狀態了顯示為灰色,也可以在任意非默認單元上右鍵 Set As Default來設置默認的動畫狀態,同時只能有一個默認的動畫狀態。
方法(2): 將動畫文件拖入到Animator窗口,就是直接把Assets\Animations\AnisForFight\Boy@Idle拖進狀態機視圖中,會自動幫我們關聯好Motion
我們創建一個默認的動畫狀態單元叫idle,關聯它的Motion屬性,就是在Assets\Animations\AnisForFight\Boy@Idle下的idle文件,這個在面板中展開Boy@Idle才能看到。
再創建一個動畫狀態單元叫jump,關聯它的Motion屬性,就是在Assets\Animations\AnisForFight\Boy@JumpLoop下的take 001文件,這個在面板中展開Boy@JumpLoop才能看到。
測試:把jump設置為默認動畫狀態單元,關聯控制器到Animator組件,運行一下,發現模型Boy可以播放動畫。
d: 過渡條件連接(從一個動畫過渡到另一個動畫):
(1)將鼠標放在狀態單元上,鼠標右鍵-->Make Transition,創建動畫過渡條件,並再次點擊在另一個狀態單元上,完成過渡條件連接;
(2)點擊兩個狀態之間的連線,右邊是一個過渡的效果,可以點擊播放,也可以調整動畫的融合效果,可以讓第一個動畫放完再放第二個,也可以放一半放第二個,可以拖動來調整。
下面是一個過渡條件,默認是沒有過渡條件的,也就是會自動跳轉,我們可以添加條件。
(3)在狀態機左邊的Parameters面板,里面的參數可以用來控制條件變量,Mecanim支持過渡參數類型Float, Int, Bool, Trigger,首先要創建一個參數,點擊+號,選擇int類型,名字叫anim_state,默認值是0
(4)創建好參數后,再點擊兩個狀態之間的連線,點擊Conditions下面的+號,添加一個條件,就是以anim_state為條件變量,可以Greater、Less、Equals、Not Equal------>0的時候跳轉
(5)通過代碼來控制動畫跳轉,創建一個腳本叫anim_test
打開anim_test
using System.Collections; using System.Collections.Generic; using UnityEngine; public class anim_test : MonoBehaviour { public Animator anim;//關聯可以直接拖Boy模型節點到上面,會自動提取自己的Animator組件,是自己節點獲得自己組件的另外一種方法 // Use this for initialization void Start () { this.anim.SetInteger("anim_state", 0);//設置參數anim_state的值為0,我們之前也設置了當它等於0的時候會跳轉 //this.anim.SetFloat("anim_state", 1.0f);//其他類型的變量設置 } // Update is called once per frame void Update () { } }
8.配置完后運行,由於anim_state=0,又Equals---->0,就會一直播放跳躍的動作,我們可以實時地更改Parameters面板下的參數的值,從而實時運行查看動畫的跳轉路徑。
開發過程中:
動畫師調出一個角色動畫以后,一個模型通過Avator把它映射成Unity簡化版的人形骨骼,創建一個Anim Control,幫我們做好動畫跳轉的狀態機。
Anim Control里面還有Anim State,每個Anim State可以通過過渡條件來進行過渡和控制,通過修改過渡條件的變量Anim State可以達到控制動畫的目的。動畫條件過渡的時候也可以來控制動畫縫合,全部都是由可視化來完成的。
這樣子,動畫師只要調動畫,不用寫代碼,程序員只要通過開關,設置Anim State的值,就能決定去播放哪些動畫和切換動畫。