摘要:“Animator中有一個(gè)功能届谈,用來(lái)解決多個(gè)動(dòng)畫(huà)之間的混合,經(jīng)常用于移動(dòng)動(dòng)畫(huà)之間的混合弯汰,這個(gè)功能叫做BlendTree艰山,混合樹(shù)。”
大話Unity咏闪,讓你快人幾步曙搬。你好,我是跟著大智學(xué)Unity的萌新鸽嫂,我叫小新纵装,這幾周一起來(lái)復(fù)(yu)習(xí)(xi)動(dòng)畫(huà)系統(tǒng)。
“智哥据某,我用Animator做了一個(gè)人物移動(dòng)的狀態(tài)機(jī)橡娄,怎么看怎么不順眼,這也太復(fù)雜了癣籽,你來(lái)看看挽唉?”
“喲,這不是挺規(guī)整的嘛筷狼,我看起來(lái)挺順眼的瓶籽,哈哈哈”
“去去去,我這光一個(gè)走路的就得搞這么復(fù)雜埂材,而且還沒(méi)法斜著跑塑顺,我這做一個(gè)動(dòng)畫(huà),這得多少個(gè)狀態(tài)啊”
“emmm楞遏,我這有一個(gè)秒招茬暇,不知道你想學(xué)不想學(xué)?”
“那當(dāng)然想學(xué)了寡喝,看我每天學(xué)習(xí)的熱情多么高漲”
“那你先帶我去把晚飯解決了”
“哎呀糙俗,咱們點(diǎn)個(gè)外賣(mài),我已經(jīng)等不及了,吃飯這都不重要”
“那也成诡必,給我來(lái)個(gè)10斤的龍蝦,點(diǎn)好了再來(lái)找我”
小新花了30秒搞定外賣(mài)瑰剃,“快快快劈彪,開(kāi)始上課竣蹦!”
“看你小子猴急的,以后能成大器沧奴,嘿嘿”
BlendTree 混合樹(shù)
“Animator中有一個(gè)功能痘括,用來(lái)解決多個(gè)動(dòng)畫(huà)之間的混合,經(jīng)常用于移動(dòng)動(dòng)畫(huà)之間的混合滔吠,這個(gè)功能叫做BlendTree纲菌,混合樹(shù)。”
“混合樹(shù)和Transition中的混合有啥區(qū)別呢疮绷?”
“混合樹(shù)和Transition中的混合不同翰舌,Transition中的混合只是在兩個(gè)State轉(zhuǎn)換時(shí),在給定的時(shí)間內(nèi)進(jìn)行混合冬骚,避免動(dòng)畫(huà)切換過(guò)于突兀椅贱。而混合樹(shù)中的混合,是時(shí)時(shí)刻刻進(jìn)行不同程度的混合只冻。比如你的角色有站立庇麦、走、跑三個(gè)動(dòng)作属愤,走路的速度是2m/s女器,跑的速度是5m/s,那你想讓角色的速度是3m/s住诸,這時(shí)候怎么辦驾胆?這時(shí)候用混合樹(shù)就能很簡(jiǎn)單地解決〖牛”
“聽(tīng)起來(lái)很厲害丧诺,那你用我的這個(gè)移動(dòng)的例子給我講講怎么搞唄?”
“不要著急奄薇,這時(shí)候你應(yīng)該先去看看混合樹(shù)的文檔驳阎,自己試試,看看會(huì)遇到什么問(wèn)題”
“好馁蒂,那我先去看看文檔”
“嗯呵晚,對(duì)了,我的大龍蝦呢沫屡?”
“嘿嘿饵隙,大龍蝦沒(méi)有,不過(guò)給你點(diǎn)了個(gè)龍蝦飯沮脖,看我夠意思吧”
“哎金矛,湊活吧芯急,以后再讓我教你可就難啦”
小新回到自己的房間,開(kāi)始學(xué)習(xí)混合樹(shù)的文檔驶俊,并且記了筆記娶耍。
創(chuàng)建混合樹(shù)
在Animator窗口的空白處右鍵,Create State > From New Blend Tree饼酿,雙擊這個(gè)節(jié)點(diǎn)可以進(jìn)入混合樹(shù)圖榕酒。
混合樹(shù)有3種類(lèi)型,在右邊的Blend Type中可以設(shè)置故俐。分別為:
- 1D
- 2D
- Direct
1D混合
1D混合是根據(jù)一個(gè)參數(shù)進(jìn)行動(dòng)畫(huà)混合奈应。
1、首先要設(shè)置用于混合的參數(shù)购披,也就是從Animator的Parameters中的選擇一個(gè)參數(shù)。
2肩榕、添加動(dòng)畫(huà):可以點(diǎn)擊小加號(hào)按鈕刚陡,或者在Blend Tree節(jié)點(diǎn)上右鍵Add Motion。點(diǎn)擊后會(huì)在Motion列表中添加一個(gè)條目株汉,可以將Animation Clip拖進(jìn)來(lái)筐乳。
添加完動(dòng)畫(huà),整個(gè)混合的樣子:
最上面的圖顯示了參數(shù)對(duì)每個(gè)動(dòng)畫(huà)的影響乔妈。每個(gè)動(dòng)畫(huà)顯示為一個(gè)藍(lán)色的三角形蝙云。如果點(diǎn)擊這個(gè)三角形,會(huì)在下面的動(dòng)畫(huà)列表中高亮一下路召。每個(gè)三角形的頂角位置定義了參數(shù)在該位置時(shí)勃刨,會(huì)完全使用這個(gè)動(dòng)畫(huà),這個(gè)值也叫做該動(dòng)畫(huà)的閾值(Threshold)股淡。比如上圖中的run動(dòng)畫(huà)身隐,閾值是0.5,在混合圖的中心位置唯灵。
圖中的紅線代表了參數(shù)的數(shù)值贾铝,主要是用來(lái)預(yù)覽調(diào)試〔号粒可以拖動(dòng)紅線垢揩,在下面預(yù)覽窗口觀察動(dòng)畫(huà)式如何混合的。
參數(shù)范圍
上圖中叁巨,左右兩個(gè)數(shù)字代表了參數(shù)的范圍。點(diǎn)擊數(shù)字可以變成輸入框修改琐驴,也可以在數(shù)字上拖拽調(diào)節(jié)俘种。修改時(shí)會(huì)影響到第一個(gè)動(dòng)畫(huà)和最后一個(gè)動(dòng)畫(huà)的閾值秤标。
Threshold 閾值
修改動(dòng)畫(huà)對(duì)應(yīng)的閾值可以直接拖拽對(duì)應(yīng)的藍(lán)色三角形。如果沒(méi)有勾選Automate Threshold(自動(dòng)計(jì)算閾值)宙刘,也可以在閾值編輯框中直接輸入數(shù)值苍姜。選中Automate Threshold(自動(dòng)計(jì)算閾值)時(shí),閾值會(huì)自動(dòng)在最小值和最大值之間自動(dòng)平均分布悬包。
下面有一個(gè)Compute Thresholds下拉框衙猪,使用這個(gè)下拉框,可以根據(jù)動(dòng)畫(huà)中的數(shù)據(jù)布近,自動(dòng)計(jì)算閾值垫释。數(shù)據(jù)包括:speed(速度),velocity x撑瞧、y棵譬、z(xyz三個(gè)軸分別的速度),angular speed(轉(zhuǎn)動(dòng)速度预伺,單位是角度或弧度)订咸。這些數(shù)據(jù)如何知道呢?
比如:走路動(dòng)畫(huà)的速度是1.5m/s酬诀,跑的速度是4m/s脏嚷,如果選擇Compute Thresholds中的Speed,walk動(dòng)畫(huà)的閾值會(huì)被設(shè)置為1.5瞒御,run動(dòng)畫(huà)的閾值會(huì)被設(shè)置為4父叙。
Time Scale
通過(guò)動(dòng)畫(huà)速度這一列(圖標(biāo)是一個(gè)表)可以調(diào)節(jié)動(dòng)畫(huà)的播放速度,比如你想讓跑步的動(dòng)畫(huà)播放速度變?yōu)樵瓉?lái)的2倍肴裙,可以設(shè)置為2趾唱。
**Adjust Time Scale > Homogeneous Speed ** 可以將動(dòng)畫(huà)的速度調(diào)整對(duì)應(yīng)到參數(shù)的最小值和最大值,但是保持動(dòng)畫(huà)的初始相對(duì)速度蜻懦。
這句話看得我欲生欲死鲸匿,得問(wèn)問(wèn)大智是什么意思
按鈕可以將動(dòng)畫(huà)的播放速度調(diào)整到動(dòng)畫(huà)列表中所有動(dòng)畫(huà)速度的平均值。
Mirroring 鏡像
上面復(fù)選框可以左右鏡像一個(gè)humanoid類(lèi)型的動(dòng)畫(huà)Clip阻肩。這個(gè)功能可以使用同一個(gè)動(dòng)畫(huà)創(chuàng)建出來(lái)兩個(gè)方向的動(dòng)畫(huà)带欢,可以節(jié)省一倍的存儲(chǔ)空間和內(nèi)存。
比如一個(gè)向左走的動(dòng)畫(huà)烤惊,通過(guò)鏡像可以創(chuàng)建出一個(gè)向右走的動(dòng)畫(huà)乔煞。
難點(diǎn)解析
這時(shí)候門(mén)鈴響了,“先生柒室,您的龍蝦飯到了渡贾。祝您用餐愉快,給個(gè)5星好評(píng)唄~”
“大智雄右,吃飯前問(wèn)你兩個(gè)問(wèn)題唄”
“不行空骚,我得看看這個(gè)龍蝦飯到底怎么樣”
說(shuō)著大智以迅雷不及掩耳之速拆開(kāi)了包裝纺讲,吃了幾口。
“嗯囤屹,還不錯(cuò)熬甚,心情大好,來(lái)問(wèn)吧肋坚!”
“我選的乡括,能不好吃嘛!”
“第一個(gè)問(wèn)題:自動(dòng)計(jì)算Threshold的時(shí)候智厌,那些動(dòng)畫(huà)的速度啊诲泌,旋轉(zhuǎn)速度怎么知道啊铣鹏?”
“選中一個(gè)Animation Clip敷扫,你可以看到這些數(shù)據(jù),比如這個(gè):”
“第一行是這個(gè)動(dòng)畫(huà)在xyz軸上的速度诚卸,第二行是旋轉(zhuǎn)速度呻澜。”
“原來(lái)在這惨险,這里我還沒(méi)仔細(xì)看過(guò)呢”
“以后會(huì)用到的”
“第二個(gè)問(wèn)題:**Adjust Time Scale > Homogeneous Speed **這個(gè)到底是干嘛的,怎么我看了半天都沒(méi)看明白文檔中的含義脊髓?”
“我記得文檔中的解釋有一些難理解辫愉,其實(shí)這個(gè)按鈕的作用就是:先將所有動(dòng)畫(huà)的平均速度算出來(lái),然后通過(guò)調(diào)節(jié)動(dòng)畫(huà)的speed讓所有動(dòng)畫(huà)的速度都一致将硝。”
“肮Ю省?真的么依疼?我怎么看文檔跟這個(gè)一點(diǎn)聯(lián)系都沒(méi)有呢痰腮?”
“不信你去試試,看看是不是我說(shuō)的這樣”
“OK律罢,你趕緊吃飯吧膀值,我要繼續(xù)去看了,2D混合樹(shù)還沒(méi)看呢”
小新回到房間繼續(xù)學(xué)習(xí)2D混合樹(shù)误辑,下面是他做的學(xué)習(xí)筆記沧踏。
2D混合樹(shù)
2D混合樹(shù)可以根據(jù)2個(gè)參數(shù)進(jìn)行動(dòng)畫(huà)混合。
2D混合樹(shù)有三個(gè)選項(xiàng)巾钉,分別是:
2D Simple Directional(2D簡(jiǎn)單方向):當(dāng)你的運(yùn)動(dòng)代表不同的方向翘狱,如“向前走”,“向后走”砰苍,“向左走”潦匈,“向右走”阱高,或“向上瞄準(zhǔn)”,“向下瞄準(zhǔn)”茬缩,“左瞄“和”右瞄“赤惊。當(dāng)然了,可以在(0,0)處包含一個(gè)默認(rèn)動(dòng)作類(lèi)似“空閑站立”或“直線瞄準(zhǔn)”寒屯。與1D混合樹(shù)不同的是荐捻,2D Simple Directional不是在同一個(gè)方向上的多個(gè)動(dòng)作,比如“走”和“跑”寡夹。
2D Freeform Directional(2D自由方向):動(dòng)畫(huà)運(yùn)用有不同的方向時(shí)处面,也可以使用這種混合類(lèi)型:可以在同一個(gè)方向上有多個(gè)運(yùn)動(dòng),例如“走”和“跑”菩掏。在Freeform Directional類(lèi)型中魂角,(0,0)位置必須包含一個(gè)默認(rèn)動(dòng)作智绸,如“空閑站立”野揪。
2D Freeform Cartesian(2D自由笛卡兒):當(dāng)混合的2個(gè)參數(shù)不代表不同的方向時(shí)使用。使用Freeform Cartesian瞧栗,參數(shù)X和Y可以表示不同的概念類(lèi)型斯稳,例如角速度和線速度。舉個(gè)例子:“向前走不轉(zhuǎn)向”迹恐,“向前跑不轉(zhuǎn)向”挣惰,“向前走并右轉(zhuǎn)”,“向前跑并右轉(zhuǎn)”等動(dòng)作殴边。
如果角色動(dòng)畫(huà)包含站立憎茂、走、跑和轉(zhuǎn)向锤岸,非常符合2D Freeform Cartesian這種類(lèi)型竖幔。后面以2D Freeform Cartesian舉例說(shuō)明。
將Blend Type設(shè)置為2D Freeform Cartesian
設(shè)置Blend Type之后是偷,首先需要兩個(gè)參數(shù)控制這個(gè)Blend Tree拳氢。
在Animator中添加兩個(gè)float參數(shù):Turn和Forward分別代表轉(zhuǎn)向速度和向前行進(jìn)速度,然后將這兩個(gè)值設(shè)置為混合樹(shù)的參數(shù)(注意順序)
然后點(diǎn)擊 + > Add Motion Field 添加下列動(dòng)畫(huà)clip到混合樹(shù)動(dòng)畫(huà)列表蛋铆。(先不管后面的值)
下面饿幅,我們可以使用Unity中提供的自動(dòng)計(jì)算Pos值的功能,來(lái)自動(dòng)計(jì)算混合樹(shù)的閾值戒职。
Positions詳解
每一個(gè)Motion都有一個(gè)自己的位置栗恩,當(dāng)參數(shù)(x,y)靠近這個(gè)位置時(shí),這個(gè)動(dòng)畫(huà)就會(huì)參與混合。離得越近磕秤,這個(gè)動(dòng)畫(huà)的比重就越大乳乌。
選中一個(gè)Motion時(shí),圖中的藍(lán)點(diǎn)會(huì)有選中的狀態(tài)市咆;同樣選中混合圖中一個(gè)藍(lán)點(diǎn)汉操,對(duì)應(yīng)的Motion也會(huì)有選中的狀態(tài)。
可以拖動(dòng)混合圖中相應(yīng)的藍(lán)點(diǎn)來(lái)修改位置蒙兰,也可以直接修改Motion后面的值磷瘤。
Compute Positions
Unity提供了自動(dòng)計(jì)算Position的功能。
通過(guò)Compute Position下拉菜單可以選擇不同的計(jì)算方式:
屬性 | 功能 |
---|---|
Velocity XZ | 根據(jù)動(dòng)畫(huà)自身的速度搜变,將velocity.x設(shè)置每個(gè)動(dòng)畫(huà)的Pos X采缚,將velocity.z設(shè)置Pos Y。適合2D Simple Directional和2D Freeform Directional類(lèi)型的混合樹(shù)挠他。 |
Speed And Angular Speed | 將動(dòng)畫(huà)的Y軸角速度(弧度每秒)設(shè)置到Pos X扳抽,速度設(shè)置到Pos Y。適合2D Freeform Cartesian類(lèi)型的混合樹(shù)殖侵。 |
另外贸呢,還可以通過(guò) Compute Position -> X Position From
或 Compute Position -> Y Position From
單獨(dú)計(jì)算X或Y的值。
屬性 | 功能 |
---|---|
Speed | 動(dòng)畫(huà)的速度 |
Velocity X | 沿X軸的速度 |
Velocity Y | 沿Y軸的速度 |
Velocity Z | 沿Z軸的速度 |
Angular Speed (Rad) | Y軸的角速度拢军,單位是弧度/秒 |
Angular Speed (Deg) | Y軸的角速度楞陷,單位是角度/秒 |
Rad 和 Deg 分別代表了弧度和角度,弧度π(3.1415...) = 180°
可以根據(jù)項(xiàng)目的需要來(lái)選擇茉唉,兩種都可行固蛾,但是如果X,Y的數(shù)值相差過(guò)大的話赌渣,在混合圖上顯示會(huì)不便于調(diào)試。
在模型的Import Settings面板可以看到動(dòng)畫(huà)的速度
回到我們的混合樹(shù):
參考上面的內(nèi)容昌犹,我們可以使用Speed And Angular Speed來(lái)計(jì)算每個(gè)Motion的位置坚芜。
選擇Compute Positions中的Speed And Angular Speed
設(shè)置完后,整個(gè)混合樹(shù)如下圖所示:
現(xiàn)在我們來(lái)測(cè)試一下斜姥,看看怎么樣鸿竖。
Preview窗口中,記得一定要點(diǎn)擊左上角的播放铸敏,動(dòng)畫(huà)才會(huì)實(shí)時(shí)播放看到效果缚忧。
混合的原理
動(dòng)畫(huà)混合時(shí),會(huì)根據(jù)X和Y兩個(gè)值來(lái)確定混合的動(dòng)畫(huà)以及各自所占的比重杈笔。上面動(dòng)圖中我們可以看到闪水,拖動(dòng)紅點(diǎn)時(shí),可以看到不同的節(jié)點(diǎn)上面圓圈在發(fā)生不同的變化蒙具,圓圈的大小即這個(gè)動(dòng)畫(huà)所占比重的大小球榆。
紅點(diǎn)所在的位置代表了X和Y兩個(gè)參數(shù)的值對(duì)應(yīng)的位置朽肥。橫軸是X,縱軸是Y持钉。
Direct Blending 直接混合
直接混合可以直接將animator的參數(shù)映射到混合樹(shù)動(dòng)畫(huà)的權(quán)重衡招。這在什么時(shí)候使用呢?如果你想用參數(shù)精確控制混合的動(dòng)畫(huà)每强,而不是通過(guò)以?xún)蓚€(gè)參數(shù)間接控制動(dòng)畫(huà)的混合始腾。
設(shè)置一個(gè)direct混合樹(shù)時(shí),motion列表中的每一個(gè)動(dòng)畫(huà)需要對(duì)應(yīng)一個(gè)參數(shù)空执,用來(lái)控制這個(gè)動(dòng)畫(huà)的混合權(quán)重浪箭。
難點(diǎn)解析
“大智,這個(gè)2D混合樹(shù)中的閾值和動(dòng)畫(huà)中的真實(shí)速度是對(duì)應(yīng)關(guān)系么脆烟?”
“其實(shí)只要保持對(duì)應(yīng)的相對(duì)比例就可以山林,并不一定要真實(shí)的速度:”
1、X邢羔,Y的值和動(dòng)畫(huà)的實(shí)際速度沒(méi)有映射關(guān)系驼抹。我們也可以將“走”的動(dòng)畫(huà)的Y值設(shè)置的大一些,將跑的動(dòng)畫(huà)設(shè)置的小一些拜鹤。但是這樣設(shè)置會(huì)在表現(xiàn)上不符合玩家的預(yù)期框冀,感覺(jué)怪怪的。
2敏簿、在手動(dòng)調(diào)整時(shí)明也,只要點(diǎn)之間的相對(duì)位置保持不變,混合效果不會(huì)受太大的影響惯裕。
3温数、但是要注意在寫(xiě)代碼的時(shí)候,要根據(jù)調(diào)整過(guò)后值的范圍來(lái)設(shè)置對(duì)應(yīng)的參數(shù)蜻势。
“這樣調(diào)整完參數(shù)就感覺(jué)整個(gè)圖好看了好多撑刺,哈哈!”
總結(jié)
“現(xiàn)在你知道混合樹(shù)是干嘛的了吧?”
“知道了握玛,混合樹(shù)可以根據(jù)參數(shù)够傍,混合多個(gè)動(dòng)畫(huà),每個(gè)動(dòng)畫(huà)有不同的權(quán)重挠铲,這樣就有了很多中間狀態(tài)冕屯。”
“想要把混合樹(shù)用好拂苹,需要多去嘗試一下”
“嗯安聘,我這就準(zhǔn)備把我那個(gè)移動(dòng)的Animator Controller改成混合樹(shù)的方式呢”
今日思考題
“正好,給你布置個(gè)思考題,實(shí)現(xiàn)人物的前后左右走搞挣、跑的動(dòng)態(tài)混合带迟,正好也能用到你的吃雞游戲里”
“收到!我去也囱桨!”
“收獲別忘了分享出來(lái)仓犬!也別忘了分享給你學(xué)Unity的朋友,也許能夠幫到他舍肠〔蠹蹋”
擴(kuò)展閱讀
Unity6動(dòng)畫(huà)系統(tǒng)詳解【合集】
呼~(yú) 今天小新絮絮叨叨的真是夠夠的了。沒(méi)講清楚的地方歡迎評(píng)論翠语,咱們一起探索叽躯。
我是大智,你的技術(shù)探路者肌括,下次見(jiàn)点骑!
別走!點(diǎn)贊谍夭,收藏哦黑滴!
好,你可以走了紧索。