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ī)的創(chuàng)建:右擊Animator窗口的空白區(qū)域>>Create Sub-State Machine(創(chuàng)建子狀態(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ī)中有一個(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)以供連接
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
<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