http://blog.csdn.net/u014635337/article/details/46918953ide
Animator是unity新的動畫系統,除了基本的播放動畫功能以外,還提供了更強大的其它功能
函數
基本篇oop
1新建AnimatorController,將動做拖到AnimatorController,將動做作連線,新建狀態值,設置連線經過條件的狀態值動畫
2代碼使用SetInteger("變量名",值) SetFloat SetBool等設置狀態值,實現動做的切換,動做切換時有動做融合效果spa
3兩個動做之間沒有連線時,即便改變狀態值,也沒法切換動做.net
4當anystate與目標動做連線時,無視當前動做是否與目標動做連線,只要anystate與目標動做的條件成立,立擊切換到目標動做orm
5兩兩動做互相連線與anystate與全部動做連線,播放的區別是,anystate切換到目標動做時,沒有動做融合,動做之間連線切換有動做融合blog
6設置動做的幀事件,前提是要把有AnimatorController的預製拖到面板上,選中對像,ctrl+6打開動做面板,編輯好幀事件後選擇回調函數,幀事件回調函數只能選擇以AnimationEvent 爲參數的函數,而且函數不能是公有且是重載的函函數教程
若是是循環動做,幀事件會每播一遍就會調用一次,若是不是循環動做,只會調用一次遊戲
除此以外基礎部分很少說,網上不少教程
下面是Animator的是一些其它使用方法,可能在新的動畫系統中並不起眼,也不經常使用,但其實很是有用
Play("動做名")
Play(動做名hash值)
直接播放動做,不會作動做融合,即便有狀態機的連線,徹底忽略狀態機,有重載方法,能夠指定層,也能夠指定目標動做在原動做進行到什麼時候開始
CrossFade("動做名",融合時間)
CrossFade(動做名hash值,融合時間)
動做融合,融合時間持續多久徹底過渡到目標動做,跟狀態機無關,有重載方法,能夠指定層,也能夠指定目標動做在原動做進行到什麼時候開始
指定層時-1與0層都是baselayer,但使用GetCurrentAnimatorStateInfo不能使用-1
方法不會將normalizedTime清零,全部調用此方法不能從新播放動做
speed
動做播放速度1爲正常,0時動做中止在當前幀,能夠用做暫停或加速減速動做
normalizedTime
動做的歸一化時間的值,整數部分爲播放的遍數,不管是不是循環動做這個值都會一直累加
進階篇
layer層,
1高層能夠覆蓋低層的動做播放,
2blending屬性設置是高層是覆蓋仍是疊加低層
3經過weight設置混合比例
4此層使用的avatarmask
avatarmask
1能夠新建avatarmask,選中要編輯模型的avatar,選擇部分骨骼節點
2能夠將上下半身的骨骼節點作成兩個avatarmask,設置兩個層使用不一樣的avatarmask,每層播放不一樣的動做,使上下半身播放不一樣的動做.實現上下半身混合動做的效果
3注意當多個動做同時播放時,每一個動做都會觸發各自的動做幀事
坑點
1只能取得當前的動做狀態數據及下一個動做狀態數據,代碼可控性不強
2動做事件回調時沒法判斷是哪一層回調回來的,但其實不該該存在多個層在播同一個動做,出現這種狀況必定是偷懶或出錯了
3AnimatorStateInfo中的loop與動做文件的loop並不相同,只有在將動做文件拖到控制器和在控制器中SetAsDefault時,會將動做文件的loop值應用到AnimatorStateInfo中,很扯蛋的一件事,或是動做自己就在fbx中,在fbx中修改了loop值後應用也會生效
總結
1普通時能夠直接使用play或CrossFade,簡單不容易出錯,使用狀態機的好處是能夠實現多段動畫,經過狀態機事先設置鏈接好,只改變一個值來觸好一套多個動做
2甚至能夠將SetInteger設置狀態機值與play結合使用
好比當前是站立動做,狀態值爲1,***動做連線到站立動做,條件是動做播完而且狀態值爲1回到站立動做
這時代碼調用CrossFade***動做,這時的播放效果就是站立動做過渡到***的動做,***動做播完後從新變成站立動做
固然這個效果能夠直接使用狀態機完成,但前提站立動做必須或***動做連線,否則跑沒法切換到***動做,但當直接使用Play或CrossFade能夠忽略站立是否與***動做連線
寫在最後
若是是作動做類遊戲或須要動做混合,使用Animator會更新方便,但若是隻是簡單的播放動畫,建議仍是使用animation系統,可控性更強