Unity動(dòng)畫系統(tǒng)
Unity動(dòng)畫系統(tǒng)分為
- 動(dòng)畫片段 Animation Clip: 動(dòng)畫資源,與模型無關(guān)
- 動(dòng)畫狀態(tài)機(jī) Animator Controller:幫助我們跟蹤當(dāng)前動(dòng)畫的播放狀態(tài),并且根據(jù)設(shè)置覺得如何切換動(dòng)畫片段
- 動(dòng)畫組件 Animator Component:玩家角色需要播放動(dòng)畫功能時(shí),需要?jiǎng)赢嫿M件,將游戲?qū)ο笮枰膭?dòng)畫狀態(tài)機(jī)(以及替身)放入該組件,之后便可以在游戲腳本中自由訪問該組件,從而自由控制游戲?qū)ο髣?dòng)畫。
- 替身 Avatar:人形動(dòng)畫骨骼的標(biāo)準(zhǔn),所有按照同一標(biāo)準(zhǔn)配置好的人形角色都可以播放同一套動(dòng)畫。
動(dòng)畫片段 Animation Clip
在Unity中制作動(dòng)畫
- 點(diǎn)擊Window,打開animatioin窗口
- 選中需要制作動(dòng)畫的物體,點(diǎn)擊create,選擇一個(gè)位置保存。
Unity為我們在保存位置生成了一個(gè)動(dòng)畫片段(.anim) 文件和一個(gè)pivet 動(dòng)畫狀態(tài)機(jī)(.controller),
并且,在需要制作動(dòng)畫的物體上掛在了一個(gè)Animator
組件
注:動(dòng)畫片段文件(.anim)是使用標(biāo)記語言YAML編寫的文件(Unity中絕大多數(shù)文件都是使用YAML來記錄的)
- 選中物體,切換到Animation視圖,選中這里的add Property,選擇要對哪些屬性進(jìn)行變換
- 時(shí)間標(biāo)尺的默認(rèn)長度為1s,在起始位置0s和結(jié)束位置1s處各有一個(gè)關(guān)鍵幀。
- 選擇對應(yīng)的關(guān)鍵幀,或在任意位置修改數(shù)據(jù),即可創(chuàng)建關(guān)鍵幀。修改關(guān)鍵幀后,中間的幀可根據(jù)兩邊關(guān)鍵幀插值計(jì)算得到。
- 點(diǎn)擊左下角的Curves,我們就能已曲線的形式觀察并修改當(dāng)前的動(dòng)畫片段
- 打開動(dòng)畫片段文件(.anim),在檢視視圖下看到Euler:1,說明包含一段歐拉角運(yùn)動(dòng)。
動(dòng)畫復(fù)用
當(dāng)動(dòng)畫文件只對應(yīng)一個(gè)物體的時(shí)候,可以復(fù)用到任何一個(gè)物體上。
當(dāng)動(dòng)畫文件要處理多個(gè)物體或多個(gè)游戲?qū)ο髸r(shí),會(huì)在文件中寫上該物體的對象名稱,unity會(huì)通過文件里的這個(gè)名稱找到正確的游戲?qū)ο蟆?br> 如果游戲?qū)ο蟮拿趾蛣?dòng)畫文件中的不一致,就無法正常播放。
動(dòng)畫復(fù)用,當(dāng)骨骼結(jié)構(gòu)一致,命名也一致,就可以對動(dòng)畫文件進(jìn)行復(fù)用。
當(dāng)骨骼結(jié)構(gòu)相似,但動(dòng)畫命名不一致時(shí),修改命名以及骨骼系統(tǒng)就可以復(fù)用動(dòng)畫,但Unity對人形骨骼有簡便的處理方式:Avator
替身系統(tǒng) Avatar
當(dāng)兩個(gè)角色的命名方式不一樣時(shí),動(dòng)畫不能復(fù)用。
如下:名稱不匹配,會(huì)在Animation窗口顯示Missing!
使用替身系統(tǒng),需要為兩個(gè)模型都添加替身,使得兩模型替身命名方式相同。
- 對模型創(chuàng)建Avatar,對所有模型創(chuàng)建,并可在Avatar配置中對模型的修改量進(jìn)行參數(shù)設(shè)置。具體可看【Unity動(dòng)畫系統(tǒng)詳解 四】八分鐘理解并掌握Avatar和人形動(dòng)畫復(fù)用【Unity開發(fā)入門教程12】 5:05
- 對A模型的動(dòng)作配置A模型的Avatar,對B模型的動(dòng)作配置B模型的Avator。
- 新建Animator Controller,在動(dòng)畫狀態(tài)機(jī)中添加動(dòng)作。
- 對場景中的角色模型添加Animator組件,不同的模型選擇不同的Avatar,但可以共用相同的動(dòng)畫狀態(tài)機(jī)。
Animator 組件 Animator Component
- Controller 動(dòng)畫狀態(tài)機(jī)
- Avatar 替身系統(tǒng):在組件這里,還擔(dān)任了一個(gè)傳令兵的職責(zé),會(huì)在當(dāng)前對象以及子對象中層層尋找符合要求的模型。
- Apply Root Motion:有些動(dòng)畫自帶位移,如果希望動(dòng)畫位移應(yīng)用在游戲上,則勾選。
- update mode:動(dòng)畫的刷新模式(重新計(jì)算每個(gè)骨骼結(jié)點(diǎn)的位置轉(zhuǎn)向和縮放的數(shù)值)
- normal:和幀率同步(update())
- Animate Physics:與物理引擎同步(fixedUpdate())
- Unscaled Time:和幀率同步,但會(huì)忽略時(shí)間標(biāo)尺,及當(dāng)修改時(shí)間標(biāo)尺(游戲中1s對應(yīng)現(xiàn)實(shí)2s,則Unscaled Time不受影響)
- Culling Mode 剔除模式: 當(dāng)游戲?qū)ο鬀]有被看到時(shí),如何處理
- Always Animate : 動(dòng)畫不受影響
- Cull Update Transforms:剔除關(guān)于IK之類的操作
- Cull Completely:完全停止動(dòng)畫
動(dòng)畫狀態(tài)機(jī) Animator Controller
動(dòng)畫狀態(tài)
動(dòng)畫狀態(tài)的類型
- 單獨(dú)的動(dòng)畫片段
添加單獨(dú)動(dòng)畫片段的三種方法
1. 新建空狀態(tài),再添加動(dòng)畫
2. 選中動(dòng)畫,右鍵添加
3. 直接拖動(dòng)動(dòng)畫
- 多個(gè)動(dòng)畫片段組成的混合書 Blend Tree
- 另一個(gè)動(dòng)畫狀態(tài)機(jī)
動(dòng)畫狀態(tài)的屬性
- 名稱:修改狀態(tài)機(jī)中展示的文本,以便管理
- 標(biāo)簽Tag:給不同的動(dòng)畫狀態(tài)打上標(biāo)簽進(jìn)行分類,可在腳本中便于統(tǒng)一管理
//獲取當(dāng)前狀態(tài)機(jī)正在播放的動(dòng)畫狀態(tài)
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(animator.GetLayerIndex("層級名稱"));
//通過標(biāo)簽對不同的標(biāo)簽動(dòng)畫,做不同的事
if(stateInfo.isTag("標(biāo)簽名稱")){
......
}
- Motion :動(dòng)畫片段或混合樹
- Speed:動(dòng)畫的播放速度(不能通過腳本更改)
- Multiplier:動(dòng)畫實(shí)際速度為Speed與Multiplier的乘積(設(shè)置Parameter后,可通過腳本修改參數(shù))
- Motion Time:播放動(dòng)畫的時(shí)間點(diǎn)(注意:只會(huì)播放單幀)【適合制作單幀2D動(dòng)畫】
- Mirror:鏡像動(dòng)畫
- Cycle Offset:動(dòng)畫播放的起始位置[0,1]
- Foot IK:使用了IK的動(dòng)畫矯正機(jī)制
- Write Defaults :默認(rèn)開啟,是否為其運(yùn)動(dòng)未動(dòng)畫化的屬性寫回默認(rèn)值。但是有很大的坑,一般情況下禁用。
[Unity] AnimatorStates中的write defaults詳解:https://blog.csdn.net/rickshaozhiheng/article/details/77838379
動(dòng)畫狀態(tài)機(jī)----動(dòng)畫轉(zhuǎn)換
點(diǎn)擊狀態(tài),可看到狀態(tài)下的所有轉(zhuǎn)化。文章來源:http://www.zghlxwxcb.cn/news/detail-539543.html
- 如果有勾選Solo的轉(zhuǎn)化,只對勾選Solo的狀態(tài)轉(zhuǎn)換,
- 哪個(gè)轉(zhuǎn)換的條件先滿足,就執(zhí)行哪個(gè)轉(zhuǎn)換。
- 如果條件同時(shí)滿足,則執(zhí)行最上面的轉(zhuǎn)換
- 如果沒有勾選Solo的轉(zhuǎn)換
- 對勾選了Mute的轉(zhuǎn)換永遠(yuǎn)不會(huì)執(zhí)行
轉(zhuǎn)換屬性的配置面板
- Has Exit Time : 當(dāng)前動(dòng)畫狀態(tài)播放到某個(gè)時(shí)間點(diǎn)的時(shí)候,就執(zhí)行這個(gè)轉(zhuǎn)換。如果不勾選,就必須在Conditions下對轉(zhuǎn)換添加其他條件。
- 展示圖
- 最上方的白線:Root motion動(dòng)畫在水平方向上的位移
- Exit Time:動(dòng)畫開始轉(zhuǎn)化的時(shí)間(勾選Has Exit Time下有效)
- Fixed Duration : 轉(zhuǎn)換的持續(xù)時(shí)間
- 勾選(按秒讀),后面有(s)
- 不勾選(按百分比讀),后面有(%)
- Transition Offset:進(jìn)入下一個(gè)動(dòng)畫片段時(shí)下一個(gè)動(dòng)畫開始播放的偏移量,取值[0,1]。
- Interruption Source : 表示哪些轉(zhuǎn)化可以打斷當(dāng)前這個(gè)轉(zhuǎn)換
- None:當(dāng)前這個(gè)狀態(tài)不可被打斷
- Current State:可以被當(dāng)前出發(fā)狀態(tài)的其他轉(zhuǎn)換打斷
- Next State:可被從目的狀態(tài)出發(fā)的其他轉(zhuǎn)換打斷
- Current State Then Next State:出發(fā)狀態(tài)的其他狀態(tài)優(yōu)先
- Next State Then Current State:目的狀態(tài)的其他狀態(tài)優(yōu)先
- Ordered Interruption:默認(rèn)被勾選,只有優(yōu)先集比當(dāng)前轉(zhuǎn)換的優(yōu)先級高的轉(zhuǎn)換才可打斷當(dāng)前轉(zhuǎn)換(點(diǎn)擊狀態(tài),狀態(tài)轉(zhuǎn)化欄中,越靠上的優(yōu)先級越高)。不勾選的話,則不考慮優(yōu)先級。
- Conditions
- 使用setTrigger,setInt等激活觸發(fā)器或來改變條件的值設(shè)置值
- 如果與Trigger相關(guān)聯(lián)的動(dòng)畫并沒有被執(zhí)行,trigger就會(huì)一直處于激活狀態(tài),直到轉(zhuǎn)換被執(zhí)行。
- 轉(zhuǎn)換條件可以設(shè)計(jì)多條,之間的關(guān)系為邏輯與(當(dāng)所有條件都滿足時(shí)才會(huì)轉(zhuǎn)換)
動(dòng)畫狀態(tài)機(jī)—層級和參數(shù)
Layers 用于組合動(dòng)畫
- 權(quán)重:當(dāng)前層級會(huì)在多大程度上影響整個(gè)動(dòng)畫的最終表現(xiàn)
- Mask用于層級遮蔽,過濾不受影響的點(diǎn),既可以在Humanoid中點(diǎn)擊設(shè)置,也可以在Transfrom中精準(zhǔn)設(shè)置可以被影響的點(diǎn)
使用Mask后,【層級會(huì)標(biāo)注M來表示】。 - Blending【覆蓋override、添加additive】
- sync 同步:與某個(gè)層級保持一致、狀態(tài)轉(zhuǎn)化相同
- Timing
- IK Pass:當(dāng)前層級使用IK則打開【層級會(huì)標(biāo)注IK來表示】
越向下,優(yōu)先級越高文章來源地址http://www.zghlxwxcb.cn/news/detail-539543.html
- Parameters
//修改參數(shù)值
animator.SetFloat("參數(shù)名稱",值);
animator.SetBool("參數(shù)名稱",值);
//內(nèi)部會(huì)自動(dòng)轉(zhuǎn)為Hash值,及如下方法
animator.SetFloat(Animator.StringToHash("參數(shù)名稱"),值);
//獲取參數(shù)值
animator.getInt("參數(shù)名稱");
到了這里,關(guān)于Unity游戲開發(fā)之游戲動(dòng)畫(Unity動(dòng)畫系統(tǒng))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!