淺談Unity動(dòng)畫(huà)

1.子狀態(tài)機(jī)

(1)將一組狀態(tài)收縮到一個(gè)單獨(dú)命名的控件中,這個(gè)控件就叫做子狀態(tài)機(jī)

作用:在復(fù)雜動(dòng)作很多的時(shí)候?qū)⒁唤M復(fù)雜動(dòng)作放在一個(gè)子狀態(tài)機(jī)中纵穿,這樣可以不讓狀態(tài)機(jī)顯得那么臃腫,所以我們引進(jìn)了子狀態(tài)機(jī)的概念

有些角色可能有多個(gè)狀態(tài)組成的復(fù)雜動(dòng)作奢人,我們把這些狀態(tài)放在子狀態(tài)機(jī)中谓媒,形成一個(gè)動(dòng)作序列。何乎,下圖是一組動(dòng)作句惯,我們將它放在了一個(gè)子狀態(tài)機(jī)中,動(dòng)作狀態(tài)序列:首先蹲下支救,然后射擊抢野,最后重新站起來(lái)

子狀態(tài)機(jī)中的一組動(dòng)作狀態(tài)序列

子狀態(tài)機(jī)的創(chuàng)建:右擊Animator窗口的空白區(qū)域>>Create Sub-State Machine(創(chuàng)建子狀態(tài)機(jī))

子狀態(tài)機(jī)的樣式:


子狀態(tài)機(jī)

子狀態(tài)機(jī)的使用:雙擊子狀態(tài)機(jī),編輯器會(huì)刷新各墨,以便你像編輯一個(gè)完全分離的狀態(tài)機(jī)那樣編輯這個(gè)子狀態(tài)機(jī)指孤。在頂部顯示的一個(gè)“導(dǎo)航路徑”顯示了當(dāng)前所編輯的子狀態(tài)機(jī)(注意:你可以為子狀態(tài)機(jī)創(chuàng)建新的子狀態(tài)機(jī)),點(diǎn)擊某個(gè)條目將會(huì)使編輯器轉(zhuǎn)至那個(gè)子狀態(tài)機(jī)


(2)關(guān)于外部狀態(tài)的轉(zhuǎn)移

當(dāng)你將狀態(tài)轉(zhuǎn)至一個(gè)子狀態(tài)機(jī)時(shí)贬堵,你必須選一個(gè)你要連接的狀態(tài)(以供連接)恃轩,選擇一個(gè)子狀態(tài)機(jī)中的目標(biāo)狀態(tài)


選擇子狀態(tài)機(jī)中的目標(biāo)狀態(tài)

子狀態(tài)機(jī)中有一個(gè)以“上層(Up)”作為前綴的額外狀態(tài)


這個(gè)“上層(Up)”表示的是“外部世界”,在視圖中狀態(tài)機(jī)包含整個(gè)子狀態(tài)機(jī)黎做,如果你為子狀態(tài)機(jī)的某個(gè)狀態(tài)添加一個(gè)指向“上層”狀態(tài)的狀態(tài)轉(zhuǎn)移叉跛,你需要指定一個(gè)外部狀態(tài)機(jī)的狀態(tài)以供連接


連接至外部狀態(tài)機(jī)的狀態(tài)




2.通過(guò)HashID控制動(dòng)畫(huà)過(guò)渡

(1)雙擊動(dòng)畫(huà)控制器,在Animator窗口中的Parameters設(shè)置3個(gè)參數(shù)引几,把這些參數(shù)作為過(guò)渡線是否過(guò)渡的條件

(2)我們創(chuàng)建一個(gè)腳本GetHashID,將各個(gè)狀態(tài)參數(shù)轉(zhuǎn)換為HashID的數(shù)(轉(zhuǎn)換成HashID的值:int變量=Animator.StringToHash(狀態(tài)參數(shù)名))挽铁,并用int類型的數(shù)據(jù)接收

(3)更改動(dòng)畫(huà)狀態(tài)參數(shù)的方法有兩個(gè)重載:

重載一:動(dòng)畫(huà)對(duì)象.SetXXX(動(dòng)畫(huà)狀態(tài)參數(shù)名,動(dòng)畫(huà)狀態(tài)參數(shù)的值)伟桅;

重載二:動(dòng)畫(huà)對(duì)象.SetXXX(HashID,HashID對(duì)應(yīng)的動(dòng)畫(huà)狀態(tài)參數(shù)的值);

其實(shí)重載一中,系統(tǒng)自動(dòng)將動(dòng)畫(huà)狀態(tài)參數(shù)名轉(zhuǎn)換成了HashID,只是我們不知道叽掘,但在平時(shí)的工作中我們還是選擇第二種方法楣铁,將動(dòng)畫(huà)狀態(tài)參數(shù)放在一個(gè)專門進(jìn)行HashID轉(zhuǎn)換的腳本里進(jìn)行管理,而第一種方法會(huì)消耗系統(tǒng)的資源更扁,給系統(tǒng)增加工作負(fù)擔(dān)盖腕,不建議使用


3.融合樹(shù)

(1)使用融合樹(shù)

<1>拖入模型


<2>創(chuàng)建角色控制器


<3>創(chuàng)建融合樹(shù)

雙擊動(dòng)畫(huà)控制器,右擊Animator窗口中的空白區(qū)域>>Create State>>From New Blend Tree


添加融合樹(shù)


融合樹(shù)

<4>雙擊Blend Tree,進(jìn)入內(nèi)部

<5>選中融合樹(shù)浓镜,右邊面板中點(diǎn)擊加號(hào)溃列,選擇Add Motion Field



<6>這里我們添加5個(gè)動(dòng)畫(huà)剪輯

<7>將融合類型選為2D簡(jiǎn)單移動(dòng)(只能在一個(gè)方向播放一個(gè)動(dòng)畫(huà))

<8>這里我們需要在Animator窗口中添加兩個(gè)動(dòng)畫(huà)狀態(tài)參數(shù)

<9>然后點(diǎn)擊融合樹(shù),右邊面板中的參數(shù)設(shè)置成在動(dòng)畫(huà)狀態(tài)參數(shù)的SpeedX膛薛、SpeedY听隐,分別表示在x軸方向的速度和在y軸方向的速度

<10>把站立、左走哄啄、右走雅任、前進(jìn)风范、后退這5個(gè)動(dòng)畫(huà)剪輯拖到Motion中

<11>此時(shí)Animator窗口中的融合樹(shù)變成了整個(gè)樣子

<12>把動(dòng)畫(huà)控制器掛載在模型身上

<12>5個(gè)動(dòng)畫(huà)剪輯的位置偏移分別設(shè)置為(0,0)(-1沪么,0)(1硼婿,0)(0,1)(0禽车,-1)较曼,5個(gè)藍(lán)點(diǎn)代表5個(gè)動(dòng)畫(huà)剪輯的偏移量磅崭,在上面的大紅框中用鼠標(biāo)拖動(dòng)中間的紅點(diǎn)往不同的藍(lán)點(diǎn)方向移動(dòng)可以控制模型的動(dòng)畫(huà)剪輯播放,從而通過(guò)動(dòng)畫(huà)剪輯的偏移量改變位置(前提是你勾選了應(yīng)用根動(dòng)作)

<13>接下來(lái)我們創(chuàng)建一個(gè)腳本SwatMove,通過(guò)腳本控制模型播放動(dòng)畫(huà)蓖议,通過(guò)動(dòng)畫(huà)剪輯的偏移量來(lái)移動(dòng)

<14>將腳本掛載到模型的身上,通過(guò)W淀散、S棋傍、A、D鍵位進(jìn)行移動(dòng)



4.動(dòng)畫(huà)遮罩

(1)實(shí)例:實(shí)現(xiàn)邊走邊開(kāi)槍

<1>拖入模型


<2>創(chuàng)建動(dòng)畫(huà)控制器


<3>在Base Layer添加動(dòng)畫(huà)剪輯


<4>添加層New Layer


<5>在New Layer添加動(dòng)畫(huà)剪輯


<6>把模型身上的應(yīng)用根動(dòng)作取消(方便觀察)


<7>創(chuàng)建動(dòng)畫(huà)遮罩彻采,將下半身和和反向動(dòng)力學(xué)遮住



<8>點(diǎn)擊New Layer右上角的齒輪腐缤,將weight調(diào)到1


<9>給New Layer添加動(dòng)畫(huà)遮罩


<10>Blending設(shè)為Override

(2)通過(guò)代碼控制:

修改權(quán)重:動(dòng)畫(huà)對(duì)象.SetLayerWeight(層的序列,當(dāng)前層的權(quán)重值);

得到層的動(dòng)畫(huà)狀態(tài)信息:AnimatorStateInfo對(duì)象=Animator對(duì)象.GetCurrentAnimatorStateInfo(層的序列);


5.反向動(dòng)力學(xué)(IK)

使用的時(shí)候肛响,我們要將要使用IK的對(duì)象所在的動(dòng)畫(huà)層中的IK pass(反向動(dòng)力學(xué)通道)勾選上,被勾選上的層會(huì)出現(xiàn)IK字樣


(1)代碼控制:

我們需要設(shè)置一個(gè)布爾類型的標(biāo)志位來(lái)判斷是否啟用反向動(dòng)力學(xué)岭粤,使用的時(shí)候要設(shè)為true。

使用反向動(dòng)力學(xué)的方法:OnAnimatorIK()

設(shè)置骨骼的位置的權(quán)重:動(dòng)畫(huà)對(duì)象.SetIKPositionWeight(AvatarIKGoal.枚舉成員特笋,權(quán)重值)剃浇;

設(shè)置骨骼的旋轉(zhuǎn)的權(quán)重:動(dòng)畫(huà)對(duì)象.SetIKRotationWeight(AbatarIKGoal.枚舉成員,權(quán)重值)猎物;

設(shè)置節(jié)點(diǎn)(根據(jù)目標(biāo)去移動(dòng)和旋轉(zhuǎn)父物體的骨骼節(jié)點(diǎn)):

設(shè)置節(jié)點(diǎn)的位置:

動(dòng)畫(huà)對(duì)象.SetIKPosition(AvatarIKGoal.枚舉成員,跟隨的目標(biāo).position)虎囚;

設(shè)置節(jié)點(diǎn)的旋轉(zhuǎn):

動(dòng)畫(huà)對(duì)象.SetIKRotation(AvatarIKGoal.枚舉成員,跟隨的目標(biāo).rotation)


6.動(dòng)畫(huà)曲線:

(1)通過(guò)動(dòng)畫(huà)曲線自動(dòng)控制參數(shù)值的改變

<1>選中一個(gè)動(dòng)畫(huà)模型,點(diǎn)擊Animation


<2>往下滑蔫磨,有一個(gè)Curves(動(dòng)畫(huà)曲線),我們點(diǎn)擊加號(hào)添加一條動(dòng)畫(huà)曲線


<3>默認(rèn)這個(gè)曲線的名字是Curve淘讥,這里我們將它改為New Float,我們下面會(huì)說(shuō)到為什么


<4>右邊的曲線圖是可以雙擊打開(kāi)的


<5>打開(kāi)之后是這個(gè)樣子堤如,我們這里為了方便一會(huì)的檢測(cè)蒲列,在下方幾個(gè)系統(tǒng)自帶的曲線中選了第二個(gè)斜率為一個(gè)大于0的定值的曲線

<6>拖模型到場(chǎng)景中

<7>創(chuàng)建動(dòng)畫(huà)控制器

<8>雙擊控制器打開(kāi)Animator窗口,將動(dòng)畫(huà)剪輯拖到狀態(tài)機(jī)中

<9>在狀態(tài)參數(shù)里面添加一個(gè)跟剛剛添加的曲線一個(gè)名字的float類型的狀態(tài)參數(shù)搀罢,曲線會(huì)根據(jù)名字進(jìn)行匹配蝗岖,通過(guò)同名字的曲線的播放時(shí)間去控制同名字的狀態(tài)參數(shù)的值

<10>把動(dòng)畫(huà)控制器拖到模型的Animator組件中的Controller里

<11>下面我們檢測(cè)一下,是否是同名字的曲線的時(shí)間控制著同名字的狀態(tài)參數(shù)的值榔至,創(chuàng)建一個(gè)腳本

<12>代碼如下剪侮,當(dāng)狀態(tài)參數(shù)的值大于0.5的時(shí)候,打印下面的話

<13>把腳本掛載到模型身上

<14>點(diǎn)擊播放,當(dāng)動(dòng)畫(huà)剪輯播放到超過(guò)一半的時(shí)候瓣俯,打印了代碼中的話杰标,此時(shí)狀態(tài)參數(shù)的值也剛好過(guò)了0.5,說(shuō)明確實(shí)是同名字的動(dòng)畫(huà)曲線的播放時(shí)間控制著同名字的狀態(tài)參數(shù)的值



7.動(dòng)畫(huà)事件(可以用來(lái)給怪物減血)

<1>拖動(dòng)一個(gè)模型到場(chǎng)景中

<2>選擇要使用的模型彩匕,Rig>>Animation Type>>Humanoid(類人動(dòng)畫(huà))腔剂,Apply

<3>然后點(diǎn)擊Animation

<4>下滑,點(diǎn)擊Clips(動(dòng)畫(huà)剪輯)的添加按鈕驼仪,添加動(dòng)畫(huà)剪輯

<5>選中此動(dòng)畫(huà)剪輯掸犬,選擇一段剪輯長(zhǎng)度,點(diǎn)擊Apply

<6>再往下滑绪爸,點(diǎn)擊Events湾碎,添加幀在這段動(dòng)畫(huà)剪輯中

<7>上面的小紅塊是我們添加的幀,下面是當(dāng)動(dòng)畫(huà)剪輯播放到添加的這一幀上的時(shí)候奠货,我們可以添加動(dòng)畫(huà)事件介褥,第一個(gè)是我們添加的函數(shù),可以是空參的函數(shù)递惋,也可以是以下的類型的參數(shù)(Float柔滔、Int、String萍虽、Object)

注意:1)動(dòng)畫(huà)事件既能使用私有方法也能使用共有方法

? ? ? ? ?? 2)動(dòng)畫(huà)事件可以傳遞參數(shù)睛廊,但是參數(shù)只能有一個(gè),而且必須是系統(tǒng)指定的類型

<8>右擊動(dòng)畫(huà)播放的時(shí)間軸杉编,可以添加和刪除動(dòng)畫(huà)事件(幀)

<9>創(chuàng)建一個(gè)動(dòng)畫(huà)控制器超全,雙擊打開(kāi)

<10>將自己剪輯的動(dòng)畫(huà)剪輯拖到狀態(tài)機(jī)中

<11>然后將添加了動(dòng)畫(huà)剪輯的動(dòng)畫(huà)控制器拖到模型的Animator組件中

然后點(diǎn)擊播放,如果這個(gè)動(dòng)畫(huà)剪輯有動(dòng)畫(huà)事件邓馒,那么就會(huì)在播放到存在事件的那一幀的時(shí)候觸發(fā)事件嘶朱,注意如果添加了幀卻沒(méi)有事件的話會(huì)報(bào)錯(cuò)


8.錄制動(dòng)畫(huà)

這里的動(dòng)畫(huà)是廣義上的動(dòng)畫(huà),包括改變一個(gè)屬性也算是動(dòng)畫(huà)绒净,不只有2D有動(dòng)畫(huà)见咒,3D也有偿衰。

(1)創(chuàng)建一個(gè)正方體挂疆,點(diǎn)擊Window>>Animation

(2)選中正方體,然后在彈出的Animation窗口中點(diǎn)擊Create

(3)點(diǎn)擊錄制下翎,依此往右是添加幀缤言,添加動(dòng)畫(huà)事件,播放時(shí)間


(4)圖中的紅框里的是動(dòng)畫(huà)事件视事,不給它方法會(huì)報(bào)錯(cuò)胆萧,事件是藍(lán)色的,而幀是白色的

這里只是簡(jiǎn)單的講一下錄制動(dòng)畫(huà),重點(diǎn)說(shuō)明這是廣義上的動(dòng)畫(huà)跌穗。

關(guān)于Unity動(dòng)畫(huà)就到這里订晌,今天學(xué)的是真的多=-=心塞ing

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蚌吸,隨后出現(xiàn)的幾起案子锈拨,更是在濱河造成了極大的恐慌,老刑警劉巖羹唠,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奕枢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡佩微,警方通過(guò)查閱死者的電腦和手機(jī)缝彬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哺眯,“玉大人谷浅,你說(shuō)我怎么就攤上這事∽骞海” “怎么了壳贪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)寝杖。 經(jīng)常有香客問(wèn)我违施,道長(zhǎng),這世上最難降的妖魔是什么瑟幕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任磕蒲,我火速辦了婚禮,結(jié)果婚禮上只盹,老公的妹妹穿的比我還像新娘辣往。我一直安慰自己,他們只是感情好殖卑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布站削。 她就那樣靜靜地躺著,像睡著了一般孵稽。 火紅的嫁衣襯著肌膚如雪许起。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天菩鲜,我揣著相機(jī)與錄音园细,去河邊找鬼。 笑死接校,一個(gè)胖子當(dāng)著我的面吹牛猛频,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鹿寻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼睦柴!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起毡熏,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤爱只,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后招刹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體恬试,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年疯暑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了训柴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妇拯,死狀恐怖幻馁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情越锈,我是刑警寧澤仗嗦,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站甘凭,受9級(jí)特大地震影響稀拐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丹弱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一德撬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧躲胳,春花似錦蜓洪、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至粹湃,卻和暖如春恐仑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背再芋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工菊霜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坚冀,地道東北人济赎。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親司训。 傳聞我的和親對(duì)象是個(gè)殘疾皇子构捡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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

  • 今天參加區(qū)上安排的培訓(xùn),收獲多多壳猜,下午跟代唐勾徽,親教一起吃晚飯,晚飯后喝茶统扳,等到了冰利和蘇堅(jiān)喘帚,小組就差楊芳和樊飛了,...
    卓彤的美好時(shí)光閱讀 156評(píng)論 0 0