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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/7/19 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity3D 4.x 使用Mecanim实现动画控制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Unity3D 4.x 版本號(hào)之后提供了一種新的動(dòng)畫機(jī)制Mecanim,盡管眼下還支持之前的Animation。但看到Unity3D 4.3?預(yù)覽版里Sprite的動(dòng)畫也是基于Animator的,可知Mecanim將會(huì)是以后動(dòng)畫播放的趨勢(shì)!

Mecanim是一種基于狀態(tài)機(jī)的結(jié)構(gòu),不同的狀態(tài)表示一個(gè)動(dòng)作(或者多個(gè)動(dòng)作融合,或者一個(gè)子狀態(tài)機(jī))。狀態(tài)之間使用一種稱為Transition的組件關(guān)聯(lián),Transition中能夠設(shè)定一些條件,當(dāng)在Transition“源狀態(tài)”下。滿足其條件之后。將自己主動(dòng)跳轉(zhuǎn)到Transition“目的狀態(tài)”!

(詳細(xì)使用方法請(qǐng)參照Unity3D手冊(cè)Mecanim)

在一些ARPG的游戲中,比方 端游的DNF和闖關(guān)類的街機(jī)游戲,連續(xù)按攻擊鍵都會(huì)觸發(fā)一套組合攻擊。在這個(gè)過(guò)程中敵人通常是硬直狀態(tài)的。并且組合攻擊的最后一下通常是重?fù)簟_@樣做既添加了連擊帶來(lái)的爽快感。又促使玩家在攻擊時(shí)採(cǎi)取一定的攻擊策略。

Mecanim的狀態(tài)機(jī)設(shè)計(jì)就非常方便的使開(kāi)發(fā)人員實(shí)現(xiàn)了這一效果。


1.動(dòng)畫狀態(tài)機(jī)

這里僅僅用4個(gè)動(dòng)作描寫敘述,待命狀態(tài)(Idle)。攻擊1狀態(tài)(AtkSlice),攻擊2狀態(tài)(AtkStab),攻擊3狀態(tài)(AtkCleave),3個(gè)攻擊狀態(tài)分別表示連續(xù)按下“普通攻擊鍵”時(shí)觸發(fā)的狀態(tài),是有先后順序關(guān)系的。即假設(shè)在待命狀態(tài)下按下“攻擊鍵”,則進(jìn)入攻擊1狀態(tài)。假設(shè)在攻擊1狀態(tài)下繼續(xù)按下“攻擊鍵”。則進(jìn)入攻擊2狀態(tài)。假設(shè)不按下“攻擊鍵”,則回到待命狀態(tài)攻擊2狀態(tài)到攻擊3狀態(tài)同理。攻擊3狀態(tài)覺(jué)得是重?fù)簟<催B擊結(jié)束。回到待命狀態(tài)。

狀態(tài)圖例如以下


我希望能以最少的代碼和設(shè)置完畢這個(gè)功能。所以僅僅加入了一個(gè)狀態(tài)機(jī)參數(shù) ActionCMD,如果 ActionCMD = 1 為進(jìn)入攻擊狀態(tài)參數(shù)

(1)在隨意3種攻擊狀態(tài)下,不再繼續(xù)按下“攻擊鍵”,則回到待命狀態(tài),即上圖 3條白色Transition

(2)在待命。攻擊1,攻擊2狀態(tài)下,繼續(xù)按下“攻擊鍵”,則跳轉(zhuǎn)到連擊狀態(tài)(即下一個(gè)攻擊狀態(tài))。即上圖3條藍(lán)色Transition


2.代碼實(shí)現(xiàn)

(1)狀態(tài)機(jī)設(shè)置完畢之后,要做的就是在代碼中完畢對(duì)當(dāng)前狀態(tài)的推斷,以及對(duì)狀態(tài)參數(shù)的設(shè)置。用以完畢動(dòng)畫狀態(tài)機(jī)的切換!

[csharp]?view plaincopyprint?
  • //?使用字符串變量保存當(dāng)前狀態(tài)。避免多處引用寫錯(cuò)??
  • ????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";??
  • ????//?動(dòng)畫狀態(tài)機(jī)參數(shù)Key??
  • ????private?static?readonly?string?ActionCMD?=?"ActionCMD";??
  • ??
  • ????private?Animator?animator?=?null;??
  • ????//?當(dāng)前連擊數(shù)(即?玩家按下攻擊鍵的次數(shù))??
  • ????private?int?curComboCount?=?0;??
  • (2)在Start() 中獲取Animator組件引用

    (3)在Update() 中依據(jù)當(dāng)前狀態(tài)和輸入?yún)?shù)促使?fàn)顟B(tài)切換

    [csharp]?view plaincopyprint?
  • void?Update()??
  • ????{??
  • ????????AnimatorStateInfo?stateInfo?=?this.animator.GetCurrentAnimatorStateInfo(0);??
  • ????????if?(!stateInfo.IsName(IdleState))??
  • ????????{??
  • ????????????//?每次設(shè)置完參數(shù)之后,都應(yīng)該在下一幀開(kāi)始時(shí)將參數(shù)設(shè)置清空,避免連續(xù)切換??
  • ????????????this.animator.SetInteger(ActionCMD,?0);??
  • ????????}??
  • ??
  • ????????if?(stateInfo.IsName(AtkSliceState)?&&?(stateInfo.normalizedTime?>?0.6f)?&&?(this.curComboCount?==?2))??
  • ????????{??
  • ????????????//?當(dāng)在攻擊1狀態(tài)下,而且當(dāng)前狀態(tài)執(zhí)行了0.6正交化時(shí)間(即動(dòng)作時(shí)長(zhǎng)的60%),而且用戶在攻擊1狀態(tài)下又按下了“攻擊鍵”??
  • ????????????this.animator.SetInteger(ActionCMD,?1);??
  • ????????}??
  • ????????if?(stateInfo.IsName(AtkStabState)?&&?(stateInfo.normalizedTime?>?0.8f)?&&?(this.curComboCount?==?3))??
  • ????????{??
  • ????????????//?擋在攻擊2狀態(tài)下(同理攻擊1狀態(tài))??
  • ????????????this.animator.SetInteger(ActionCMD,?1);??
  • ????????}??
  • ??
  • ????????if?(Input.GetKeyUp(KeyCode.J))??
  • ????????{??
  • ????????????//?監(jiān)聽(tīng)用戶輸入(如果J鍵為攻擊鍵)??
  • ????????????Attack();??
  • ????????}??
  • ????}??
  • [csharp]?view plaincopyprint?

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

  • 這里必須注意的是該。在Update() 二手0.6和0.8 分別低于目前的狀態(tài)應(yīng)該跳轉(zhuǎn)到待機(jī)參數(shù)Exit Time(這一次也正交)

    轉(zhuǎn)載于:https://www.cnblogs.com/hrhguanli/p/4752966.html

    總結(jié)

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

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。