生活随笔
收集整理的這篇文章主要介紹了
Unity3D 4.x 使用Mecanim实现动画控制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Unity3D 4.x 版本號之后提供了一種新的動畫機制Mecanim,盡管眼下還支持之前的Animation。但看到Unity3D 4.3?預覽版里Sprite的動畫也是基于Animator的,可知Mecanim將會是以后動畫播放的趨勢!
Mecanim是一種基于狀態機的結構,不同的狀態表示一個動作(或者多個動作融合,或者一個子狀態機)。狀態之間使用一種稱為Transition的組件關聯,Transition中能夠設定一些條件,當在Transition“源狀態”下。滿足其條件之后。將自己主動跳轉到Transition“目的狀態”!
(詳細使用方法請參照Unity3D手冊Mecanim)
在一些ARPG的游戲中,比方 端游的DNF和闖關類的街機游戲,連續按攻擊鍵都會觸發一套組合攻擊。在這個過程中敵人通常是硬直狀態的。并且組合攻擊的最后一下通常是重擊。這樣做既添加了連擊帶來的爽快感。又促使玩家在攻擊時採取一定的攻擊策略。
Mecanim的狀態機設計就非常方便的使開發人員實現了這一效果。
1.動畫狀態機
這里僅僅用4個動作描寫敘述,待命狀態(Idle)。攻擊1狀態(AtkSlice),攻擊2狀態(AtkStab),攻擊3狀態(AtkCleave),3個攻擊狀態分別表示連續按下“普通攻擊鍵”時觸發的狀態,是有先后順序關系的。即假設在待命狀態下按下“攻擊鍵”,則進入攻擊1狀態。假設在攻擊1狀態下繼續按下“攻擊鍵”。則進入攻擊2狀態。假設不按下“攻擊鍵”,則回到待命狀態。攻擊2狀態到攻擊3狀態同理。攻擊3狀態覺得是重擊。即連擊結束。回到待命狀態。
狀態圖例如以下
我希望能以最少的代碼和設置完畢這個功能。所以僅僅加入了一個狀態機參數 ActionCMD,如果 ActionCMD = 1 為進入攻擊狀態參數
(1)在隨意3種攻擊狀態下,不再繼續按下“攻擊鍵”,則回到待命狀態,即上圖 3條白色Transition
(2)在待命。攻擊1,攻擊2狀態下,繼續按下“攻擊鍵”,則跳轉到連擊狀態(即下一個攻擊狀態)。即上圖3條藍色Transition
2.代碼實現
(1)狀態機設置完畢之后,要做的就是在代碼中完畢對當前狀態的推斷,以及對狀態參數的設置。用以完畢動畫狀態機的切換!
[csharp]?view plaincopyprint?
?? ????private?static?readonly?string?IdleState?=?"BaseLayer.Idle";?? ????private?static?readonly?string?AtkSliceState?=?"BaseLayer.AtkSlice";?? ????private?static?readonly?string?AtkStabState?=?"BaseLayer.AtkStab";?? ????private?static?readonly?string?AtkCleave?=?"BaseLayer.AtkCleave";?? ?????? ????private?static?readonly?string?ActionCMD?=?"ActionCMD";?? ?? ????private?Animator?animator?=?null;?? ?????? ????private?int?curComboCount?=?0;??
(2)在Start() 中獲取Animator組件引用
(3)在Update() 中依據當前狀態和輸入參數促使狀態切換
[csharp]?view plaincopyprint?
void?Update()?? ????{?? ????????AnimatorStateInfo?stateInfo?=?this.animator.GetCurrentAnimatorStateInfo(0);?? ????????if?(!stateInfo.IsName(IdleState))?? ????????{?? ?????????????? ????????????this.animator.SetInteger(ActionCMD,?0);?? ????????}?? ?? ????????if?(stateInfo.IsName(AtkSliceState)?&&?(stateInfo.normalizedTime?>?0.6f)?&&?(this.curComboCount?==?2))?? ????????{?? ?????????????? ????????????this.animator.SetInteger(ActionCMD,?1);?? ????????}?? ????????if?(stateInfo.IsName(AtkStabState)?&&?(stateInfo.normalizedTime?>?0.8f)?&&?(this.curComboCount?==?3))?? ????????{?? ?????????????? ????????????this.animator.SetInteger(ActionCMD,?1);?? ????????}?? ?? ????????if?(Input.GetKeyUp(KeyCode.J))?? ????????{?? ?????????????? ????????????Attack();?? ????????}?? ????}??
[csharp]?view plaincopyprint?
void?Attack()?? ????{?? ????????AnimatorStateInfo?stateInfo?=?this.animator.GetCurrentAnimatorStateInfo(0);?? ????????if?(stateInfo.IsName(IdleState))?? ????????{?? ?????????????? ????????????this.animator.SetInteger(ActionCMD,?1);?? ????????????this.curComboCount?=?1;?? ????????}?? ????????else?if?(stateInfo.IsName(AtkSliceState))?? ????????{?? ?????????????? ????????????this.curComboCount?=?2;?? ????????}?? ????????else?if?(stateInfo.IsName(AtkStabState))?? ????????{?? ?????????????? ????????????this.curComboCount?=?3;?? ????????}?? ????}?????
這里必須注意的是該。在Update() 二手0.6和0.8 分別低于目前的狀態應該跳轉到待機參數Exit Time(這一次也正交)
轉載于:https://www.cnblogs.com/hrhguanli/p/4752966.html
總結
以上是生活随笔為你收集整理的Unity3D 4.x 使用Mecanim实现动画控制的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。