參考資料
在Mecanim Animator Controller中有個叫做Any State的State,是一個一直處在作用中的State,只能連接給其他的State,其他的State是不能連接給他的。
假使想要有一個在任何State規則之上的動作流程時(即條件成立時能立即進入該流程),譬如說人物的死亡動作,當程式下達死亡指令時,你會想要死亡動作是立刻表演,不希望這個流程會被其他的State卡住。
這時候Any State就能達到這個效果,在這裡以一個範例作解說:在Animator Parameters中新增一個IsDead的Bool,並新增一個接收Any State的死亡動作State,且Transition Conditions為IsDead == true,如此當死亡時程式下達指令給Animator(animator.SetBool("dead",true)),就會讓dead這個State立刻執行。
但是因為Any State是一直在作用狀態中的,所以並不能一直讓觸發條件成立,必須要是一次性的命令,否則就會發生一直反覆進入dead State的狀況,舉例來說:IsDead被設為true且Animator已經進入dead State的時候,就必須要把IsDead設回false。
Animator - Any State |
假使想要有一個在任何State規則之上的動作流程時(即條件成立時能立即進入該流程),譬如說人物的死亡動作,當程式下達死亡指令時,你會想要死亡動作是立刻表演,不希望這個流程會被其他的State卡住。
這時候Any State就能達到這個效果,在這裡以一個範例作解說:在Animator Parameters中新增一個IsDead的Bool,並新增一個接收Any State的死亡動作State,且Transition Conditions為IsDead == true,如此當死亡時程式下達指令給Animator(animator.SetBool("dead",true)),就會讓dead這個State立刻執行。
但是因為Any State是一直在作用狀態中的,所以並不能一直讓觸發條件成立,必須要是一次性的命令,否則就會發生一直反覆進入dead State的狀況,舉例來說:IsDead被設為true且Animator已經進入dead State的時候,就必須要把IsDead設回false。
防止重複觸發Any State的範例Code如下:
static int deadState = Animator.StringToHash("Base Layer.dead"); if ( animator.GetCurrentAnimatorStateInfo(0).nameHash == deadState ) { animator.SetBool("IsDead", false); }補充說明,animator.GetCurrentAnimatorStateInfo(int IDX)所返回的是Hash,且Hash並不能轉回String,因此得要先把你所知道的State名稱轉成Hash(.StringToHash())再做比對。
在這樣的需求之下代表State的命名必須是有規則的、固定的,為了方便作業流程,動作片段的取名與State相同也可以省去某些操作上的步驟(直接將動作片段拉入Animator生成state時會自動以動作片段名稱為state命名)。
另外直接從Any State做一個Transition到預設動作上,也能用來跳出任何的State。
Unity 4.3 更新
在Unity 4.3中新增了一個新的Parameter類型:Trigger,其作用是達成一次性的判斷條件,非常實用。其功能就是當Animator.SetTrigger("ParameterName")命令下達之後,該parameter會被設為True,並在transition完成時會被設為False,以往都需要自己撰寫設回False的程序,現在利用Trigger這個Parameter就會方便很多。
另外在4.3中Mecanim有大幅的優化,譬如Mecanim已幾乎適用所有的component、property...,可以利用Mecanim控制你的相機FOV、控制你的Script的參數...,再配上新支援的Event(以往ImportedAnimation不支援Event)以及優化過的Animation Window(Dope Sheet + Curves),Mecanim的實用程度已大幅提高。
參考文章
- http://answers.unity3d.com/questions/384309/mecanim-state-change-question.html
- http://forum.unity3d.com/threads/148665-Mecanim-quot-Any-State-quot
- 未存在Document中的 - UnityEditorInternal.AnimatorController
http://answers.unity3d.com/questions/418854/getting-a-list-of-mecanim-states-in-animator.html?sort=oldest
沒有留言:
張貼留言