【Unity學(xué)習(xí)筆記】Introduction to 3D Animation Systems
1. 課程概覽與核心概念
1.1 課程概覽
1.1.1 概覽
在本課中,您將學(xué)習(xí)Unity動(dòng)畫系統(tǒng)的基本知識(shí),并用其創(chuàng)建動(dòng)畫以提升游戲體驗(yàn)。
1.1.2 課程對(duì)象
Unity動(dòng)畫系統(tǒng)的初學(xué)者,需具備一定的Unity使用經(jīng)驗(yàn)和初步C#代碼知識(shí)。
1.1.3 課程結(jié)構(gòu)
(1)Unity動(dòng)畫系統(tǒng)簡(jiǎn)介
了解Unity動(dòng)畫系統(tǒng)的核心概念,鞏固對(duì)課程實(shí)例的理解。
(2)使用資源
·創(chuàng)建并編輯動(dòng)畫片段
·設(shè)置骨骼
(3)動(dòng)畫控制器
了解動(dòng)畫控制器中的動(dòng)畫融合、狀態(tài)機(jī)和動(dòng)畫圖層。
(4)動(dòng)畫腳本簡(jiǎn)介
一般人形動(dòng)畫腳本的編寫
1.1.4 如何完成本課
·順序閱讀
按照章節(jié)順序?qū)W習(xí),全面理解Unity的動(dòng)畫系統(tǒng),建議新手采用這種方法。
·模塊學(xué)習(xí)
專注于希望學(xué)習(xí)的特定部分。
1.1.5 下載課程資源
1.2 核心概念:動(dòng)畫數(shù)據(jù)
1.2.1 概述
在本課中,您將學(xué)到在Unity中創(chuàng)建動(dòng)畫的兩個(gè)核心概念:動(dòng)畫數(shù)據(jù)和動(dòng)畫融合。
1.2.2 開(kāi)始之前的準(zhǔn)備工作
1.2.3 動(dòng)畫數(shù)據(jù)與動(dòng)畫片段簡(jiǎn)介
動(dòng)畫數(shù)據(jù)存儲(chǔ)在名為動(dòng)畫片段的資源中。動(dòng)畫片段可以存儲(chǔ)任何游戲物體的動(dòng)畫,它是Unity動(dòng)畫系統(tǒng)的基礎(chǔ)材料。
1.2.4 動(dòng)畫片段中動(dòng)畫數(shù)據(jù)的兩個(gè)部分
值:通常由動(dòng)畫曲線表示。動(dòng)畫曲線包含了物體動(dòng)畫變化方式的信息。
綁定(Bindings):將值與特定的物體區(qū)域或部件聯(lián)系起來(lái)的方式,包括從層級(jí)到物體變形部件的路徑以及從變形部件到特定區(qū)域的路徑。
值和綁定是一對(duì)一的關(guān)系。
1.2.5 打開(kāi)動(dòng)畫片段范例
1.2.6 了解動(dòng)畫數(shù)據(jù)與動(dòng)畫曲線
1.3 核心概念:動(dòng)畫融合
1.3.1 概覽
本課介紹了Unity動(dòng)畫核心概念之二:動(dòng)畫融合。
1.3.2 開(kāi)始之前的準(zhǔn)備工作
1.3.3 動(dòng)畫融合簡(jiǎn)介
當(dāng)同時(shí)播放多個(gè)動(dòng)畫片段時(shí),Unity會(huì)對(duì)其進(jìn)行融合。融合時(shí),每段動(dòng)畫都有相對(duì)權(quán)重,以計(jì)算其對(duì)最終動(dòng)畫的影響。最常見(jiàn)的計(jì)算方式是加權(quán)平均。
1.3.4 調(diào)整動(dòng)畫示例的權(quán)重
打開(kāi)本節(jié)教程資源并加載場(chǎng)景CoreConcepts。
調(diào)整兩段動(dòng)畫的權(quán)重:
選擇Cube>在檢查器的Blending Example組件中,將Circle Weight調(diào)整為0(Square權(quán)重將自動(dòng)變?yōu)?)
1.3.5 動(dòng)畫控制器的作用
動(dòng)畫控制器可以控制動(dòng)畫片段何時(shí)開(kāi)始播放以及如何與其他動(dòng)畫片段融合。它結(jié)合了由特定游戲物體播放的所有動(dòng)畫片段,并規(guī)定了控制動(dòng)畫回放的邏輯。
1.3.6 了解動(dòng)畫控制器
打開(kāi)動(dòng)畫控制器CubController>打開(kāi)節(jié)點(diǎn)Blend Tree(組合多個(gè)動(dòng)畫片段的狀態(tài),將輸入權(quán)重賦予動(dòng)畫片段并決定了它們的融合方式)
動(dòng)畫控制器
·是一組邏輯狀態(tài),包含一個(gè)或多個(gè)動(dòng)畫片段
·動(dòng)畫控制器通過(guò)路徑聯(lián)系這些狀態(tài),決定該狀態(tài)下當(dāng)前播放的動(dòng)畫片段。
·狀態(tài)之間通過(guò)過(guò)渡(Transitions)連接,融合了這些狀態(tài)下的動(dòng)畫片段。
1.3.7 創(chuàng)建動(dòng)畫控制器
點(diǎn)擊文件夾AnimatorControllers>創(chuàng)建Animator Controller>重命名為ExampleController
1.3.8 在ExampleController上添加動(dòng)畫片段
打開(kāi)AnimationClips文件夾>將動(dòng)畫片段Circle和Square拖入Animator窗口
1.3.9 創(chuàng)建新的過(guò)渡
點(diǎn)擊Circle>右鍵選擇Make Transition>將箭頭拉至Square
1.3.10 設(shè)置過(guò)渡
退出時(shí)間
點(diǎn)擊過(guò)渡箭頭>展開(kāi)Settings下拉菜單>將Exit Time改為1.5
過(guò)渡時(shí)機(jī)
將Transition Offset改為0.5>將Transition Duration改為2
1.3.11 檢查調(diào)整后的動(dòng)畫
將ExampleController拖入Cube檢查器的Controller屬性框>移除Blending Example組件
1.3.12. 總結(jié)
?
2. 運(yùn)用資源
2.1 動(dòng)畫窗口:功能與設(shè)置
2.1.1 概覽
在本節(jié)中,將加深對(duì)綁定和值在動(dòng)畫窗口中的顯示方式的理解,并了解在動(dòng)畫窗口中瀏覽動(dòng)畫片段的基本知識(shí)。
2.1.2 課程準(zhǔn)備
2.1.3 回顧:動(dòng)畫片段中的數(shù)據(jù)
·綁定(Bindings)顯示了游戲物體或其組成部分在動(dòng)畫回放中的變化區(qū)域。
·值(Values)顯示了給定時(shí)間哪個(gè)區(qū)域應(yīng)該變化。通常,這些值為隨著時(shí)間推移而變化的浮點(diǎn)值,表示為曲線。
·動(dòng)畫窗口顯示了與動(dòng)畫片段相關(guān)的綁定和值。
·你可以使用動(dòng)畫窗口編輯動(dòng)畫片段的綁定和值。
2.1.4 分析動(dòng)畫示例
打開(kāi)本節(jié)示例中的場(chǎng)景>AnimationClips>雙擊動(dòng)畫片段LightFlicker
2.1.5 編輯導(dǎo)入的動(dòng)畫片段
如果你希望編輯作為模型一部分導(dǎo)入的動(dòng)畫片段,可以復(fù)制該片段后對(duì)新片段進(jìn)行編輯。片段副本與模型將沒(méi)有聯(lián)系,因此不會(huì)在模型導(dǎo)入設(shè)置變化時(shí)發(fā)生變化。
打開(kāi)本節(jié)資源中的AnimationClips>HumanoidCrouch>點(diǎn)開(kāi)模型的下拉菜單,選擇一個(gè)動(dòng)畫片段>Ctrl+D復(fù)制片段
隱藏只讀屬性:在Animation窗口中打開(kāi)時(shí)間線旁邊的菜單>顯示只讀屬性
2.1.6 動(dòng)畫片段的環(huán)境
在動(dòng)畫窗口中瀏覽動(dòng)畫片段有兩種方法:作為資源瀏覽和在環(huán)境中瀏覽。選擇的瀏覽方式將決定編輯動(dòng)畫片段的方式。
作為資源瀏覽:
動(dòng)畫窗口中不包含用于播放動(dòng)畫的游戲物體,因此不能向動(dòng)畫片段中添加動(dòng)畫曲線。
在項(xiàng)目窗口中選擇動(dòng)畫片段并打開(kāi)。
在環(huán)境中瀏覽動(dòng)畫片段:
通過(guò)游戲?qū)ο髮蛹?jí)瀏覽動(dòng)畫片段時(shí),動(dòng)畫窗口將處于特定環(huán)境中。這意味著你可以添加動(dòng)畫曲線。
·在層級(jí)窗口中選擇帶有動(dòng)畫控制器(含動(dòng)畫片段)的游戲物體。在動(dòng)畫窗口中可以看到動(dòng)畫控制器引用的片段,你可以訪問(wèn)需要環(huán)境的設(shè)置。
如果沒(méi)有環(huán)境,就無(wú)法預(yù)覽動(dòng)畫片段。
2.1.7 動(dòng)畫片段環(huán)境:街燈示例
單獨(dú)瀏覽動(dòng)畫片段時(shí),無(wú)法編輯動(dòng)畫屬性。在層級(jí)窗口下點(diǎn)擊帶有動(dòng)畫器的游戲物體,即可編輯動(dòng)畫屬性(此時(shí)可以檢測(cè)到環(huán)境)。
2.1.8 復(fù)習(xí)動(dòng)畫窗口模式
動(dòng)畫窗口概覽:動(dòng)畫片段由兩部分組成:值和綁定。
關(guān)鍵幀:關(guān)鍵幀包含動(dòng)畫曲線在特定時(shí)間的值以及如何插值的信息。
關(guān)鍵幀清單(Dopesheet)和曲線模式:在動(dòng)畫窗口中瀏覽動(dòng)畫片段的兩種方式。
改變模式:點(diǎn)擊下方標(biāo)簽。
改變速度:時(shí)間軸可以按秒或按幀顯示。在Show Sample Rate窗口可以更改預(yù)覽窗口中包含的幀數(shù)或秒數(shù)。
2.1.9 復(fù)習(xí)動(dòng)畫窗口工具欄
在資源模式下瀏覽動(dòng)畫片段時(shí),部分按鈕將不會(huì)激活。
預(yù)覽模式:預(yù)覽模式下,時(shí)間軸和預(yù)覽的屬性在檢查器中將變?yōu)樗{(lán)色。也可以點(diǎn)擊并拖拽曲線上方的時(shí)間軸,進(jìn)入預(yù)覽模式。
錄像模式:錄像模式下,時(shí)間軸和預(yù)覽的屬性在檢查器中將變?yōu)榧t色。在錄像模式下對(duì)屬性做的更改將被錄入動(dòng)畫片段。
時(shí)間軸播放頭(playhead):標(biāo)明了時(shí)間軸上被預(yù)覽的具體點(diǎn)。
播放按鈕:只有在環(huán)境中才能預(yù)覽動(dòng)畫片段。
倒回開(kāi)頭、倒回、快進(jìn)、和快進(jìn)到最后:
當(dāng)前幀:在播放按鈕行的最右側(cè),可以手動(dòng)輸入。
2.1.10 選擇或創(chuàng)建動(dòng)畫片段
在動(dòng)畫預(yù)覽窗口左上下拉菜單可以直接創(chuàng)建新動(dòng)畫片段,創(chuàng)建的動(dòng)畫片段將自動(dòng)加入當(dāng)前使用的動(dòng)畫控制器。
2.1.11 過(guò)濾動(dòng)畫片段的動(dòng)畫曲線
一般來(lái)說(shuō),動(dòng)畫越復(fù)雜,動(dòng)畫曲線越多。過(guò)濾動(dòng)畫曲線的步驟:在層級(jí)窗口中選擇相應(yīng)游戲物體(或子物體)>點(diǎn)擊選擇過(guò)濾器(準(zhǔn)星圖標(biāo))
2.1.12 添加關(guān)鍵幀和動(dòng)畫事件
2.2 編輯動(dòng)畫片段
2.2.1 概覽
2.2.2 開(kāi)始之前
2.2.3 回顧:動(dòng)畫片段的數(shù)據(jù)
2.2.4 在LightFlicker動(dòng)畫片段上增加綁定
Window>Animation>Animation
在層級(jí)中選擇StreetLamp>在窗口左側(cè)選擇Add Property
SpotLight>Light>Color
在子游戲物體中有Is Active屬性,但根游戲物體中沒(méi)有。這是為了阻止根物體被禁用,因?yàn)檫@會(huì)禁用動(dòng)畫器并導(dǎo)致一系列問(wèn)題。
2.2.5 編輯動(dòng)畫曲線的值
添加Color屬性后,會(huì)增加四條動(dòng)畫曲線,即R、G、B和A。
編輯值時(shí),先將播放頭移動(dòng)到當(dāng)前時(shí)間,然后調(diào)整數(shù)值。如果之前沒(méi)有關(guān)鍵幀,會(huì)自動(dòng)創(chuàng)建關(guān)鍵幀。
或者,在曲線模式下可以直接拖拽關(guān)鍵幀或者右鍵單擊關(guān)鍵幀并選擇Edit Key。
2.2.6 編輯新動(dòng)畫曲線的值
2.2.7 復(fù)習(xí)關(guān)鍵幀的設(shè)置
兩個(gè)關(guān)鍵幀之間任意時(shí)點(diǎn)的值是使用關(guān)鍵幀切角計(jì)算出來(lái)的。每個(gè)關(guān)鍵幀都有兩個(gè)切角:入切角(in-tangent)和出切角(out-tangent)。作為例外,第一幀和最后一幀的入切角和出切角彼此相連。
關(guān)鍵幀預(yù)設(shè)
在關(guān)鍵幀上單擊右鍵可喚出預(yù)設(shè)菜單
·自動(dòng)收斂(Clamped Auto):動(dòng)畫曲線不會(huì)超出關(guān)鍵幀的值并將平滑逼近該值。
·自動(dòng)(Auto):這是為Unity3.x創(chuàng)建的動(dòng)畫片段準(zhǔn)備的老版設(shè)置。
·自由平滑(Free Smooth):該設(shè)置是獲得平滑曲線的最佳方式。
?-平坦:切線為水平的自由平滑變型。
·折線:左右切線不平行且方向獨(dú)立。
?-自由:折線切角的通常選項(xiàng)。
?-線性:隨著動(dòng)畫曲線逼近關(guān)鍵幀,切線傾向于變成直線。如果臨近切線都是線性的,則兩個(gè)關(guān)鍵幀之間的動(dòng)畫曲線為直線。
?-固定:在下一個(gè)關(guān)鍵幀之前,動(dòng)畫曲線的值等于前一個(gè)關(guān)鍵幀的值。
·加權(quán):該選項(xiàng)可以附加到其他設(shè)置上。它允許調(diào)整切線長(zhǎng)度。
2.2.8 用錄像模式創(chuàng)建動(dòng)畫
錄像模式開(kāi)啟時(shí),對(duì)層級(jí)界面中動(dòng)畫化游戲物體的任何更改都會(huì)錄制下來(lái)。
(類似于MMD)
2.2.9 一次操作多個(gè)關(guān)鍵幀
關(guān)鍵幀清單模式
該模式下,縱軸不顯示值的變化。拖拽選擇框只會(huì)移動(dòng)關(guān)鍵幀在時(shí)間軸(橫軸)上的位置。
也可以拖拽選擇框兩側(cè)的藍(lán)條,水平縮放選擇框,使關(guān)鍵幀靠近或拉遠(yuǎn)。
波紋編輯(Ripple editing)
如果選擇范圍外的關(guān)鍵幀隨變化而移動(dòng),那么就是波紋編輯。這是因?yàn)樽兓a(chǎn)生了波紋效應(yīng)。(快捷鍵:R(只能用一次))
曲線模式
支持縱向移動(dòng)和縮放。
2.2.10 編輯拍球動(dòng)畫
編輯關(guān)鍵幀時(shí),如果按住Shift再點(diǎn)擊關(guān)鍵幀,在已選中狀態(tài)下會(huì)將其移除。
2.2.11 小結(jié)
2.3 模型動(dòng)畫導(dǎo)入設(shè)置
2.3.1 概覽
從數(shù)字內(nèi)容創(chuàng)建(DCC)程序?qū)肽P蜁r(shí),它的動(dòng)畫設(shè)置分為兩部分:
·模型特定設(shè)置:影響隨該模型導(dǎo)入的所有動(dòng)畫。
·動(dòng)畫特定設(shè)置:影響隨該模型導(dǎo)入的各動(dòng)畫。
2.3.2 開(kāi)始之前
2.3.3 模型動(dòng)畫基礎(chǔ)
模型由許多三角面組成,但三角面不是各自獨(dú)立移動(dòng),而是依賴于骨骼的運(yùn)動(dòng)。骨骼使用動(dòng)畫數(shù)據(jù)運(yùn)動(dòng),然后根據(jù)骨骼的位置和旋轉(zhuǎn)計(jì)算出相關(guān)頂點(diǎn)的運(yùn)動(dòng)。骨骼層級(jí)及其影響網(wǎng)格的方式構(gòu)成了骨架(Rigs)。
兩類變形
正向運(yùn)動(dòng)學(xué)(Forward kinematics)
較低層級(jí)骨骼的運(yùn)動(dòng)依賴于較高層級(jí)骨骼的運(yùn)動(dòng)。
逆向運(yùn)動(dòng)學(xué)(Inverse kinematics)
骨骼鏈末端的位置和旋轉(zhuǎn)通過(guò)算法影響骨骼鏈遠(yuǎn)端骨骼的位置和旋轉(zhuǎn)。
2.3.4 導(dǎo)入約束與動(dòng)畫
約束是對(duì)關(guān)節(jié)運(yùn)動(dòng)的限制。如果選擇導(dǎo)入約束,它將成為實(shí)例化模型的一部分。如果選擇不導(dǎo)入動(dòng)畫,將沒(méi)有更多設(shè)置可調(diào)整,也不會(huì)創(chuàng)建動(dòng)畫片段。
2.3.5 烘焙動(dòng)畫
決定了動(dòng)畫是作為IK導(dǎo)入還是通過(guò)烘焙過(guò)程轉(zhuǎn)化為FK。
動(dòng)畫片段以FK格式儲(chǔ)存數(shù)據(jù)。因此帶有IK數(shù)據(jù)的模型導(dǎo)入時(shí)應(yīng)該進(jìn)行烘焙,將數(shù)據(jù)從IK轉(zhuǎn)換為FK。如果導(dǎo)入動(dòng)畫是用Maya、3DS Max或Cinema 4D創(chuàng)建,或者導(dǎo)入動(dòng)畫帶有IK或模擬數(shù)據(jù)時(shí),可以啟用烘焙動(dòng)畫。
2.3.6 動(dòng)畫曲線重新采樣
重新采樣選項(xiàng)只適用于一般骨架(generic rigs)模型。該設(shè)置決定了帶旋轉(zhuǎn)歐拉角的導(dǎo)入動(dòng)畫是否將其轉(zhuǎn)換為四元數(shù)角(quaternion angles)。
一般來(lái)說(shuō),所有帶歐拉角的導(dǎo)入動(dòng)畫都應(yīng)該進(jìn)行重新采樣,除非轉(zhuǎn)換中出現(xiàn)問(wèn)題(比如旋轉(zhuǎn)角度大于180度)。
2.3.7 優(yōu)化動(dòng)畫大小
動(dòng)畫壓縮(Animation Compression)設(shè)置決定了在硬盤和內(nèi)存中如何壓縮動(dòng)畫。
·關(guān)閉:不進(jìn)行壓縮。
·關(guān)鍵幀壓縮(Keyframe Reduction):去掉值類似的關(guān)鍵幀。
·最優(yōu)壓縮:將動(dòng)畫壓縮得盡量小。
選擇最優(yōu)壓縮時(shí),Unity首先試圖使用關(guān)鍵幀壓縮,如果動(dòng)畫曲線的值變換得比較頻繁,那么幀壓縮的效果不會(huì)很好。此時(shí)一種簡(jiǎn)化表示方法是在各幀的值之間采用線性插值法。這將把動(dòng)畫片段壓縮到最小,并影響動(dòng)畫效果。
決定是否移除關(guān)鍵幀時(shí)的默認(rèn)容錯(cuò)率為0.5%。
2.3.8 調(diào)整自定義屬性
這是針對(duì)導(dǎo)入動(dòng)畫額外屬性的高級(jí)設(shè)置。
2.4 剪切導(dǎo)入的動(dòng)畫片段
2.4.1 概覽
剪切動(dòng)畫(cutting animation)最常用于動(dòng)作捕捉(mocap)數(shù)據(jù),但也可以用于調(diào)整任何導(dǎo)入動(dòng)畫。
2.4.2 開(kāi)始之前
2.4.3 剪切與設(shè)置動(dòng)畫片段
2.4.4 打開(kāi)動(dòng)畫片段
在項(xiàng)目窗口中選擇HumanoidRun模型,然后在檢查器中選擇Animation標(biāo)簽
2.4.5 了解動(dòng)畫時(shí)間軸
通過(guò)調(diào)整把手或直接輸入起始幀/結(jié)束幀數(shù)據(jù),可以在動(dòng)畫片段中選定范圍。
2.4.6 了解循環(huán)質(zhì)量標(biāo)示燈(loop quality traffic lights)
·綠燈表示循環(huán)良好。
·黃燈表示循環(huán)尚可,可能適合也可能不適合您的環(huán)境。
·紅燈表示循環(huán)糟糕。
起點(diǎn)和終點(diǎn)的所有設(shè)置均應(yīng)為綠燈。
2.4.7 播放完整動(dòng)畫
在檢查器中找到預(yù)覽窗格>按播放鍵
2.4.8 了解示例循環(huán)標(biāo)示燈
·圖中的水平線代表模型沒(méi)有動(dòng)作,可能是因?yàn)閯?dòng)作捕捉錄制不當(dāng)。不要在動(dòng)畫片段中包括它們。
·在動(dòng)作起點(diǎn),模型身體傾斜程度比跑步時(shí)大,這對(duì)于跑步動(dòng)畫來(lái)說(shuō)并不理想。
·通過(guò)觀察,發(fā)現(xiàn)有一小段動(dòng)畫(大概10秒)可用。
2.4.9 創(chuàng)建動(dòng)畫剪輯
將起始手柄拖到第290幀至第330幀之間>將結(jié)束手柄拖到適當(dāng)位置>播放測(cè)試
2.4.10 啟用循環(huán)時(shí)間
2.4.11 啟用循環(huán)姿勢(shì)(Loop Pose)
循環(huán)姿勢(shì)設(shè)置改變了動(dòng)畫片段中關(guān)鍵幀的值,使開(kāi)始和結(jié)束時(shí)的姿勢(shì)匹配。
簡(jiǎn)單地說(shuō),循環(huán)姿勢(shì)用于確保動(dòng)畫在開(kāi)始和結(jié)束時(shí)不會(huì)出現(xiàn)導(dǎo)致動(dòng)畫抖動(dòng)的突然變化。
近似計(jì)算公式
新值=初始值-標(biāo)準(zhǔn)化時(shí)間×(結(jié)束值-初始值)
2.4.12 了解周期抵消(Cycle Offset)設(shè)置
周期抵消調(diào)整的是動(dòng)畫片段從您選擇的幀范圍中實(shí)際開(kāi)始的時(shí)間。
它以標(biāo)準(zhǔn)化時(shí)間衡量,例如,0.2表示將從所選幀范圍的20%處開(kāi)始播放動(dòng)畫片段。
獨(dú)立動(dòng)畫片段一般無(wú)需考慮此設(shè)置,但混合類似動(dòng)畫時(shí),則有必要考慮進(jìn)行此設(shè)置。
比如,人形動(dòng)畫要確保待混合的所有動(dòng)畫片段在同一個(gè)標(biāo)準(zhǔn)化時(shí)間的腿部位置類似。一種簡(jiǎn)單方法是確定一個(gè)標(biāo)準(zhǔn),即每個(gè)動(dòng)畫片段開(kāi)始時(shí)腿應(yīng)該在周期的哪個(gè)位置。
2.4.13 設(shè)置動(dòng)畫的循環(huán)偏移(Cycle Offset)
移到動(dòng)畫預(yù)覽的側(cè)面視圖>將播放頭移到顯示預(yù)定姿勢(shì)的位置上>將下方顯示的百分比數(shù)值填入Cycle Offset
2.4.14 總結(jié)
2.5 設(shè)置導(dǎo)入動(dòng)畫片段的根運(yùn)動(dòng)
2.5.1 概覽
本課將在混合動(dòng)畫的基礎(chǔ)上探索根運(yùn)動(dòng)在創(chuàng)建現(xiàn)實(shí)感動(dòng)畫中的作用。
2.5.2 開(kāi)始之前
2.5.3 根運(yùn)動(dòng)簡(jiǎn)介
根節(jié)點(diǎn)被用于定義根運(yùn)動(dòng)。根運(yùn)動(dòng)是指動(dòng)畫導(dǎo)致游戲物體與前一個(gè)位置產(chǎn)生偏移,而不僅僅是絕對(duì)值變化。這意味著運(yùn)動(dòng)看上去將更真實(shí),因?yàn)樗腔趧?dòng)畫本身而不僅僅是腳本。
缺點(diǎn):動(dòng)畫運(yùn)動(dòng)的一致性不如腳本運(yùn)動(dòng)(scripted movement)。
2.5.4 檢查當(dāng)前的根運(yùn)動(dòng)
在項(xiàng)目窗口中選擇HumanoidRun>Animation標(biāo)簽>找到Average Velocity和Average Angular Y Speed信息(僅適用于人形)
發(fā)現(xiàn)當(dāng)前模型具有右轉(zhuǎn)角速度、y軸上的速度和向右側(cè)的速度。這對(duì)于動(dòng)畫來(lái)講并不適合。修正方式是將部分根運(yùn)動(dòng)要素烘焙到姿勢(shì)中。這意味著它們將不再影響根運(yùn)動(dòng)。
2.5.5 設(shè)置根旋轉(zhuǎn)
奔跑動(dòng)畫應(yīng)該沿直線運(yùn)動(dòng),所以根旋轉(zhuǎn)應(yīng)烘焙進(jìn)姿勢(shì)。
檢查器>Root Transform Rotation>啟用Bake Into Pose
2.5.6 了解根旋轉(zhuǎn)的來(lái)源
目前,根旋轉(zhuǎn)的來(lái)源是身體旋轉(zhuǎn)。這意味著根旋轉(zhuǎn)是基于角色身體的面朝向。
如果導(dǎo)入的動(dòng)畫是一般型(generic)而非人型,則可以選擇使用根節(jié)點(diǎn)朝向而非身體朝向。這是因?yàn)橐话愎趋罌](méi)有身體的概念。
2.5.7 調(diào)整偏離(Offset)
根旋轉(zhuǎn)偏離是根相對(duì)于動(dòng)畫片段開(kāi)始時(shí)的姿勢(shì)的旋轉(zhuǎn)量。
檢查器>Root Transform Rotation-Offset>拖動(dòng)Offset直至Average Velocity X為0(Offset的值為1.51)
2.5.8 烘焙垂直根運(yùn)動(dòng)
檢查器>Root Transform Position(Y)>啟用Base Into Pose
人形骨骼可以選擇垂直根運(yùn)動(dòng)基于足部或身體重心。
2.5.9 了解橫向根運(yùn)動(dòng)
橫向根運(yùn)動(dòng)控制動(dòng)畫在XZ平面上的運(yùn)動(dòng)。
對(duì)于僅沿y軸運(yùn)動(dòng)或者不移動(dòng)的動(dòng)畫,我們可以將橫向根運(yùn)動(dòng)烘焙入姿勢(shì)。如果你希望讓奔跑動(dòng)畫的所有根運(yùn)動(dòng)無(wú)效,僅用腳本控制,就可以將橫向根運(yùn)動(dòng)烘焙入姿勢(shì)。
2.6 完成動(dòng)畫剪輯:其他設(shè)置
2.6.1 概覽
本節(jié)將介紹既適用于人型骨骼又適用于一般骨骼的動(dòng)畫設(shè)置。
2.6.2 開(kāi)始之前
2.6.3 鏡像設(shè)置
只有人型骨骼動(dòng)畫才有鏡像設(shè)置。啟用后,鏡像設(shè)置將把動(dòng)畫以角色中心為軸在YZ平面上翻轉(zhuǎn)。例如,從向左跑變?yōu)橄蛴遗堋?/p>
2.6.4 啟用疊加參考姿勢(shì)(Additive Reference Pose)設(shè)置
在普通的動(dòng)畫中,動(dòng)畫曲線的值會(huì)覆蓋每個(gè)綁定的默認(rèn)值。使用疊加動(dòng)畫后,可以在現(xiàn)有動(dòng)畫的基礎(chǔ)上進(jìn)行修改。例如,如果有角色向不同方向傾斜的動(dòng)畫,就可以將這些傾斜疊加在正常跑步的動(dòng)畫上,做出拐彎效果。疊加動(dòng)畫作為相對(duì)于參考姿勢(shì)的delta(小幅變化或微小差異)存儲(chǔ)在參數(shù)中。
啟用Additive Reference Pose>選擇用作參考姿勢(shì)的幀序號(hào)。
2.6.5 添加曲線
動(dòng)畫片段導(dǎo)入后,其動(dòng)畫曲線是鎖定的,處于只讀狀態(tài)。在編輯中可以添加曲線,這些曲線有別于創(chuàng)建和編輯動(dòng)畫片段時(shí)使用的動(dòng)畫曲線。
創(chuàng)建曲線:
檢查器窗口>Curves下拉菜單>Add(+)>確定相關(guān)動(dòng)畫控制器有與曲線名稱相同的參數(shù)。
關(guān)于循環(huán)偏移的注意事項(xiàng)
以這種方式添加到動(dòng)畫片段中的動(dòng)畫曲線不考慮循環(huán)偏移,而是和應(yīng)用周期偏移前的原始動(dòng)畫剪輯同步播放。因此,如果你希望使用預(yù)覽欄幫助設(shè)置曲線的值,應(yīng)該暫時(shí)將Cycle Offset設(shè)回零,創(chuàng)建曲線,然后再將Cycle Offset重設(shè)為需要的值。
2.6.6 編輯曲線
您可以像往常那樣使用曲線編輯器(Curve Editor)編輯動(dòng)畫曲線。點(diǎn)擊曲線名稱右邊的波形圖即可打開(kāi)編輯窗口。
點(diǎn)擊預(yù)覽時(shí)間線>點(diǎn)擊圖標(biāo)“New Keyframe”>設(shè)定關(guān)鍵幀的值。
注意:使用預(yù)覽窗口時(shí)不要忘記將循環(huán)偏移設(shè)回0。
2.6.7 其他導(dǎo)入指南
·動(dòng)畫事件(見(jiàn)2.7)
·變形與動(dòng)畫蒙版(Avatar Masking)
導(dǎo)入動(dòng)畫片段時(shí)可以只使用模型層級(jí)中的部分變形。這個(gè)過(guò)程類似于動(dòng)畫蒙版,但它是以動(dòng)畫片段為基礎(chǔ),不需要資源。(詳見(jiàn)2.9)
·覆蓋根運(yùn)動(dòng)(Overriding Root Motion)
在運(yùn)動(dòng)標(biāo)簽中,可以選擇覆蓋所選骨骼部分的根運(yùn)動(dòng)。(詳見(jiàn)2.8)
·導(dǎo)入信息
導(dǎo)入信息下拉菜單中不包含設(shè)置,但包含可以在導(dǎo)入過(guò)程中更改的項(xiàng)目的信息。如果導(dǎo)入動(dòng)畫在Unity中與動(dòng)畫軟件中不同,請(qǐng)查看導(dǎo)入信息欄。
2.6.8 總結(jié)
2.7 創(chuàng)建和設(shè)置動(dòng)畫事件
2.7.1 概覽
2.7.2 開(kāi)始之前
2.7.3 調(diào)用帶有動(dòng)畫事件的方法
動(dòng)畫事件調(diào)用MonoBehaviour腳本中的方法。腳本必須和動(dòng)畫片段播放的動(dòng)畫器掛在同一個(gè)游戲物體上。
當(dāng)以下條件成立時(shí),將激活動(dòng)畫事件并調(diào)用其方法。
·前一幀的動(dòng)畫片段標(biāo)準(zhǔn)化時(shí)間在動(dòng)畫事件的標(biāo)準(zhǔn)化時(shí)間之前。
·當(dāng)前幀的動(dòng)畫片段標(biāo)準(zhǔn)化時(shí)間在動(dòng)畫事件的標(biāo)準(zhǔn)化時(shí)間之后。
方法不一定是公共方法,可以有一個(gè)參數(shù)(浮點(diǎn)、整數(shù)、字符串或物體)。
2.7.4 動(dòng)畫事件與環(huán)境之間的關(guān)系
根據(jù)是否存在游戲物體作為環(huán)境,動(dòng)畫片段有不同編輯方法。動(dòng)畫事件同理。
不管是否存在游戲物體作為環(huán)境,動(dòng)畫事件都可以添加到動(dòng)畫片段中,但創(chuàng)建方式因此而有所不同。
動(dòng)畫事件包括兩種信息:調(diào)用方法的時(shí)間;調(diào)用方法的名稱。(也可能包括一個(gè)參數(shù))
2.7.5 創(chuàng)建有環(huán)境的動(dòng)畫事件
小球帶有粒子系統(tǒng)(子物體),我們要用它做出彈起灰塵的效果。
動(dòng)畫窗口>選擇Curves>全選所有關(guān)鍵幀(Ctrl+A)>按F>將播放頭移到小球第一次彈起的時(shí)候(第10幀)>點(diǎn)擊圖標(biāo)Add event
2.7.6 設(shè)置帶有環(huán)境的動(dòng)畫事件
在檢查器的Function下拉菜單中選擇PlayParticles()>點(diǎn)擊播放
2.7.7 創(chuàng)建不帶環(huán)境的動(dòng)畫事件
在項(xiàng)目窗口中選擇Models>選擇模型Ball>在檢查器中選擇Animation標(biāo)簽>打開(kāi)Events下拉菜單>在預(yù)覽窗口中找到第10幀>點(diǎn)擊按鈕Add Event,創(chuàng)建無(wú)環(huán)境的動(dòng)畫事件。
2.7.8 設(shè)置不帶環(huán)境的動(dòng)畫事件
在Function一欄中輸入“PlayParticles”(名稱必須與調(diào)用的方法完全匹配。)
2.7.9 總結(jié)
2.8 設(shè)置通用骨架
2.8.1 概覽
骨架定義了導(dǎo)入模型的結(jié)構(gòu),并被用來(lái)定義動(dòng)畫的播放方式。
2.8.2 開(kāi)始之前
2.8.3 打開(kāi)骨架標(biāo)簽
打開(kāi)案例模型Ellen>點(diǎn)擊骨架(Rig)標(biāo)簽
唯一可設(shè)置的是動(dòng)畫類型(Animation Type)。如果模型不帶動(dòng)畫,此項(xiàng)可以默認(rèn)為無(wú)。
2.8.4 了解動(dòng)畫類型設(shè)置
舊式(Legacy):此項(xiàng)是為了確保與4.X之前版本的兼容性。
通用(Generic):最常見(jiàn)的動(dòng)畫類型。
人型(Humanoid):導(dǎo)入角色為人型,且?guī)в杏闪硪粋€(gè)不同層級(jí)結(jié)構(gòu)的人型模型播放的動(dòng)畫,或者需要用該模型播放不同層級(jí)結(jié)構(gòu)的人型模型的動(dòng)畫,或者你希望使用內(nèi)置人型功能,例如手臂或腿部IK或目標(biāo)匹配。(詳見(jiàn)2.9)
本例中選擇“通用”類型。
2.8.5 創(chuàng)建新的Avatar
Avatar是代表模型骨架的資源。根據(jù)骨架是通用型還是人型,它將呈現(xiàn)不同形式。
一些動(dòng)畫功能(例如動(dòng)畫蒙版)需要用到Avatar。常見(jiàn)的一種用途是對(duì)于播放動(dòng)畫的模型創(chuàng)建Avatar,并讓包含動(dòng)畫數(shù)據(jù)的模型使用它。
創(chuàng)建Avatar
Rig標(biāo)簽>Avatar Definition>Create From This Model>Apply
2.8.6 選擇根節(jié)點(diǎn)
動(dòng)畫類型選擇“通用”后,下一步是選擇根節(jié)點(diǎn)。
根節(jié)點(diǎn)簡(jiǎn)介
根節(jié)點(diǎn)被用于定義動(dòng)畫的根運(yùn)動(dòng)。根運(yùn)動(dòng)是動(dòng)畫導(dǎo)致游戲物體偏離之前的位置而不僅僅是移動(dòng)絕對(duì)距離時(shí)的運(yùn)動(dòng)。
例如,如果游戲物體的動(dòng)畫是沿z軸向前運(yùn)動(dòng),那么在根節(jié)點(diǎn)模式下,當(dāng)動(dòng)畫循環(huán)播放時(shí),游戲物體將不斷沿z軸前進(jìn)。
沒(méi)有根運(yùn)動(dòng)時(shí),只要?jiǎng)赢嬔h(huán),游戲物體就會(huì)返回開(kāi)始位置并再次沿z軸向前運(yùn)動(dòng)。根節(jié)點(diǎn)被用作這個(gè)運(yùn)動(dòng)的參考。
本例的根節(jié)點(diǎn)應(yīng)為Ellen_Skeleton/Ellen_Root。
2.8.7 設(shè)置皮膚權(quán)重
皮膚權(quán)重設(shè)置讓我們可以調(diào)整頂點(diǎn)皮膚受多少根骨頭的影響。默認(rèn)是4根,建議在多數(shù)情況下保持該設(shè)置不變。
需要更改該設(shè)置時(shí),可以將Standard(4 bones)改為Custom。
最大骨骼/頂點(diǎn)設(shè)置
2.8.8 優(yōu)化模型游戲物體
當(dāng)模型層級(jí)十分復(fù)雜時(shí),可能有許多游戲物體只是為了定義皮膚網(wǎng)格的頂點(diǎn)位置。啟用優(yōu)化游戲物體后,所有無(wú)組成部分的游戲物體將被移除。
顯示額外變形(Expose Extra Transforms settings)設(shè)置
有時(shí),有必要保留啟用優(yōu)化游戲物體后會(huì)被移除的游戲物體。例如,對(duì)于某個(gè)穿戴可拆卸武器的角色,可能需要顯示“胸部”游戲物體,以便將武器附在上面。為了保留游戲物體,就需要使用顯示額外變形(Expose Extra Transforms)設(shè)置。
檢查器>啟用Optimize Game Objects>展開(kāi)Extra Transforms to Expose下拉菜單>展開(kāi)各節(jié)點(diǎn)菜單,啟用Ellen_Chest節(jié)點(diǎn)>點(diǎn)擊Apply并將模型拖入層級(jí)窗口,將其實(shí)例化
此時(shí)在層級(jí)窗口中展開(kāi)模型游戲物體,該骨骼中將不再有Ellen_Body和Ellen_Chest以外的子物體。
2.8.9 創(chuàng)建并應(yīng)用Avatar蒙版(Avatar Masks)
Avatar蒙版是一種防止動(dòng)畫數(shù)據(jù)被寫入綁定(binding)的方式。對(duì)于人型Avatar和泛型Avatar,Avatar蒙版的工作原理不同,但整體效果相同:不會(huì)使用加蒙版來(lái)源的變形數(shù)據(jù)。
創(chuàng)建Avatar蒙版:在項(xiàng)目窗口的創(chuàng)建菜單中選擇Avatar Mask
泛型Avatar的Avatar蒙版
在變形菜單中,選中的項(xiàng)將不會(huì)加蒙版。
應(yīng)用Avatar蒙版
在兩種不同情況下,應(yīng)該應(yīng)用Avatar蒙版:
·在導(dǎo)入過(guò)程中導(dǎo)入動(dòng)畫片段時(shí),防止特定變形的動(dòng)畫數(shù)據(jù)添加到該動(dòng)畫片段中。
·對(duì)于動(dòng)畫控制器中的動(dòng)畫圖層,防止特定變形的動(dòng)畫數(shù)據(jù)添加到由此得到的動(dòng)畫控制器所有圖層的混合圖層中。這些Avatar蒙版必須作為資源創(chuàng)建,但獨(dú)立于其他Avatar蒙版運(yùn)行。
2.8.10 總結(jié)
2.9 設(shè)置人形骨架
2.9.1 概述
·將骨骼映射到變形,并使用自動(dòng)映射簡(jiǎn)化這個(gè)過(guò)程。
·應(yīng)用t-pose作為人形模型的參考姿勢(shì)
·改變每塊肌肉的設(shè)置,以及這對(duì)最終動(dòng)畫的影響
2.9.2 開(kāi)始之前
2.9.3 復(fù)習(xí):人形動(dòng)畫類型
一般來(lái)說(shuō),動(dòng)畫模型應(yīng)使用泛型(Generic Animation Type),除了以下例外情況:
·導(dǎo)入角色為人型,且?guī)в杏闪硪粋€(gè)不同層級(jí)結(jié)構(gòu)的人型模型播放的動(dòng)畫
·需要用該模型播放不同層級(jí)結(jié)構(gòu)的人型模型的動(dòng)畫
·希望使用內(nèi)置人型功能,例如手臂或腿部IK或目標(biāo)匹配。
注:人形動(dòng)畫類型不一定是兩足類人角色應(yīng)該選擇的正確動(dòng)畫類型。
2.9.4 將動(dòng)畫類型改為人形
在項(xiàng)目窗口中選擇本節(jié)范例模型MazeLowMan>在檢查器中選擇Rig標(biāo)簽>將Animation Type改為Humanoid>點(diǎn)擊Apply。
2.9.5 映射與人形Avatar的復(fù)雜性
泛型骨架與人形骨架的核心區(qū)別就在于其Avatars。人形骨架需要Avatar播放動(dòng)畫,泛型骨架則不然。這是因?yàn)槿诵喂羌苁翘乩黄渥冃螌蛹?jí)是映射到人形骨骼上的。
在正常情況下,為了使動(dòng)畫可以在多個(gè)目標(biāo)之間共享,每個(gè)目標(biāo)必須具有與動(dòng)畫片段中相同名稱的相同層級(jí)結(jié)構(gòu)。這是因?yàn)樽冃蚊Q用于構(gòu)建動(dòng)畫片段的綁定值。如果播放動(dòng)畫片段所依據(jù)的層級(jí)結(jié)構(gòu)沒(méi)有具體綁定值,則綁定值將被忽略。這意味著,如果名稱不匹配,則動(dòng)畫將無(wú)法播放。
當(dāng)導(dǎo)入的模型是人形時(shí),不再僅使用標(biāo)準(zhǔn)綁定值播放動(dòng)畫片段。取而代之的是,與“人形”定義匹配的動(dòng)畫片段是通過(guò)Avatar播放的。
在導(dǎo)入時(shí),來(lái)自人形模型的動(dòng)畫片段將從寫入變形直接轉(zhuǎn)換為寫入肌肉。這被稱為肌肉剪輯。在運(yùn)行時(shí),肌肉剪輯將轉(zhuǎn)換回來(lái)寫入變形。
由于所有人形都具有這種映射,因此可以通過(guò)任何人形模型播放任何人形動(dòng)畫片段。
過(guò)程復(fù)習(xí)
這些轉(zhuǎn)換過(guò)程可以總結(jié)如下:
導(dǎo)入時(shí):具有變形綁定值的動(dòng)畫片段→人形Avatar→肌肉剪輯
運(yùn)行時(shí):肌肉剪輯→人形Avatar→設(shè)置變形屬性
獲取用于一個(gè)層級(jí)的動(dòng)畫片段并通過(guò)不同層級(jí)播放它的過(guò)程稱為重定目標(biāo)(retargeting)。
2.9.6 加載人形Avatar設(shè)置
如果Configure...按鈕左側(cè)有對(duì)勾,那么Unity就可以自動(dòng)設(shè)置Avatar。
選擇Configure...按鈕后,將立即保存當(dāng)前場(chǎng)景,這是因?yàn)槿诵蜛vatar是在獨(dú)立場(chǎng)景中設(shè)置的,所以需要卸載當(dāng)前場(chǎng)景。
2.9.7 了解映射
加載Avatar設(shè)置場(chǎng)景后,檢查器將顯示Avatar映射。
Avatar設(shè)置分為兩部分
·映射
·肌肉與設(shè)置
映射準(zhǔn)確定義了模型的哪些變形與預(yù)先定義的人形骨骼的哪些部分相關(guān)聯(lián)。
檢查器顯示出現(xiàn)在可以分配的骨骼區(qū)域。每個(gè)點(diǎn)表示一根骨骼。實(shí)線表示映射的運(yùn)行所需要的骨骼。虛線表示可選骨骼。映射的可選骨骼越多,重設(shè)目標(biāo)(retargeting)的質(zhì)量越高。
使用自動(dòng)映射
為了更輕松地設(shè)置映射,可以通過(guò)匹配預(yù)期層級(jí)和名稱試著自動(dòng)完成映射。
·點(diǎn)擊映射標(biāo)簽底部的Mapping下拉菜單,選擇Automap。
2.9.8 應(yīng)用標(biāo)準(zhǔn)動(dòng)畫姿勢(shì)
變形的位置和旋轉(zhuǎn)在Avatar設(shè)置中同樣極為重要。它們構(gòu)成了計(jì)算動(dòng)畫的參考姿勢(shì)。動(dòng)畫片段與肌肉剪輯相互轉(zhuǎn)換時(shí),每個(gè)旋轉(zhuǎn)和轉(zhuǎn)換都是與該參考姿勢(shì)做比較的。Unity使用標(biāo)準(zhǔn)動(dòng)畫姿勢(shì)作為所有人形動(dòng)畫的目標(biāo)姿勢(shì):T-pose。
·點(diǎn)擊映射標(biāo)簽底部的Pose下拉菜單,選擇Enforce T-Pose。
2.9.9 設(shè)置骨骼
肌肉的定義是骨骼預(yù)期在給定軸上旋轉(zhuǎn)(或無(wú)法旋轉(zhuǎn))的范圍。
該范圍是標(biāo)準(zhǔn)化數(shù)值,這意味著該范圍為0到1。在導(dǎo)入時(shí),變形旋轉(zhuǎn)將轉(zhuǎn)換為這些標(biāo)準(zhǔn)化旋轉(zhuǎn)范圍。然后在運(yùn)行時(shí)將標(biāo)準(zhǔn)化旋轉(zhuǎn)范圍轉(zhuǎn)換回變形旋轉(zhuǎn)。
Avatar在導(dǎo)入時(shí)的預(yù)期運(yùn)動(dòng)范圍與Avatar在運(yùn)行時(shí)的預(yù)期運(yùn)動(dòng)范圍可能會(huì)有所不同。如果是這樣,則仍然可能發(fā)生轉(zhuǎn)換,因?yàn)閿?shù)據(jù)是作為普通骨骼定義上的標(biāo)準(zhǔn)化數(shù)值存儲(chǔ)的。
但是,這將影響動(dòng)畫中的旋轉(zhuǎn)。
示例
考慮以下示例:
模型的肌肉定義為圍繞某條軸的10到90度之間旋轉(zhuǎn)。該模型上的動(dòng)畫需要在某個(gè)特定幀上旋轉(zhuǎn)50度。
由于范圍已標(biāo)準(zhǔn)化,因此該旋轉(zhuǎn)的數(shù)值為圍繞該軸旋轉(zhuǎn)范圍的0.5。
該動(dòng)畫將重新定位到其他模型。該模型的范圍在0到110度之間。來(lái)自本動(dòng)畫的0.5旋轉(zhuǎn)值將轉(zhuǎn)換為55。
在編輯器中進(jìn)行設(shè)置
在檢查器上方選擇Muscles & Settings標(biāo)簽>在Pre-Muscle Settings中打開(kāi)Head和Neck Nod DownUp菜單>將默認(rèn)值-40-40改為更大的范圍>測(cè)試后復(fù)位。
2.9.10 創(chuàng)建和應(yīng)用Avatar蒙版
Avatar蒙版是一種防止動(dòng)畫數(shù)據(jù)寫入其綁定值的方法。人形Avatar和泛型Avatar的運(yùn)行方式不同,但是總體效果相同:不使用有蒙版源中的變形數(shù)據(jù)。
人形Avatar的Avatar蒙版
人形Avatar的Avatar蒙版通過(guò)使用帶有不同可選區(qū)域的人形圖像來(lái)操作。取消選擇人形的某個(gè)區(qū)域即對(duì)其加上蒙版。
應(yīng)用Avatar蒙版
Avatar蒙版可以在兩種不同情況下使用:
·在導(dǎo)入過(guò)程中導(dǎo)入動(dòng)畫片段時(shí),防止特定變形的動(dòng)畫數(shù)據(jù)添加到該動(dòng)畫片段中。
·對(duì)于動(dòng)畫控制器中的動(dòng)畫圖層,防止特定變形的動(dòng)畫數(shù)據(jù)添加到由此得到的動(dòng)畫控制器所有圖層的混合圖層中。這些Avatar蒙版必須作為資源創(chuàng)建,但獨(dú)立于其他Avatar蒙版運(yùn)行。
您可以在3.7“創(chuàng)建和配置動(dòng)畫圖層”中找到關(guān)于導(dǎo)入動(dòng)畫片段和動(dòng)畫圖層的更多信息。
注意:請(qǐng)記住,Avatar蒙版僅對(duì)變形數(shù)據(jù)加蒙版,這一點(diǎn)很重要。它們不會(huì)對(duì)同一個(gè)游戲物體上的數(shù)據(jù)當(dāng)做蒙版變形來(lái)加蒙版。
2.9.11 總結(jié)
3. 動(dòng)畫器
3.1 動(dòng)畫器組件簡(jiǎn)介
3.1.1 概述
本節(jié)內(nèi)容
·動(dòng)畫控制器的結(jié)構(gòu)及其與動(dòng)畫器組件的關(guān)系。
·動(dòng)畫器組件的不同屬性并考慮何時(shí)應(yīng)用哪種屬性。
3.1.2 開(kāi)始之前
3.1.3 了解動(dòng)畫器系統(tǒng)的結(jié)構(gòu)
游戲物體>動(dòng)畫器>動(dòng)畫控制器>動(dòng)畫圖層>狀態(tài)機(jī)>狀態(tài)>動(dòng)畫片段
3.1.4 動(dòng)畫器參數(shù)
·浮點(diǎn)(Floats)
·整數(shù)(Integers)
·布爾變量(Booleans)
·開(kāi)關(guān)(Triggers)
使用示例
·定義過(guò)渡條件
·控制狀態(tài)屬性
·控制混合樹(shù)(Blend Trees)
3.1.5 動(dòng)畫器組件
動(dòng)畫器組件充當(dāng)了綁定系統(tǒng)的根(Root)。
綁定系統(tǒng)有兩個(gè)部分:
·變形路徑
·屬性名稱
變形路徑有一個(gè)包括以下內(nèi)容的字符串:
·層級(jí)結(jié)構(gòu)中的變形名稱,必須遍歷該名稱才能到達(dá)游戲物體。
·有待設(shè)置動(dòng)畫的組件和屬性。
與動(dòng)畫器組件相同的游戲物體的任何屬性都有一條空白路徑,因?yàn)椴恍枰闅v任何變形即可獲取該屬性。具有動(dòng)畫器組件的游戲物體的直接子物體上的任何屬性都具有該子物體名稱的變形路徑。這將沿其他游戲物體的層次結(jié)構(gòu)延續(xù)。
請(qǐng)務(wù)必記住,這種綁定模式意味著只有與動(dòng)畫器組件相同的游戲物體上的屬性以及層級(jí)中位于其下方的游戲物體屬性才能由動(dòng)畫器控制。
3.1.6 動(dòng)畫器組件屬性及其用途
在查看動(dòng)畫器系統(tǒng)的結(jié)構(gòu)時(shí),您學(xué)習(xí)了動(dòng)畫器組件的控制器屬性?,F(xiàn)在,我們來(lái)探討其他屬性。
Avatar設(shè)置
除非您為帶有人形骨骼的角色設(shè)置動(dòng)畫,否則動(dòng)畫器組件的Avatar設(shè)置是可選的。此設(shè)置定義了動(dòng)畫的變形。
應(yīng)用根運(yùn)動(dòng)
“應(yīng)用根運(yùn)動(dòng)”設(shè)置確定是否將對(duì)根節(jié)點(diǎn)的“位置”或“旋轉(zhuǎn)”進(jìn)行任何更改。如果啟用該選項(xiàng),則將應(yīng)用這些更改,允許動(dòng)畫移動(dòng)根節(jié)點(diǎn)。
請(qǐng)記住,根節(jié)點(diǎn)不一定是有動(dòng)畫器組件的變形。它可以是使用Avatar的層級(jí)上的任何變形。
更新模式
動(dòng)畫器組件的更新模式會(huì)影響執(zhí)行動(dòng)畫器以更新其所控制屬性的時(shí)間的代碼。
當(dāng)更新模式設(shè)置為“正?!睍r(shí),更新會(huì)隨渲染系統(tǒng)即時(shí)進(jìn)行(在調(diào)用Update和LateUpdate方法之間)。 在大多數(shù)情況下,沒(méi)有理由將其變?yōu)椤罢!薄?/p>
當(dāng)“更新模式”設(shè)為“動(dòng)畫物理”時(shí),在調(diào)用FixedUpdate方法之后,更新會(huì)與物理系統(tǒng)同時(shí)進(jìn)行。當(dāng)有待設(shè)置動(dòng)畫的屬性需要與物理引擎互動(dòng)時(shí)(例如,移動(dòng)Collider時(shí)),該設(shè)置很有用。
最后一個(gè)選項(xiàng)是“無(wú)標(biāo)度時(shí)間”(Unscaled Time)。啟用此設(shè)置后,更新將與渲染系統(tǒng)同步進(jìn)行,但不受Time.timeScale的影響。這意味著動(dòng)畫的速度不會(huì)改變。該設(shè)置對(duì)于在游戲的其余部分變慢或加速時(shí)使UI等對(duì)象保持相同速度非常有用。
剔除模式(Culling Mode)
最后一項(xiàng)設(shè)置為剔除模式。該設(shè)置會(huì)影響導(dǎo)致動(dòng)畫器暫停更新以提高效率的因素。
默認(rèn)選項(xiàng)是“總是播放動(dòng)畫”(Always Animate)。 選擇該選項(xiàng)后,將永遠(yuǎn)不會(huì)剔除動(dòng)畫器。
當(dāng)動(dòng)畫器下所有渲染器的邊框超出所有當(dāng)前渲染的鏡頭的視錐范圍之外,“Cull Update Transforms”選項(xiàng)將停止所有對(duì)變形屬性的寫入。唯一的例外是仍然應(yīng)用根運(yùn)動(dòng)。這可用于并不是總顯示在鏡頭中的動(dòng)畫角色等情況。這將提升性能,因?yàn)榻巧氖帜_在大多數(shù)情況下不會(huì)進(jìn)行處理,而只是在角色出現(xiàn)時(shí)進(jìn)行處理。
最后一個(gè)選項(xiàng)“完全剔除”(Cull Completely)將在動(dòng)畫器下所有渲染器的邊框不在所有當(dāng)前渲染鏡頭的視錐范圍內(nèi)時(shí),停止所有對(duì)所有屬性的寫入。這應(yīng)該用于任何帶有動(dòng)畫的固定游戲物體。
3.1.7 總結(jié)
3.2 動(dòng)畫融合(animation blending)簡(jiǎn)介
3.2.1 概述
3.2.2 開(kāi)始之前
3.2.3 什么是動(dòng)畫融合?
當(dāng)多個(gè)動(dòng)畫通過(guò)相同的游戲物體層級(jí)同時(shí)播放時(shí),即為動(dòng)畫融合。
最常見(jiàn)的動(dòng)畫混合是兩個(gè)或多個(gè)動(dòng)畫意欲改變一個(gè)綁定值時(shí)。結(jié)果是,每個(gè)動(dòng)畫的值被融合起來(lái),綁定值根據(jù)融合值而變化。
3.2.4 動(dòng)畫融合的運(yùn)行原理是什么?
有幾種不同的復(fù)雜算法可用于融合動(dòng)畫,其中大多數(shù)算法本教程都不會(huì)涉及。
但是,您需要知道,所有算法都遵循相同的總體過(guò)程:
·每個(gè)動(dòng)畫都有權(quán)重。該權(quán)重表示動(dòng)畫對(duì)融合結(jié)果的影響程度。
·較高的權(quán)重意味著動(dòng)畫的影響更高,而較低的權(quán)重意味著動(dòng)畫的影響更低。
·通常,權(quán)重是標(biāo)準(zhǔn)化的。這意味著所有待融合動(dòng)畫的權(quán)重之和等于1。
動(dòng)畫融合最簡(jiǎn)單的算法是加權(quán)和(Weighted Sum)。它是當(dāng)前時(shí)刻的每個(gè)綁定值乘以動(dòng)畫片段的權(quán)重。然后,Unity將所有加權(quán)值加在一起,并設(shè)置結(jié)果的綁定值。
示例
動(dòng)畫A在特定時(shí)間將燈光組件的強(qiáng)度設(shè)置為5。
動(dòng)畫B同時(shí)將同一燈光組件的強(qiáng)度設(shè)置為10。
動(dòng)畫A的權(quán)重為0.2。
動(dòng)畫B的權(quán)重為0.8。
這兩個(gè)動(dòng)畫的融合導(dǎo)致燈光組件的強(qiáng)度為:
5 * 0.2 + 10 * 0.8 = 9
3.2.5 哪些功能使用動(dòng)畫融合?
使用動(dòng)畫融合的三個(gè)最常見(jiàn)的功能是:
·轉(zhuǎn)場(chǎng)
·混合樹(shù)
·圖層
讓我們來(lái)逐一詳細(xì)探討。
轉(zhuǎn)場(chǎng)
動(dòng)畫融合最常出現(xiàn)在轉(zhuǎn)場(chǎng)中。 當(dāng)轉(zhuǎn)場(chǎng)開(kāi)始時(shí),第二個(gè)狀態(tài)的動(dòng)畫開(kāi)始播放。隨著轉(zhuǎn)場(chǎng)繼續(xù),第二個(gè)狀態(tài)的權(quán)重增加,前一個(gè)狀態(tài)的權(quán)重降低。
融合樹(shù)
融合樹(shù)用于代替狀態(tài)中的單個(gè)動(dòng)畫片段。它們?nèi)诤狭税亩鄠€(gè)動(dòng)畫片段。
圖層
圖層融合的運(yùn)作方式與轉(zhuǎn)場(chǎng)和融合樹(shù)的運(yùn)作方式略有不同。在將圖層中的所有動(dòng)畫與下一個(gè)圖層融合之前,需要對(duì)其進(jìn)行完整評(píng)估。然后在與后續(xù)圖層融合之前,評(píng)估該融合的結(jié)果,依此類推。
3.2.6 動(dòng)畫融合實(shí)踐
這些功能可以單獨(dú)使用,但并不總是那么簡(jiǎn)單。例如,兩個(gè)混合樹(shù)之間的轉(zhuǎn)場(chǎng)如何做?
答案是動(dòng)畫融合可以嵌套(nested)。加權(quán)是相乘得到的,因此每個(gè)動(dòng)畫片段都會(huì)在計(jì)算最終結(jié)果之前先計(jì)算其權(quán)重。
使用動(dòng)畫功能時(shí)要記住的最重要的事情之一是,雖然它們?nèi)坑糜诓シ藕腿诤蟿?dòng)畫,但是每個(gè)功能的作用方式都不相同。獲得良好動(dòng)畫效果的關(guān)鍵是了解應(yīng)使用哪些工具來(lái)融合動(dòng)畫以獲得所需的結(jié)果。
3.2.7 總結(jié)
3.3 創(chuàng)建并設(shè)置動(dòng)畫器狀態(tài)
3.3.1 概述
每個(gè)動(dòng)畫狀態(tài)都包含一個(gè)動(dòng)作。動(dòng)作要么是動(dòng)畫片段,要么是通過(guò)混合樹(shù)融合的動(dòng)畫片段集合。播放動(dòng)畫狀態(tài)的同時(shí),也會(huì)播放其中的動(dòng)作。
動(dòng)畫狀態(tài)是狀態(tài)機(jī)的核心組成部分之一,狀態(tài)機(jī)又是動(dòng)畫控制器的核心組成部分之一。
3.3.2 開(kāi)始之前
3.3.3 創(chuàng)建動(dòng)畫器狀態(tài)
有兩種創(chuàng)建動(dòng)畫器狀態(tài)的方法:
·將動(dòng)畫片段資源從項(xiàng)目窗口拖進(jìn)動(dòng)畫器窗口。
·右鍵單擊動(dòng)畫器窗口,選擇Create State>Empty。
選擇的方法基于你希望動(dòng)畫器狀態(tài)包含的動(dòng)作。
3.3.4 通過(guò)動(dòng)畫片段創(chuàng)建新的動(dòng)畫狀態(tài)
Window>Animation>Animator>選擇游戲物體MazeLowMan>在項(xiàng)目窗口中,選擇本節(jié)資源中的AnimationClips>展開(kāi)模型HumanoidRun,找到動(dòng)畫片段Run>將Run從項(xiàng)目窗口拖入動(dòng)畫控制器窗口,創(chuàng)建新的動(dòng)畫狀態(tài)并命名為Run。
3.3.5 基本動(dòng)畫狀態(tài)設(shè)置:名稱與標(biāo)簽
動(dòng)畫狀態(tài)的名稱和標(biāo)簽單純是用來(lái)識(shí)別的。名稱必須是獨(dú)一無(wú)二的,但標(biāo)簽不用。
3.3.6 狀態(tài)播放控制設(shè)置:動(dòng)作、速度與倍數(shù)
動(dòng)作(Motion):該項(xiàng)可以設(shè)為動(dòng)畫片段,也可以設(shè)為融合樹(shù)。
速度與倍數(shù)(Multiplier):不同的速度值可以產(chǎn)生慢放或快放效果。如果將這里的值作為默認(rèn)值,并啟用倍數(shù),那么最終的播放速度將為速度值乘以動(dòng)畫器參數(shù)。
3.3.7 調(diào)整動(dòng)畫速度
啟用Multiplier右側(cè)的Parameter>調(diào)整Speed參數(shù)(1-4)>點(diǎn)擊Play觀察效果
3.3.8 動(dòng)畫狀態(tài)播放控制設(shè)置:標(biāo)準(zhǔn)化時(shí)間
另一種控制動(dòng)畫狀態(tài)播放的方法是直接控制其標(biāo)準(zhǔn)化時(shí)間。
標(biāo)準(zhǔn)化時(shí)間是用0-1的數(shù)值衡量當(dāng)前運(yùn)動(dòng)時(shí)間的概念。
·當(dāng)標(biāo)準(zhǔn)化時(shí)間為0時(shí),動(dòng)畫狀態(tài)處于起點(diǎn)。
·當(dāng)標(biāo)準(zhǔn)化時(shí)間為0.5時(shí),動(dòng)畫狀態(tài)處于中點(diǎn)。
·當(dāng)標(biāo)準(zhǔn)化時(shí)間為1時(shí),動(dòng)畫狀態(tài)處于終點(diǎn)。
你可以用動(dòng)畫參數(shù)的值作為動(dòng)畫狀態(tài)的標(biāo)準(zhǔn)化時(shí)間,設(shè)定動(dòng)畫狀態(tài)運(yùn)動(dòng)過(guò)程中每幀的值。
動(dòng)畫器窗口>啟用Motion Time的Parameter>選擇希望使用的動(dòng)畫參數(shù)。
3.3.9 動(dòng)畫狀態(tài)播放控制設(shè)置:循環(huán)偏離(Cycle Offset)
該設(shè)置與標(biāo)準(zhǔn)化時(shí)間并用,它設(shè)定了狀態(tài)開(kāi)始播放的標(biāo)準(zhǔn)化時(shí)間。如果你希望改變這個(gè)設(shè)置,可以將其設(shè)為浮點(diǎn)或者令其由浮點(diǎn)參數(shù)控制。
3.3.10 人形設(shè)置
人形狀態(tài)的兩個(gè)額外設(shè)置
·鏡像:將動(dòng)畫左右翻轉(zhuǎn)。
·足部IK:使用肌肉剪輯數(shù)據(jù)估計(jì)哪只腳應(yīng)該踩在地上。使用足部IK時(shí),足部的位置是鎖定的。該功能在以下情況很有用:(1)動(dòng)畫片段壓縮導(dǎo)致足部在空閑(idle)動(dòng)畫中移動(dòng)。(2)融合兩段動(dòng)畫導(dǎo)致足部在應(yīng)該固定的時(shí)候輕微滑動(dòng)。
注:該設(shè)置是基于估計(jì)值,不能確保適用于所有動(dòng)畫數(shù)據(jù)。
3.3.11 其他設(shè)置
寫入默認(rèn)值(Write Defaults)
要了解其工作原理,首先需要了解Animator System處理其動(dòng)畫綁定的方式:
·動(dòng)畫器從其包含的所有動(dòng)畫片段中收集所有綁定值,并在每幀中寫入每個(gè)綁定值。
·如果動(dòng)畫狀態(tài)的動(dòng)作未寫入特定的綁定值,則動(dòng)作取決于“寫入默認(rèn)值”設(shè)置。
·如果啟用“寫入默認(rèn)值”,則寫入綁定的默認(rèn)值。如果禁用該選項(xiàng),則不寫入綁定值,而是保持原值。
轉(zhuǎn)場(chǎng)列表(List of Transitions)
該列表是轉(zhuǎn)場(chǎng)的優(yōu)先順序。
3.3.12 總結(jié)
3.4 創(chuàng)建和設(shè)置融合樹(shù)
3.4.1 概述
融合樹(shù)是同時(shí)播放多個(gè)動(dòng)畫片段的一種方法。
3.4.2 開(kāi)始之前
3.4.3 融合樹(shù)基礎(chǔ)
融合樹(shù)與動(dòng)作
每個(gè)動(dòng)畫狀態(tài)都播放一個(gè)動(dòng)作。動(dòng)作可以指動(dòng)畫片段,也可以指融合樹(shù)。融合樹(shù)播放的是一組動(dòng)作。
融合樹(shù)與標(biāo)準(zhǔn)化時(shí)間
融合樹(shù)使用動(dòng)畫片段的標(biāo)準(zhǔn)化時(shí)間,從而同步類似的動(dòng)畫片段。
3.4.4 融合樹(shù)類型
·1D
·2D簡(jiǎn)單方向
·2D自由方向
·2D自由笛卡爾
·直接
它們的區(qū)別僅在于如何計(jì)算融合樹(shù)中動(dòng)畫片段的權(quán)重。
動(dòng)作閾值
閾值是動(dòng)作處于最大權(quán)重的那一點(diǎn)。1D融合樹(shù)有一個(gè)浮點(diǎn)閾值。2D融合樹(shù)有兩個(gè)浮點(diǎn)值,Pos X和Pos Y。
直接融合樹(shù)沒(méi)有閾值,而是直接設(shè)定有具體參數(shù)的動(dòng)作權(quán)重。
動(dòng)畫參數(shù)與維度
每個(gè)融合樹(shù)都有一個(gè)或多個(gè)動(dòng)畫參數(shù)。這些參數(shù)的值與動(dòng)作閾值的接近程度決定了每個(gè)動(dòng)畫片段在結(jié)果中的權(quán)重。
融合樹(shù)的維度顯示了它使用了多少動(dòng)畫參數(shù):
·1D融合樹(shù)使用一個(gè)浮點(diǎn)參數(shù),其值被稱為blend value。
·2D融合樹(shù)使用兩個(gè)浮點(diǎn)參數(shù)。它們的值定義了blend position。
·直接融合樹(shù)是一種特殊類型,它使用任意指定的浮點(diǎn)參數(shù)。
3.4.5 1D融合樹(shù)
根據(jù)動(dòng)作閾值與融合值的距離決定權(quán)重,距離越近權(quán)重越大。
例如,如果有兩個(gè)閾值分別為1和2的動(dòng)作,融合值為1.7,那么
·閾值為1的動(dòng)作的權(quán)重為0.3
·閾值為2的動(dòng)作的權(quán)重為0.7
3.4.6 創(chuàng)建1D融合樹(shù)
在項(xiàng)目窗口中,打開(kāi)1DBlendTrees場(chǎng)景>選擇MaxeLowMan>找到Animator>在Controller屬性中雙擊WalkRunBlending Animator Controller,打開(kāi)動(dòng)畫器窗口>右鍵單擊背景,選擇Create State>From New Blend Tree>雙擊新創(chuàng)建的動(dòng)畫狀態(tài)>選擇新的Blend Tree,檢查其設(shè)置。
3.4.7 了解并設(shè)置融合樹(shù)
名稱
融合樹(shù)的名稱必須有別于包含融合樹(shù)的動(dòng)畫狀態(tài)的名稱。
融合類型
融合值參數(shù)
·一維融合樹(shù)的參數(shù)為Blend Value
·二維融合樹(shù)的參數(shù)為blend position
·直接融合樹(shù):每個(gè)動(dòng)作對(duì)應(yīng)一個(gè)參數(shù)。
3.4.8 了解融合圖
一維融合樹(shù)

拖動(dòng)曲線可以改變動(dòng)作閾值,但不建議這樣做,因?yàn)檫@種方式無(wú)法精確控制閾值。
二維融合樹(shù)

直接融合樹(shù)
直接融合樹(shù)沒(méi)有圖形,因?yàn)槊總€(gè)動(dòng)作的權(quán)重完全獨(dú)立。
預(yù)覽動(dòng)畫
一維融合樹(shù)和二維融合樹(shù):拖動(dòng)紅點(diǎn)即可預(yù)覽動(dòng)畫
直接融合樹(shù):通過(guò)滑塊改變參數(shù)的權(quán)重值
3.4.9 在一維融合樹(shù)中添加動(dòng)作
在檢查器中點(diǎn)擊Add(+),選擇Add Motion Field>重復(fù)上述步驟>在項(xiàng)目窗口中找到AnimationClips>展開(kāi)HumanoidWalk和HumanoidRun>將Walk和Run動(dòng)畫片段拖入Motion,確保Walk閾值為0,Run閾值為1
時(shí)間尺度設(shè)置:時(shí)間尺度的運(yùn)行原理和動(dòng)畫狀態(tài)速度類似,除了它僅適用于特定動(dòng)作。
如果動(dòng)作為人形動(dòng)畫,也可以對(duì)動(dòng)畫進(jìn)行鏡像操作。
嵌套融合樹(shù)(Nesting Blend Trees):如果希望在這個(gè)融合樹(shù)中嵌套另一個(gè)融合樹(shù),可以選擇Add(+)>New Blend Tree。
3.4.10 檢測(cè)融合樹(shù)
在層級(jí)窗口中選擇MazeLowMan>點(diǎn)擊Play>在檢查器中,用Speed滑塊調(diào)整走與跑的動(dòng)畫>再次點(diǎn)擊Play。
3.4.11 二維融合樹(shù):簡(jiǎn)單方向
當(dāng)每個(gè)融合位置軸上只有兩個(gè)動(dòng)畫時(shí),應(yīng)該使用二維簡(jiǎn)單方向融合樹(shù)。例如,如果坐標(biāo)軸四方向中每個(gè)方向都有一個(gè)不同的行走動(dòng)畫時(shí),就應(yīng)該使用二維簡(jiǎn)單方向融合樹(shù)。閾值標(biāo)簽為Pos X和Pos Y。
使用這類融合樹(shù)時(shí),也可以在中心融合位置(0,0)有一個(gè)動(dòng)作,表示無(wú)方向或中性方向(可選但推薦)。此時(shí),輸出權(quán)重取決于兩個(gè)線性插值的結(jié)合:
(1)樣本點(diǎn)兩個(gè)方向之間的插值,取決于從中心點(diǎn)到樣本點(diǎn)的角度。
(2)最終動(dòng)作與中心動(dòng)作之間的插值,取決于距中心的距離。樣本點(diǎn)距中心越近,分配的權(quán)重越高。
3.4.12 二維融合樹(shù):自由方向
二維自由方向融合樹(shù)允許每個(gè)方向有多個(gè)動(dòng)畫。
使用的插值算法被稱為極性梯度帶插值(Polar Gradient Band Interpolation)。
3.4.13 二維融合樹(shù):自由坐標(biāo)系
當(dāng)動(dòng)作不代表不同方向時(shí),應(yīng)該使用二維自由坐標(biāo)系融合樹(shù)。這是因?yàn)樵谧杂勺鴺?biāo)系中,X和Y可以代表不同概念。最終權(quán)重不是基于角度,對(duì)中心點(diǎn)也沒(méi)有特別對(duì)待。
二維自由坐標(biāo)系融合樹(shù)可以用于與一維融合樹(shù)類似的情況,其中每個(gè)動(dòng)作也是一個(gè)一維融合樹(shù)。區(qū)別在于,二維自由坐標(biāo)系融合樹(shù)使用更復(fù)雜的插值算法,即笛卡爾梯度帶插值(Cartesian Gradient Band Interpolation)。這意味著你可以在參數(shù)空間內(nèi)更自由地使用動(dòng)作。
3.4.14 測(cè)試二維自由坐標(biāo)系融合樹(shù)
建立二維自由坐標(biāo)系融合樹(shù)的過(guò)程和建立一維融合樹(shù)類似,但需要設(shè)置更多閾值。
在項(xiàng)目窗口中打開(kāi)2DFreefromCartesianBlendTrees場(chǎng)景>在層級(jí)窗口中選擇游戲物體MazeLowMan>點(diǎn)擊Play>在檢查器中找到Speed Turn Control腳本,調(diào)整兩個(gè)參數(shù),觀察其對(duì)角色的影響>再次點(diǎn)擊Play,退出播放模式。
3.4.15 復(fù)習(xí)二維自由坐標(biāo)系融合樹(shù)的設(shè)置
在檢查器中找到Animator>在Controller屬性中雙擊WalkRunTurnBlending Animator Controller>雙擊Locomotion狀態(tài)>選擇LocomotionBlendTree,觀察其設(shè)置。
3.4.16 直接融合樹(shù)
直接融合樹(shù)最簡(jiǎn)單,但最不常用。它允許有任意數(shù)量的動(dòng)作,每個(gè)動(dòng)作的權(quán)重直接由動(dòng)畫參數(shù)控制。它沒(méi)有閾值設(shè)置,而代之以參數(shù)選擇。這意味著你可能有多個(gè)權(quán)重為1的動(dòng)作。
您應(yīng)該將直接融合樹(shù)用于融合形狀動(dòng)畫之類的動(dòng)畫,其中每個(gè)融合形狀都是獨(dú)立的。融合形狀通常用于面部動(dòng)畫等。例如,您可能有一個(gè)融合形狀表示微笑,而另一個(gè)融合形狀表示皺眉。將它們作為單獨(dú)的動(dòng)作可讓您獨(dú)立控制微笑和皺眉。
3.4.17 融合樹(shù)的自動(dòng)設(shè)置選項(xiàng)
對(duì)于包含帶根運(yùn)動(dòng)的動(dòng)作的一維融合樹(shù)和二維融合樹(shù),動(dòng)作列表下方有自動(dòng)選項(xiàng)。它們可以自動(dòng)計(jì)算一維融合樹(shù)的閾值和二維融合樹(shù)的位置。
這些設(shè)置可以根據(jù)根運(yùn)動(dòng)將運(yùn)動(dòng)閾值設(shè)置為特定值。設(shè)置閾值后,你可以隨時(shí)更改它們。
可以用于設(shè)置閾值的根運(yùn)動(dòng)有:
速度:動(dòng)畫每秒移動(dòng)的平均米數(shù)。
速度X:動(dòng)畫每秒在本地X軸上移動(dòng)的平均米數(shù)。
速度Y:動(dòng)畫每秒在本地Y軸上移動(dòng)的平均米數(shù)。
速度Z:動(dòng)畫每秒在本地Z軸上移動(dòng)的平均米數(shù)。
角速度:動(dòng)畫每秒繞本地Y軸的平均旋轉(zhuǎn)速度??梢曰《然蚨葹閱挝贿M(jìn)行計(jì)算。
選擇選項(xiàng)
最佳選擇取決于您要融合的動(dòng)畫。
例如:
·如果您想將各種左移/右移動(dòng)畫與行走和奔跑動(dòng)畫融合,那么使用速度X和速度Z可能是不錯(cuò)的選擇。這是因?yàn)檫@些動(dòng)畫的屬性不同。
·如果要混合各種旋轉(zhuǎn)動(dòng)畫,那么角速度可能是正確的選擇。
這些選項(xiàng)非常有用,因?yàn)樗鼈冊(cè)试S根據(jù)動(dòng)畫的物理特性使用參數(shù)設(shè)置融合值或融合位置。
如果您有一個(gè)速度參數(shù)和一個(gè)帶有基于速度的動(dòng)作的融合樹(shù),則只需將速度參數(shù)的值設(shè)置為您希望角色移動(dòng)的速度,即可獲得所需的結(jié)果(假設(shè)融合樹(shù)具有適應(yīng)該速度的動(dòng)畫)。
調(diào)整時(shí)間尺度
如果融合樹(shù)中的所有動(dòng)作都不是子融合樹(shù),則將顯示調(diào)整時(shí)間尺度的選項(xiàng)。
與“計(jì)算閾值/位置”一樣,這些設(shè)置使您可以設(shè)置時(shí)間尺度的值(可以隨時(shí)調(diào)整)。但是,與計(jì)算閾值/位置不同,調(diào)整時(shí)間尺度將改變運(yùn)動(dòng)的速度,而不是運(yùn)動(dòng)的閾值。
要通過(guò)時(shí)間尺度設(shè)置來(lái)設(shè)置動(dòng)畫速度,您有兩個(gè)選擇:
(1)同質(zhì)速度:設(shè)置所有速度,使帶有非零根運(yùn)動(dòng)速度的動(dòng)畫具有相同速度。這樣會(huì)考慮到空閑動(dòng)作之類的動(dòng)畫,并且不會(huì)改變它們的速度。
(2)重置時(shí)間尺度:將所有速度設(shè)置回1。
3.4.18 總結(jié)
3.5 創(chuàng)建并設(shè)置過(guò)渡
3.5.1 概述
過(guò)渡(Transitions)是一種控制動(dòng)畫回放和融合的方法。
3.5.2 開(kāi)始之前
3.5.3 當(dāng)前狀態(tài)和下一個(gè)狀態(tài)
當(dāng)前狀態(tài)和下一個(gè)狀態(tài)的權(quán)重將以線性方式此消彼長(zhǎng)。
3.5.4 創(chuàng)建過(guò)渡
在動(dòng)畫器窗口中,右鍵單擊EllenRunForward狀態(tài),選擇Make Transition>左鍵單擊EllenQuickTurnLeft>選擇過(guò)渡線>在檢查器中展開(kāi)設(shè)置菜單。
注:如果兩個(gè)動(dòng)畫之間設(shè)置了多個(gè)過(guò)渡條件,那么過(guò)渡線上的箭頭將變?yōu)槿齻€(gè)。
3.5.5 調(diào)整退出時(shí)間設(shè)置
使用條件(Conditions)和退出時(shí)間(Exit Time)可以控制過(guò)渡發(fā)生的時(shí)間。
只有滿足以下兩條標(biāo)準(zhǔn)時(shí)才會(huì)開(kāi)始過(guò)渡:
(1)前一幀的標(biāo)準(zhǔn)化時(shí)間小于退出時(shí)間;
(2)當(dāng)前幀的標(biāo)準(zhǔn)化時(shí)間大于退出時(shí)間。
3.5.6 調(diào)整過(guò)渡持續(xù)時(shí)間設(shè)置
過(guò)渡持續(xù)時(shí)間可以用秒衡量(啟用Fixed Duration),也可以用當(dāng)前狀態(tài)的標(biāo)準(zhǔn)化時(shí)間衡量(禁用Fixed Duration)。
剛才已經(jīng)設(shè)置過(guò)渡開(kāi)始時(shí)間為第一個(gè)動(dòng)畫開(kāi)始后81%,那么過(guò)渡持續(xù)時(shí)間應(yīng)為EllenRunForward長(zhǎng)度的19%。
在檢查器窗口中,禁用Fixed Duration>將Transition Duration設(shè)為0.19。
3.5.7 測(cè)試過(guò)渡
3.5.8 了解過(guò)渡偏離(Transition offset)
偏離是發(fā)生過(guò)渡時(shí)下一個(gè)狀態(tài)開(kāi)始播放的標(biāo)準(zhǔn)化時(shí)間。它可以用于在過(guò)渡開(kāi)始時(shí)保持動(dòng)畫同相(in phase)等,例如在角色動(dòng)畫中,確保腿部位置類似。
3.5.9 了解過(guò)渡中斷設(shè)置
過(guò)渡可以被其他過(guò)渡打斷。這時(shí),過(guò)渡當(dāng)前幀的動(dòng)畫值將被存儲(chǔ)起來(lái),并作為中斷過(guò)渡的當(dāng)前狀態(tài)。這意味著中斷過(guò)渡的融合發(fā)生在初始過(guò)渡的某個(gè)時(shí)點(diǎn)和中斷過(guò)渡的下一個(gè)狀態(tài)之間。
“中斷來(lái)源(Interruption)”和“有序中斷(Ordered Interruption)”設(shè)置控制如何通過(guò)另一個(gè)過(guò)渡來(lái)中斷過(guò)渡。
中斷來(lái)源
動(dòng)畫控制器帶有過(guò)渡列表,當(dāng)前可以被每個(gè)動(dòng)畫圖層采用。每幀中都會(huì)檢查這些過(guò)渡的條件和退出時(shí)間。默認(rèn)情況下,此列表僅包含當(dāng)前狀態(tài)的過(guò)渡列表之后的狀態(tài)的過(guò)渡。
但是,當(dāng)動(dòng)畫層正在過(guò)渡時(shí),該過(guò)渡列表將替換為來(lái)自任何狀態(tài)的過(guò)渡,并且由當(dāng)前過(guò)渡的中斷來(lái)源定義其他過(guò)渡。
每個(gè)中斷來(lái)源的其他過(guò)渡是:
·無(wú):沒(méi)有過(guò)渡添加到列表中。
·當(dāng)前狀態(tài):將當(dāng)前狀態(tài)的有序列表中的過(guò)渡添加到列表中。
·下一個(gè)狀態(tài):將下一個(gè)狀態(tài)的有序列表中的過(guò)渡添加到列表中。
·從當(dāng)前狀態(tài)到下一個(gè)狀態(tài):將當(dāng)前狀態(tài)和下一個(gè)狀態(tài)的有序列表的過(guò)渡都按該順序添加到列表中。
·從下一個(gè)狀態(tài)到當(dāng)前狀態(tài):將下一個(gè)狀態(tài)到當(dāng)前狀態(tài)的有序列表的過(guò)渡都按該順序添加到列表中。
有序中斷
有序中斷控制當(dāng)前狀態(tài)的低優(yōu)先級(jí)過(guò)渡是否可以中斷過(guò)渡。如果啟用該屬性,則由于當(dāng)前狀態(tài)的低優(yōu)先級(jí)過(guò)渡順序較低,因此它們不能中斷過(guò)渡。
3.5.10 了解過(guò)渡條件
過(guò)渡條件是對(duì)動(dòng)畫參數(shù)值的邏輯描述,滿足這些條件時(shí)將啟動(dòng)過(guò)渡。每個(gè)過(guò)渡可以有多個(gè)條件,全部滿足時(shí)才開(kāi)始過(guò)渡。
每類參數(shù)都有不同的條件邏輯描述:浮點(diǎn)參數(shù)、整數(shù)參數(shù)、開(kāi)關(guān)參數(shù)和布爾變量。
創(chuàng)建條件:在條件列表底部點(diǎn)擊New Condition(+)>選擇條件所基于的參數(shù)>如果參數(shù)是浮點(diǎn)或整數(shù),選擇比較類型>如果參數(shù)是浮點(diǎn)、整數(shù)或布爾變量,選擇與參數(shù)進(jìn)行比較的值。
3.5.11 任意狀態(tài)
動(dòng)畫控制器的每一層都有一個(gè)特殊節(jié)點(diǎn),稱為“任意狀態(tài)(Any State)”。它允許從其創(chuàng)建過(guò)渡,但不允許過(guò)渡指向它。從任意狀態(tài)發(fā)起的過(guò)渡總在列表首位。只有在確定每幀都要檢查任意狀態(tài)時(shí),才應(yīng)該使用任意狀態(tài)。
3.5.12 總結(jié)
3.6 創(chuàng)建狀態(tài)機(jī)
3.6.1 概述
狀態(tài)機(jī)是動(dòng)畫控制器的核心結(jié)構(gòu)之一。
3.6.2 開(kāi)始之前
3.6.3 狀態(tài)機(jī)介紹
每個(gè)動(dòng)畫控制器都有一個(gè)或多個(gè)動(dòng)畫圖層,每個(gè)動(dòng)畫圖層包含一個(gè)狀態(tài)機(jī)。每個(gè)狀態(tài)機(jī)中可能有更多的嵌套狀態(tài)機(jī)。
3.6.4 創(chuàng)建狀態(tài)機(jī)
狀態(tài)機(jī)是一種組織工具,將狀態(tài)和過(guò)渡組織起來(lái)。除非有很多狀態(tài)要組織,否則可能不創(chuàng)建狀態(tài)機(jī)更有效率。
右鍵單擊動(dòng)畫控制器背景,并選擇Create Sub-State Machine>雙擊新創(chuàng)建的子狀態(tài)機(jī)并打開(kāi)>雙擊(Up)node,返回母狀態(tài)機(jī)。
在狀態(tài)機(jī)中添加狀態(tài)的兩種主要方法:
(1)雙擊狀態(tài)機(jī)打開(kāi)并創(chuàng)建狀態(tài)
(2)如果已經(jīng)創(chuàng)建了狀態(tài),可以點(diǎn)擊狀態(tài)并將其拖拽至狀態(tài)機(jī)節(jié)點(diǎn),從而將其添加到狀態(tài)機(jī)中。
3.6.5 了解狀態(tài)機(jī)的過(guò)渡
過(guò)渡的兩種方法:
·從狀態(tài)直接過(guò)渡
·從狀態(tài)過(guò)渡到狀態(tài)機(jī),再?gòu)臓顟B(tài)機(jī)過(guò)渡
3.6.6 了解狀態(tài)機(jī)的節(jié)點(diǎn)
建立狀態(tài)機(jī)時(shí),可以使用上節(jié)點(diǎn)(Up node)或進(jìn)入和退出節(jié)點(diǎn)(Entry and Exit nodes):
·從狀態(tài)或狀態(tài)機(jī)發(fā)出的過(guò)渡
·從嵌套在其他狀態(tài)機(jī)內(nèi)部的狀態(tài)機(jī)發(fā)出的過(guò)渡
上節(jié)點(diǎn)表示內(nèi)外節(jié)點(diǎn)之間的直接過(guò)渡。
進(jìn)入和退出節(jié)點(diǎn)用于狀態(tài)機(jī)本身的過(guò)渡。它必須與一個(gè)或多個(gè)狀態(tài)機(jī)本身的過(guò)渡相結(jié)合。
使用進(jìn)入與退出節(jié)點(diǎn)的過(guò)渡
過(guò)渡是以下要素的結(jié)合:
·邏輯,它決定了過(guò)渡發(fā)生的時(shí)間
·融合,它決定了當(dāng)前狀態(tài)和下一個(gè)狀態(tài)如何融合
使用狀態(tài)機(jī)(而非狀態(tài))過(guò)渡時(shí),邏輯和融合將分為多個(gè)過(guò)渡。一些過(guò)渡單純負(fù)責(zé)邏輯,另一些過(guò)渡同時(shí)負(fù)責(zé)邏輯和融合。
3.6.7 總結(jié)
3.7 創(chuàng)建和設(shè)置動(dòng)畫圖層
3.7.1 概述
動(dòng)畫圖層是動(dòng)畫控制器結(jié)構(gòu)的一部分,也是另一種同時(shí)播放和融合多個(gè)動(dòng)畫的方式。
3.7.2 開(kāi)始之前
3.7.3 動(dòng)畫圖層基礎(chǔ)
兩種方式
(1)融合優(yōu)先于其他動(dòng)畫圖層的動(dòng)作。
(2)融合添加到其他動(dòng)畫圖層的動(dòng)作中。
動(dòng)畫圖層索引:動(dòng)畫圖層有索引?;A(chǔ)圖層的索引序號(hào)為0。動(dòng)畫圖層按升序評(píng)估(從0開(kāi)始)。
動(dòng)畫圖層權(quán)重:每個(gè)動(dòng)畫圖層都有權(quán)重,但動(dòng)畫圖層之間的融合與過(guò)渡或融合樹(shù)略有不同。
3.7.4 遮罩
需要拗動(dòng)作時(shí),可以通過(guò)遮罩使不同部分的骨骼播放獨(dú)立動(dòng)作。方法是在需要只播放部分動(dòng)畫的動(dòng)畫圖層中加入對(duì)Avatar Mask資源的引用。
3.7.5 動(dòng)畫圖層融合過(guò)程
動(dòng)畫圖層按照索引序號(hào)升序評(píng)估動(dòng)畫結(jié)果:先評(píng)估圖層0>評(píng)估圖層1,再與圖層0融合>評(píng)估圖層2,然后與圖層0和圖層1的融合結(jié)果融合>以此類推
兩種融合方式:優(yōu)先融合(Override blending)和疊加融合(Additive blending)
3.7.6 優(yōu)先融合
優(yōu)先融合類似于使用過(guò)渡和一維融合樹(shù)的融合。隨著下一個(gè)動(dòng)畫圖層的貢獻(xiàn)增加,前一個(gè)動(dòng)畫圖層的貢獻(xiàn)減少。
3.7.7 疊加融合
疊加融合用于支持疊加動(dòng)畫。疊加動(dòng)畫是動(dòng)畫數(shù)據(jù)本身作為與參考姿勢(shì)的變化而存儲(chǔ)的動(dòng)畫。
使用疊加融合時(shí),已評(píng)估動(dòng)畫圖層的實(shí)際權(quán)重總為1。疊加圖層的動(dòng)畫被加到這些圖層的貢獻(xiàn)上。所取的動(dòng)畫數(shù)據(jù)是默認(rèn)值和當(dāng)前值之間的變化值,用來(lái)計(jì)算加權(quán)貢獻(xiàn)。
3.7.8 探索疊加動(dòng)畫
在層級(jí)窗口中選擇Ellen>點(diǎn)擊Play>在檢查器中找到Layer Weight Setter組件>調(diào)整Weight并觀察效果>點(diǎn)擊Play退出
3.7.9 了解動(dòng)畫圖層的設(shè)置
在層級(jí)窗口中選擇Ellen>打開(kāi)動(dòng)畫器窗口>選擇左上的Layers標(biāo)簽,可以看到有兩個(gè)圖層:基礎(chǔ)圖層(索引序號(hào)為0)、AdditiveHeavyBreathing圖層(索引序號(hào)為1)
選擇AdditiveHeavyBreathing圖層>打開(kāi)設(shè)置齒輪
3.7.10 了解權(quán)重、Avatar遮罩和融合設(shè)置
權(quán)重:增加權(quán)重將增加本圖層對(duì)最終動(dòng)畫的貢獻(xiàn)
Avatar遮罩:用于防止動(dòng)畫圖層寫入身體的特定部分。
融合:可以設(shè)為優(yōu)先融合或附加融合。
3.7.11 了解同步(Sync)與IK Pass
同步
啟用同步后,將需要確定你想與當(dāng)前動(dòng)畫圖層同步的動(dòng)畫圖層。這將創(chuàng)建與源動(dòng)畫圖層相同的狀態(tài)機(jī)。
默認(rèn)情況下,狀態(tài)機(jī)將匹配源狀態(tài)機(jī)的時(shí)間。這意味著當(dāng)源動(dòng)畫圖層發(fā)生過(guò)渡時(shí),同步動(dòng)畫圖層夜間該發(fā)生過(guò)渡。
但是,如果啟用Timing,則狀態(tài)持續(xù)時(shí)間將是源動(dòng)畫圖層的動(dòng)畫片段長(zhǎng)度和同步的動(dòng)畫圖層的動(dòng)畫片段長(zhǎng)度的內(nèi)插值。它們將基于同步的動(dòng)畫圖層的權(quán)重。
查看啟用Timing的同步示例
例如,假設(shè)您有一個(gè)帶有“行走”和“奔跑”狀態(tài)的基本動(dòng)畫圖層。然后,您創(chuàng)建另一個(gè)稱為“受傷”的圖層,該圖層被同步到基本圖層。
受傷圖層將具有設(shè)置了相同過(guò)渡的行走和奔跑狀態(tài),但是你可以將動(dòng)畫片段替換為“受傷行走”和“受傷奔跑”。由于圖層已同步,因此它們將一起過(guò)渡。但是,它們具有不同的持續(xù)時(shí)間。
如果啟用了Timing,則“受傷圖層”上的狀態(tài)持續(xù)時(shí)間將向基本圖層上的狀態(tài)持續(xù)時(shí)間進(jìn)行內(nèi)插。受傷圖層的權(quán)重為1表示狀態(tài)將與基礎(chǔ)圖層上的狀態(tài)具有相同的持續(xù)時(shí)間。
IK Pass
最后一個(gè)設(shè)置是IK Pass。此設(shè)置僅適用于人形動(dòng)畫。
如果啟用,它將導(dǎo)致在與動(dòng)畫器組件所掛的游戲物體上的MonoBehaviours調(diào)用評(píng)估IK的方法,以及該動(dòng)畫圖層的狀態(tài)機(jī)行為。
3.7.12 總結(jié)
4. 動(dòng)畫腳本簡(jiǎn)介
4.1 一般動(dòng)畫腳本簡(jiǎn)介
4.1.1 概述
4.1.2 開(kāi)始之前
4.1.3 控制動(dòng)畫參數(shù)的值
動(dòng)畫參數(shù)可以控制動(dòng)畫的運(yùn)行方式,例如:
·何時(shí)開(kāi)始過(guò)渡
·融合樹(shù)的融合值與融合位置
·各種狀態(tài)設(shè)置
4.1.4 設(shè)置動(dòng)畫參數(shù)的值
控制動(dòng)畫參數(shù)的值的四種方法:
·animator.SetBool()
·animator.SetFloat()
·animator.SetInteger()
·animator.SetTrigger()
每種方法都必須定義變量名稱和變量的值。
定義變量名稱的兩種方式:使用名稱字符串;使用被稱為哈希數(shù)(hash)的整數(shù)表示名稱
例如:animator.SetFloat("Speed", 5f);
或
animator.SetFloat(speedParameterHash, 5f);
字符串哈希值
speedParameterHash為速度參數(shù)名稱的哈希數(shù)。
為了在動(dòng)畫控制器中創(chuàng)建字符串的哈希數(shù),可以使用以下靜態(tài)方法:
Animator.StringToHash()
然后可以用它初始化子變量:
int speedParameterHash = Animator.StringToHash("Speed");
為了防止誤操作被更改,可以將其設(shè)為只讀:
static readonly int speedParameterHash = Animator.StringToHash("Speed");
一個(gè)完整例子:
4.1.5 獲取動(dòng)畫參數(shù)的值
獲取動(dòng)畫參數(shù)值的方法:
·animator.GetBool()
·animator.GetFloat()
·animator.GetInteger()
調(diào)用布爾參數(shù)值的示例:
bool isCharacterGrounded = animator.GetBool("IsGrounded");
或
bool isCharacterGrounded = animator.GetBool(isGroundedParameterHash);
如果導(dǎo)入動(dòng)畫使用了附加動(dòng)畫曲線,且曲線的值和動(dòng)畫參數(shù)的浮點(diǎn)值相同,那么在評(píng)估動(dòng)畫時(shí),參數(shù)的值將被設(shè)為動(dòng)畫曲線的值。
4.1.6 控制動(dòng)畫圖層的權(quán)重
設(shè)置動(dòng)畫圖層權(quán)重的兩種方法:
·animator.SetLayerWeight()
·animator.GetLayerWeight()
示例
animator.SetLayerWeight (1, 0.5f);
或
float shootingLayerWeight = animator.GetLayerWeight (2);
4.1.7 動(dòng)畫流控制(flow control)簡(jiǎn)介
需要獨(dú)立控制動(dòng)畫流時(shí),可以使用以下方法:
·Play()
·PlayInFixedTime()
·CrossFade()
·CrossFadeInFixedTime()
4.1.8 使用Play和PlayInFixedTime
這兩種方法都有最多三個(gè)參數(shù):
·需要播放的狀態(tài)名稱(字符串或狀態(tài)名稱的哈希數(shù))
·需要播放的狀態(tài)所在圖層的索引
·狀態(tài)開(kāi)始播放的時(shí)間
Play()的時(shí)間參數(shù)是標(biāo)準(zhǔn)化的(0-1),PlayInFixedTime()的時(shí)間參數(shù)以秒為單位。
示例
animator.Play(“Run”, 0, 0.1f);
或
animator.PlayInFixedTime(shootStateHash, 1, 0f);
4.1.9 使用CrossFade和CrossFadeInFixedTime
這兩種過(guò)渡方法最多有五個(gè)參數(shù):
·過(guò)渡目標(biāo)名稱(字符串或狀態(tài)名稱的哈希數(shù))
·淡出時(shí)長(zhǎng)
·交叉淡出(cross-faded)的目標(biāo)狀態(tài)圖層索引
·與過(guò)渡目標(biāo)狀態(tài)的偏離
·同時(shí)淡出淡入到開(kāi)始的時(shí)間
CrossFade使用標(biāo)準(zhǔn)化時(shí)間,CrossFadeInFixedTime使用秒數(shù)。但兩種方法的最后一個(gè)參數(shù)均使用秒數(shù)。
4.1.10 動(dòng)畫流控制示例
animator.CrossFade(walkStateHash, 1f, 0, 0.1f, 0f);
該同時(shí)淡出淡入效果與同時(shí)淡出淡入源狀態(tài)的時(shí)長(zhǎng)相同,因?yàn)闃?biāo)準(zhǔn)化過(guò)渡時(shí)長(zhǎng)參數(shù)為1。過(guò)渡狀態(tài)位于基礎(chǔ)動(dòng)畫圖層(0)上。當(dāng)同時(shí)淡出淡入開(kāi)始時(shí),將發(fā)生三件事:
(1)淡出狀態(tài)將在常規(guī)過(guò)渡開(kāi)始時(shí)同步播放。
(2)淡入狀態(tài)將在1/10處開(kāi)始播放,因?yàn)闀r(shí)間偏離參數(shù)為0.1f。
(3)它將播放整個(gè)過(guò)渡,因?yàn)樗_(kāi)始的標(biāo)準(zhǔn)化時(shí)間為0f。
示例
4.1.11 MonoBehaviour信息
多數(shù)動(dòng)畫腳本可以在MonoBehaviour的Update或FixedUpdate中調(diào)用,但有些動(dòng)作是例外,尤其是MonoBehaviours:OnAnimatorMove和OnAnimatorIK。
OnAnimatorIK
只有當(dāng)動(dòng)畫組件有人形Avatar時(shí)調(diào)用OnAnimatorIK。它可以用于任何IK。
OnAnimatorMove
該方法可以在人形動(dòng)畫或泛型動(dòng)畫中調(diào)用。通常,動(dòng)畫組件中的根運(yùn)動(dòng)可以啟用或禁用,但如果MonoBehaviour調(diào)用了該方法,則它將控制根運(yùn)動(dòng)。
用animator.deltaPosition和animator.deltaRotation屬性可以改變動(dòng)畫行為。
調(diào)用順序
這些信息按照動(dòng)畫控制器的內(nèi)部更新過(guò)程的順序調(diào)用。該變化基于動(dòng)畫組件中的Update Mode設(shè)置。
如果Update Mode設(shè)為Normal,那么調(diào)用順序?yàn)閁pdate>OnAnimatorMove>OnAnimatorIK>LateUpdate
如果Update Mode設(shè)為Animate Physics,那么調(diào)用順序?yàn)镕ixedUpdate>OnAnimatorMove>物理系統(tǒng)運(yùn)行內(nèi)部更新,檢查碰撞,并解決它們>OnAnimatorIK
4.1.12 狀態(tài)與動(dòng)畫片段信息
用于了解動(dòng)畫控制器情況的部分方法:
是否在進(jìn)行過(guò)渡?
animator.IsInTransition()
整數(shù)值代表希望檢查的動(dòng)畫圖層索引,如果正在進(jìn)行過(guò)渡則返回值為真。
播放的是什么狀態(tài)?
animator.GetCurrentAnimatorStateInfo()
animator.GetNextAnimatorStateInfo()
整數(shù)值代表希望檢查的動(dòng)畫圖層索引,返回結(jié)果為AnimatorStateInfo。它包括關(guān)于狀態(tài)的精確信息,例如:
·長(zhǎng)度(Length)
·名稱和標(biāo)簽的哈希數(shù)
·速度
如果下一個(gè)狀態(tài)沒(méi)有動(dòng)畫圖層過(guò)渡,將得到默認(rèn)值。
獲得關(guān)于動(dòng)畫片段的信息
animator.GetCurrentAnimatorClipInfo()
animator.GetNextAnimatorClipInfo()
它的運(yùn)行原理類似于用來(lái)獲取AnimatorStateInfor的方法,但返回的是AnimatorClipInfors,它將給出播放的動(dòng)畫片段及其權(quán)重(同時(shí)考慮融合樹(shù)和過(guò)渡的融合權(quán)重)。它不考慮動(dòng)畫圖層的權(quán)重。
4.1.3 總結(jié)
4.2 人形動(dòng)畫腳本簡(jiǎn)介
4.2.1 概述
人形骨架有可預(yù)測(cè)的結(jié)構(gòu),且在Unity設(shè)置變形值之前,動(dòng)畫被轉(zhuǎn)換為“肌肉空間(muscle space)”。這意味著可能內(nèi)置有IK和目標(biāo)匹配等特征。
4.2.2 開(kāi)始之前
4.2.3 目標(biāo)匹配與IK基礎(chǔ)
在正常情況下,變形層級(jí)按照正向運(yùn)動(dòng)學(xué)(Forward Kinematics, FK)運(yùn)行。
有時(shí)我們希望單獨(dú)設(shè)置層級(jí)底部(稱為effector)骨骼的位置或旋轉(zhuǎn)。這時(shí),層級(jí)其余部分需要變化以適應(yīng)effector的位置或旋轉(zhuǎn)。我們可以通過(guò)兩種方式來(lái)實(shí)現(xiàn)這種效果:
(1)目標(biāo)匹配
(2)反向運(yùn)動(dòng)學(xué)(IK)
4.2.4 目標(biāo)匹配簡(jiǎn)介
目標(biāo)匹配移動(dòng)層級(jí)的根,使操縱器(effector)處于正確位置或旋轉(zhuǎn),而不用改變其余層級(jí)。
4.2.5 反向運(yùn)動(dòng)學(xué)簡(jiǎn)介
IK不移動(dòng)層級(jí)的根,而是改變角色的姿勢(shì)。
用于人形骨架時(shí),IK使用兩根骨骼代表手臂或腿。
4.2.6 目標(biāo)匹配
目標(biāo)匹配使用MatchTarget方法或動(dòng)畫控制器。該方法將在你希望目標(biāo)匹配開(kāi)始前的任意時(shí)間在狀態(tài)中被調(diào)用。
MatchTarget的參數(shù)可以分為三組,每組有兩個(gè)參數(shù):
(1)關(guān)于被匹配目標(biāo)的信息
(2)關(guān)于被匹配操縱器的信息
(3)關(guān)于目標(biāo)匹配何時(shí)開(kāi)始的信息
目標(biāo)信息參數(shù)是被匹配的世界空間位置和被匹配的世界空間旋轉(zhuǎn)。
AvatarTarget
操縱器的第一個(gè)信息參數(shù)是決定哪部分身體是操縱器的枚舉。它被稱為AvatarTarget,因?yàn)樗挥糜跊Q定哪部分人形Avatar將被匹配給具有以下值的目標(biāo):
·根
·身體
·左腳
·右腳
·左手
·右手
根通常位于兩腳之間,身體為角色重心。
MatchTargetWeightMask
它決定了初始位置與操縱器操縱的目標(biāo)位置的平衡。它有兩個(gè)部分:
·位置權(quán)重
·旋轉(zhuǎn)權(quán)重
位置權(quán)重(稱為positionXYZWeight)是一個(gè)三維向量,每個(gè)軸的值在0和1之間。
旋轉(zhuǎn)權(quán)重(稱為rotationWeight)是允許在初始旋轉(zhuǎn)和目標(biāo)旋轉(zhuǎn)之間進(jìn)行插值的浮點(diǎn)。
最后兩個(gè)參數(shù)為賦予狀態(tài)標(biāo)準(zhǔn)化時(shí)間的浮點(diǎn)。它們表示目標(biāo)匹配的開(kāi)始時(shí)間和到達(dá)目標(biāo)的時(shí)間。
4.2.7 了解目標(biāo)匹配案例
在項(xiàng)目窗口中打開(kāi)示例場(chǎng)景>選擇游戲物體MazeLowMan>在檢查器中,禁用Vault Target Matching腳本>播放并觀察,看到人物的手并沒(méi)有接觸到障礙物,且腿部穿過(guò)了障礙物>退出播放狀態(tài),并重新啟用Vault Target Matching腳本>播放并觀察。
4.2.8 人形反向運(yùn)動(dòng)學(xué)
與動(dòng)畫使用的雙骨骼反向運(yùn)動(dòng)學(xué)(IK)一起使用的有三個(gè)重要變量:
(1)目標(biāo)位置
(2)目標(biāo)旋轉(zhuǎn)
(3)暗示位置
目標(biāo)位置和目標(biāo)旋轉(zhuǎn)是手或腳試圖達(dá)到的位置和旋轉(zhuǎn)。暗示位置是肘部和膝蓋試圖達(dá)到的位置。
4.2.9 了解IK方法
以下三個(gè)重要變量都有自身的權(quán)重,可以用于手臂或腿。動(dòng)畫控制器有一種方法可以設(shè)置每個(gè)變量及其權(quán)重,因此共有六種方法。
·SetIKHintPosition
·SetIKHintPositionWeight
·SetIKPosition
·SetIKPositionWeight
·SetIKRotation
·SetIKRotationWeight
所有方法都有兩個(gè)參數(shù):影響的身體部分;設(shè)置的值
使用OnAnimatorIK方法
這些方法可以在動(dòng)畫的IK pass中調(diào)用。為此,需要使用MonoBehaviour的OnAnimatorIK方法。
OnAnimatorIK的運(yùn)行原理非常類似于MonoBehaviours中的Update。它發(fā)生在Update或FixedUpdate之后(取決于動(dòng)畫器的更新模式)。
在每個(gè)啟用IK Pass的動(dòng)畫圖層,每次更新將調(diào)用一次OnAnimatorIK。每次調(diào)用將圖層索引作為參數(shù)傳輸。這意味著你可以分別處理不同的IK用途。
4.2.10 總結(jié)
?