Unity初學(xué)者實踐與提高(三)---Animator Controller

Animator Controller

簡介

接著上一章的內(nèi)容竟贯,上一章導(dǎo)入了角色資源,并且關(guān)聯(lián)了跑步動畫逝钥,但是實際項目中只會原地跑步肯定不行屑那,應(yīng)該是平時站立(Idle)拱镐,接到玩家輸入不同事件,做出相應(yīng)的動作持际,比如開始走路沃琅,開始攻擊,閃避蜘欲,跳躍等等益眉。
那是不是給事件寫個響應(yīng)函數(shù),里面設(shè)置角色播放的動畫呢姥份?這當(dāng)然可以實現(xiàn)想要的功能郭脂,但是耦合性太強(qiáng)了,不利于擴(kuò)展澈歉,也不好處理一些復(fù)雜情況展鸡,比如隨著速度不同,播放走和跑埃难,甚至速度在兩者之間的時候莹弊,根據(jù)速度做插值動作融合。還有時需要上身做端著槍的動作涡尘,下身做跑步動作等等忍弛,情況很復(fù)雜,如果都用代碼去控制悟衩,那對代碼的維護(hù)將是一個噩夢剧罩。
既然直接控制不好,那應(yīng)該怎么做呢座泳?這里就要引出動畫控制(Animator Controller)組件了,它是用戶控制動畫系統(tǒng)的有限狀態(tài)機(jī)惠昔,可以靈活的定義一些狀態(tài),并指定在不同的狀態(tài)之間切換的條件挑势。外圍邏輯镇防,只要控制條件里的變量,動作自動完成之前定義好的效果潮饱。

Animator組件

組件

首先確保角色對象上有Animator組件(如果沒有来氧,點擊Inspector面板下面的Add Component按鈕,選擇Animator即可添加),這個組件其它屬性請自行查閱Unity文檔香拉,這里我們只關(guān)心Controller,這個指向的就是我們上面提到的Animator Controller.

動畫狀態(tài)機(jī)

找到上一章創(chuàng)建的RoleController,刪除RunForward節(jié)點啦扬,恢復(fù)到剛創(chuàng)建時的狀況,我們剛才也說了凫碌,角色平時應(yīng)該是站立(Idle)狀態(tài)扑毡,那我們就去資源管理器中找到這個動作,點擊右邊三角形展開盛险,可以看到其中命名為Idle的Clip,首先我們選中它瞄摊,就可以在Inspector面板中設(shè)置它的一些屬性以及預(yù)覽


Idle clip

下面我們把它拖到編輯器中:


Idle

這個時候勋又,我們就建立了一個新的Idle狀態(tài),看Inspector面板中Motion值指向的是剛才看到的Idle的動作剪輯。
綠色的Entry是開始進(jìn)入時第一個狀態(tài)换帜,因為它到Idle狀態(tài)的切換規(guī)則是無條件切換楔壤,所以進(jìn)來后會馬上轉(zhuǎn)入Idle狀態(tài),而Idle狀態(tài)又對應(yīng)Idle clip,所以保存Animator controller,然后運(yùn)行項目惯驼,會看到角色處于閑置站立狀態(tài)了蹲嚣,不再原地跑步。
Idle效果

好了跳座,現(xiàn)在第一步已經(jīng)實現(xiàn)了端铛,下面就開始實現(xiàn)角色的移動動畫,注意是動畫疲眷,移動時應(yīng)該播放的動畫禾蚕,而不是移動,也就是說狂丝,還是原地播放動畫换淆。
上面提到了外圍邏輯代碼控制變量改變動畫狀態(tài),那我們先創(chuàng)建變量几颜,點擊Parameters Table頁倍试,點后面的加號按鈕,創(chuàng)建三個Float類型的變量蛋哭,分別用來控制速度和運(yùn)動方向县习,如下圖所示:


創(chuàng)建變量

變量有了,我們再創(chuàng)建一個新的狀態(tài)谆趾,這次我們不直接根據(jù)動作創(chuàng)建狀態(tài)躁愿,而是右鍵點擊中間面板,選Create Sub-State Machine,這將創(chuàng)建一個子狀態(tài)機(jī)沪蓬,并且命名為MoveState彤钟,用于封裝比較復(fù)雜的狀態(tài)情況(這里只是演示,其實內(nèi)部并不復(fù)雜),然后我們右鍵單擊之前的Idle狀態(tài)跷叉,選Make Transition, 然后點擊剛剛創(chuàng)建的子狀態(tài)機(jī)逸雹,出現(xiàn)的菜單中選擇整個狀態(tài)機(jī),就會出現(xiàn)一個連線到它上邊云挟,表示可以從Idle狀態(tài)切換到子狀態(tài)機(jī)MoveState梆砸,點擊連線,在Inspector面板中Conditions后面點擊加號按鈕园欣,選擇speed參數(shù)Greater,0.001,如下圖:
狀態(tài)轉(zhuǎn)換

這樣就定義好了狀態(tài)切換條件帖世,就是當(dāng)參數(shù)speed大于0.001的時候,就從Idle切換到MoveState俊庇。
可以換狀態(tài)了狮暑,但是到了新狀態(tài),還沒有具體的動畫辉饱,現(xiàn)在我們開始制作子狀態(tài)機(jī)搬男,雙擊MoveState將進(jìn)入子狀態(tài)機(jī)的編輯面板,可以看到彭沼,它和之前新建狀態(tài)機(jī)的編輯器是一樣的缔逛,同樣進(jìn)來會是Entry狀態(tài)。
在添加新狀態(tài)之前姓惑,我們梳理一下導(dǎo)入的資源褐奴,發(fā)現(xiàn)關(guān)于移動的動作有向前跑,向后跑于毙,向左敦冬,向右,左后唯沮,右后這幾個脖旱,開始也說了,這種復(fù)雜情況介蛉,用狀態(tài)機(jī)比較好控制萌庆,下面我們就創(chuàng)建一個新的狀態(tài),但這次是使用Blend Tree, 這是一個動畫混合樹币旧,用來混合前面提到的幾個移動動作践险。
面板中點擊右鍵,選擇Create State->From New BlendTree,
雙擊BlendTree節(jié)點吹菱,進(jìn)入編輯界面:

混合樹

這次信息量有點大巍虫,首先單擊BlendTree,在Inspector面板中選擇BlendType為2D Simple Directional。
Parameters選擇dirX和dirY毁葱,用以表示方向垫言。
然后單擊Motion后面的加號按鈕6次,添加六個動作倾剿,分別指定為上面提到的動作筷频,PosX,PosY參數(shù)參照截圖填寫,這里指定當(dāng)兩個參數(shù)分別為什么值時播放這個動畫前痘,其余值根據(jù)距離這些值的差值凛捏,做插值混合。你可以調(diào)整各數(shù)值芹缔,看看上面圖中的幾個小藍(lán)點的變化坯癣,就可以理解了,同時拖動藍(lán)點中間的紅點最欠,可以在右下角的預(yù)覽窗口中看到混合的結(jié)果示罗。
現(xiàn)在跑動狀態(tài)建好了惩猫,還要創(chuàng)建一個跳回上級狀態(tài)機(jī)的連線,右鍵單擊BlendTree,選Make Transition, 再點擊(Up)BaseLayer,選整個狀態(tài)機(jī)蚜点,然后設(shè)定跳轉(zhuǎn)條件為speed less 0.01.這樣速度小了就可以切換回上級狀態(tài)機(jī)了轧房。
離開子狀態(tài)機(jī)

好了,動畫狀態(tài)機(jī)我們就準(zhǔn)備好了绍绘,保存奶镶。

動畫驅(qū)動邏輯

現(xiàn)在是時候制作前面講的外圍邏輯了,由于還沒有接入輸入系統(tǒng)陪拘,我們做個簡單的界面厂镇,用三個滑桿控制三個變量,看看效果.
這里就不講創(chuàng)建過程了左刽,到后面講UI系統(tǒng)的時候捺信,會有詳細(xì)過程,效果如下:


效果

調(diào)節(jié)三個滑桿欠痴,分別觀察一下他們的作用吧残黑。
接下來可以看看邏輯驅(qū)動的代碼:

public class AnimatorController : MonoBehaviour
{
    public Animator animtor;
    
    public void OnSpeedChanged(float value)
    {
        animtor.SetFloat("speed", value);   
    }

    public void OnDirXChanged(float value)
    {
        animtor.SetFloat("dirX", value);
    }

    public void OnDirYChanged(float value)
    {
        animtor.SetFloat("dirY", value);
    }
}

驅(qū)動邏輯變得很整潔,只需要改變動畫控制器的幾個變量斋否,就達(dá)到了控制動畫播放的目的梨水,復(fù)雜的邏輯通過圖形操作的方式封裝在狀態(tài)機(jī)里了。
同樣給出今天教程配套的項目地址: Animator Controller


返回主目錄
【轉(zhuǎn)載請注明出處】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茵臭,一起剝皮案震驚了整個濱河市疫诽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旦委,老刑警劉巖奇徒,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缨硝,居然都是意外死亡摩钙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門查辩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胖笛,“玉大人,你說我怎么就攤上這事宜岛〕び唬” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵萍倡,是天一觀的道長身弊。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么阱佛? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任帖汞,我火速辦了婚禮,結(jié)果婚禮上凑术,老公的妹妹穿的比我還像新娘涨冀。我一直安慰自己,他們只是感情好麦萤,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扁眯,像睡著了一般壮莹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姻檀,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天命满,我揣著相機(jī)與錄音,去河邊找鬼绣版。 笑死胶台,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杂抽。 我是一名探鬼主播诈唬,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缩麸!你這毒婦竟也來了铸磅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤杭朱,失蹤者是張志新(化名)和其女友劉穎阅仔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弧械,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡八酒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了刃唐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羞迷。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖画饥,靈堂內(nèi)的尸體忽然破棺而出闭树,到底是詐尸還是另有隱情,我是刑警寧澤荒澡,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布报辱,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碍现。R本人自食惡果不足惜幅疼,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昼接。 院中可真熱鬧爽篷,春花似錦、人聲如沸慢睡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漂辐。三九已至泪喊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間髓涯,已是汗流浹背袒啼。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留纬纪,地道東北人蚓再。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像包各,于是被迫代替她去往敵國和親摘仅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容