2015年3月27日 星期五

Unity5 Mecanim 系統介紹

Unity5 Mecanim 系統介紹
請注意: 本文沒有Mecanim的完整教學, 只教新功能

StateMachineBehaviour:

Unity5的Mecanim主要帶來了邏輯編輯方式的改變
導入了StateMachineBehaviour 讓我們Animator的邏輯撰寫上, 變得比過去更為明確一些
Inspector畫面, 點選了狀態機或Layer
Inspector畫面, 點選了狀態
就如上面兩張圖, 我們可以看到新增了Add Behaviour的按鈕, 點下去後他會把所有繼承自StateMachineBehaviour的Script都列出來, 整個概念就跟已經用習慣了的把MonoBehaviour掛到GameObject身上一樣

StateMachineBehaviour是一個抽象類別
上面定義了七個函式讓我們選擇性作override來賦予程式邏輯
OnStateEnter
OnStateExit
OnStateIK
OnStateMove
OnStateUpdate
OnStateMachineEnter
OnStateMachineExit

以下一個一個簡單描述一下使用時機

首先, 說明一下作用域的概念
就像MonoBehaviour一樣, 掛在哪個GameObject身上
你用gameobject取來的就是哪個GameObject

所以, 你將StateMachineBehaviour掛在哪個
State 或者 Layer, 或者 StateMachine上
那麼上面七個函式的觸發條件就會受到影響

例如:
你把Script掛在Idle這個State身上
那麼, 程式只會在運作到Idle這個State的時候
才會去執行

如果你把Script掛在Layer身上
那麼整個Layer所有的State變化都會通知道你這個Script

如果掛的是一個Sub StateMachine
那麼就只有在狀態運行到這個StateMachine裡面的State的時候
你的這個Script才會收到通知

了解這個之後, 再接下來了解七個函式的作用時機

OnStateEnter
在Animator的狀態切到當前這個狀態的時候
會呼叫一次這個函式

而如果你是將Script掛在狀態機身上(Layer也可以, Layer其實也是狀態機)
那麼無論程式進入哪個State, 函式都會被觸發一次
這時候你可以簡單用stateInfo.IsName去進行辨識

OnStateExit
跟OnStateEnter差不多的東西, 時機變成要離開這個State的時候才會觸發

一樣, Script掛在Layer或StateMachine身上時
裡面所有的State離開時都會通知你

OnStateUpdate
這個函式會在每個frame都通知一次, 其他細節跟前兩個差不多

OnStateMove
這個函式會在OnAnimatorMove之前執行, 其他條件跟前三個差不多
請特別注意, 如果你的Animator有要使用Apply Root Motion功能來進行位移
那麼就請不要override這個函式, 否則Unity會放棄幫你進行位移

關於這部分, 可以參考Unity官方的說明文章進行更進一步的了解
下面簡單轉貼說明的句子
OnStateMove is called before OnAnimatorMove would be called in MonoBehaviours for every frame the state is playing. When OnStateMove is called, it will stop OnAnimatorMove from being called in MonoBehaviours.
簡單說就是兩個function互斥

OnStateIK
這個函式也很特別, 他的觸發State必須有在進行IK pass才會呼叫
而一般State預設都沒有IK pass, 所以並不會被呼叫到

OnStateMachineEnter
只有進入這個StateMachine或者Layer的時候會呼叫

OnStateMachineExit
只有離開這個StateMachine或者Layer的時候會呼叫


Entry State & Exit State

首先我們拿4.6和5.0的AnimatorController預設內容來做個比較
4.6 Mecanim default

5.0 Mecanim default
經過比較可以清楚看到, 5.0新增了兩個預設狀態, Entry和Exit

Entry State:
首先我們將Layer視為一個狀態機, 而這個State則可以視為整個狀態機的起始點

Exit State:
Exit則可以視為狀態機的結束點
比較需要知道的是
當狀態機來到Exit後, 會立即重新回到Entry
重新開始新一輪的狀態機工作, 而非關閉狀態機

還有就是, 雖然Exit會立刻銜接到Entry
但是Parameters裏頭的值是不會重置的
設計時須注意到這一點

Direct BlendTree:
BlendTree新增了Direct這個種類, 功能是
讓每個動畫都能受單一一個float控制, 來進行動畫混合
這個唯一的float他的數字會是介於0~1之間的浮點數
同一個float可以同時控制數個動畫進行混合是沒問題的
使用的條件有點麻煩, 練習材料不太好準備
這裡給出官方的示範做為參考

其他變更:
1. Layers介面微調, 並且加入搜尋功能
2. Parameters面板從左下角搬上來跟Layers介面放在一起, 並且加入搜尋功能
3. 新的Layers&Parameters混合面板增加了顯示開關(Parameters旁的眼睛)
4. Transition的Inspector介面也做了調整, 用法沒多大改變
(個人還是覺得4.6的Exit Time設計比5.0的has Exit Time好)
5. 各State和StateMachine以及Layer的Inspector加了Add Behaviour鈕
6. 新版的BlendTree畫面居然不能用Alt + 滑鼠左鍵移動了
目前沒找到移動方法, 個人認為是bug

沒有留言:

張貼留言