日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity3D 4.x 使用Mecanim实现动画控制

發布時間:2024/7/19 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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";??
  • ????//?動畫狀態機參數Key??
  • ????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))??
  • ????????{??
  • ????????????//?當在攻擊1狀態下,而且當前狀態執行了0.6正交化時間(即動作時長的60%),而且用戶在攻擊1狀態下又按下了“攻擊鍵”??
  • ????????????this.animator.SetInteger(ActionCMD,?1);??
  • ????????}??
  • ????????if?(stateInfo.IsName(AtkStabState)?&&?(stateInfo.normalizedTime?>?0.8f)?&&?(this.curComboCount?==?3))??
  • ????????{??
  • ????????????//?擋在攻擊2狀態下(同理攻擊1狀態)??
  • ????????????this.animator.SetInteger(ActionCMD,?1);??
  • ????????}??
  • ??
  • ????????if?(Input.GetKeyUp(KeyCode.J))??
  • ????????{??
  • ????????????//?監聽用戶輸入(如果J鍵為攻擊鍵)??
  • ????????????Attack();??
  • ????????}??
  • ????}??
  • [csharp]?view plaincopyprint?

  • void?Attack()??
  • ????{??
  • ????????AnimatorStateInfo?stateInfo?=?this.animator.GetCurrentAnimatorStateInfo(0);??
  • ????????if?(stateInfo.IsName(IdleState))??
  • ????????{??
  • ????????????//?在待命狀態下,按下攻擊鍵,進入攻擊1狀態。并記錄連擊數為1??
  • ????????????this.animator.SetInteger(ActionCMD,?1);??
  • ????????????this.curComboCount?=?1;??
  • ????????}??
  • ????????else?if?(stateInfo.IsName(AtkSliceState))??
  • ????????{??
  • ????????????//?在攻擊1狀態下,按下攻擊鍵,記錄連擊數為2(切換狀態在Update()中)??
  • ????????????this.curComboCount?=?2;??
  • ????????}??
  • ????????else?if?(stateInfo.IsName(AtkStabState))??
  • ????????{??
  • ????????????//?在攻擊2狀態下,按下攻擊鍵,記錄連擊數為3(切換狀態在Update()中)??
  • ????????????this.curComboCount?=?3;??
  • ????????}??
  • ????}?????

  • 這里必須注意的是該。在Update() 二手0.6和0.8 分別低于目前的狀態應該跳轉到待機參數Exit Time(這一次也正交)

    轉載于:https://www.cnblogs.com/hrhguanli/p/4752966.html

    總結

    以上是生活随笔為你收集整理的Unity3D 4.x 使用Mecanim实现动画控制的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。