您好,登錄后才能下訂單哦!
這篇文章主要講解了“Unity的Animator組件的用法”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Unity的Animator組件的用法”吧!
一、前言
二、Animator組件
三、Animator Controller文件
四、Animation Clip文件
五、 狀態(tài)機的狀態(tài)(State)
1、Any State狀態(tài)
2、Entry狀態(tài)
3、Exit狀態(tài)
六、動畫狀態(tài)的屬性
七、狀態(tài)間的過渡關(guān)系(Transitions)
八、添加狀態(tài)控制參數(shù)
九、編輯切換狀態(tài)的條件
十、代碼中控制狀態(tài)
十一、檢查動畫狀態(tài)
方法1、AnimatorStateInfo
方法2、繼承StateMachineBehaviour
十二、控制播放速度
十三、注意事項
1 取消勾選
2 動作循環(huán)。
3.一般我們要的都是立即切換,所以這里 不要勾選
十四、補充
1、Mirror
2、Solo與Mute
Unity
可以用兩種方式控制動畫
1 Animation
,這種方式簡單,直接 Play(“Idle”)
或者CorssFade(“Idle”)
就可以播放動畫;
2 Animator
,Unity5.x
之后推薦使用這種方式,因為里面可以加上混合動畫,讓動畫切換更加平滑。
你通過Animation
窗口(快捷鍵是Ctrl+6
)中的Create New Clip
創(chuàng)建Animation
時,一個 Animator
已經(jīng)悄無聲息地出現(xiàn)在了對應(yīng)的GameObject
上
在第一步中生成的Animator
組件上, 第一個Controller
參數(shù)在創(chuàng)建Animator
時已經(jīng)被賦值了,可以點擊該值,并切換到Project
窗口下,會發(fā)現(xiàn)這個 Controller
對應(yīng)的文件是一個.controller
文件。Animator Controller
就是動畫控制器,負責(zé)在不同的動畫間切換,屬于制作動畫效果的必備原件。
注意,你也可以通過GameObject
上的 Add Component
添加一個嶄新的 Animator
組件,但是這種情況下 Animator
的 Controller
參數(shù)默認為空,所以需要我們手動將事先準(zhǔn)備好的.controller
文件拖拽到該參數(shù)位置,動畫控制器才能正常工作。
雙擊 .controller"
文件,會彈出一個 Animator
窗口,該窗口中顯示的就是動畫控制器文件中的所有內(nèi)容(也可以在頂部的工具欄通過 Window - Animator
打開這個界面)
在Project
窗口右鍵單擊,選擇Create->Animation
創(chuàng)建Animation Clip
(.anim
文件)
再把.anim
文件拖拽進Animator
窗口,作為Animator Controller的一個狀態(tài)(State
)
通過Animator
創(chuàng)建出來的Animation Clip
無法直接通過掛Animation
組件進行播放,如果強行播放,Console
會報一條警告信息:
The AnimationClip 'XXX' used by the Animation component 'XXX' must be marked as Legacy.
以及一條提示信息
Default clip could not be found in attached animations list
如下
為什么呢?
如果我們把Inspector
切換為Debug
模式
可以看到Animation Clip
有個Legacy
勾選框
Legacy
是遺產(chǎn)的意思,也就是傳統(tǒng)的通過Animation
組件來播放Animation Clip
的做法,如果使用Animation
組件來播放Animation Clip
,則必須把Legacy
勾選上,不過這種方式已經(jīng)是過時的做法,推薦使用Animator
來播放Animation Clip
。
每個Animator Controller
都會自帶三個狀態(tài):Any State
, Entry
和 Exit
。
表示任意狀態(tài)的特殊狀態(tài)。例如我們?nèi)绻M巧谌魏螤顟B(tài)下都有可能切換到死亡狀態(tài),那么Any State
就可以幫我們做到。當(dāng)你發(fā)現(xiàn)某個狀態(tài)可以從任何狀態(tài)以相同的條件跳轉(zhuǎn)到時,那么你就可以用Any State
來簡化過渡關(guān)系。
表示狀態(tài)機的入口狀態(tài)。當(dāng)我們?yōu)槟硞€GameObject
添加上Animator
組件時,這個組件就會開始發(fā)揮它的作用。
如果Animator Controller
控制多個Animation
的播放,那么默認情況下Animator
組件會播放哪個動畫呢? 由Entry
來決定的。
但是Entry
本身并不包含動畫,而是指向某個帶有動畫的狀態(tài),并設(shè)置其為默認狀態(tài)。被設(shè)置為默認狀態(tài)的狀態(tài)會顯示為 橘黃色。
當(dāng)然,你可以隨時在任意一個狀態(tài)上通過 鼠標(biāo)右鍵->Set as Layer Default State
更改默認狀態(tài)。
記住, Entry
在Animator
組件被激活后無條件 跳轉(zhuǎn)到默認狀態(tài),并且每個Layer
有且僅有一個默認狀態(tài)。
表示狀態(tài)機的出口狀態(tài),以紅色標(biāo)識。如果你的動畫控制器只有一層,那么這個狀態(tài)可能并沒有什么卵用。但是當(dāng)你需要從子狀態(tài)機中返回到上一層(Layer
)時,把狀態(tài)指向Exit
就可以了。
我們可以選中某個自定義狀態(tài),并在Inspector
窗口下觀察它具有的屬性
屬性名 | 描述 |
---|---|
Motion | 狀態(tài)對應(yīng)的動畫。每個狀態(tài)的基本屬性,直接選擇已定義好的動畫(Animation Clip)即可 |
Speed | 動畫播放的速度。默認值為1,表示速度為原動畫的1.0倍。 |
Mutiplier | 勾選右側(cè)的Parameter后可用,即在計算Speed的時考慮 區(qū)域1 中定義的某個參數(shù)。若選擇的參數(shù)為smooth, 則動畫播放速度的計算公式為 smooth * speed * fps(animation clip中指定) |
Mirror | 僅適用于humanoid animation(人型機動畫) |
Cycle Offset | 周期偏移,取值范圍為0-1.0,用于控制動畫起始的偏移量。把它和正弦函數(shù)的offset進行對比就能夠理解了,只會影響起始動畫的播放位置。 |
Foot IK | 僅適用于humanoid animation(人型機動畫) |
Write Default | 最好保持默認,感興趣可以參考官方手冊 |
Transitions | 該狀態(tài)向其他狀態(tài)發(fā)起的過渡列表,包含了Solo和Mute兩個參數(shù),在預(yù)覽狀態(tài)機的效果時起作用 |
Add Behaviour | 用于向狀態(tài)添加“行為” |
直觀上說它們就是連接不同狀態(tài)的有向箭頭
要創(chuàng)建一個從狀態(tài)A
到狀態(tài)B
的過渡,直接在狀態(tài)A
上 鼠標(biāo)右鍵 - Make Transition
并把出現(xiàn)的箭頭拖拽到狀態(tài)B
上點擊鼠標(biāo)左邊即可。
參數(shù)有Float
,Int
,Bool
,Trigger
。
Float
、Int
用來控制一個動畫狀態(tài)的參數(shù),比如速度方向等可以用數(shù)值量化的東西,Bool
用來控制動畫狀態(tài)的轉(zhuǎn)變,比如從走路轉(zhuǎn)變到跑步,Trigger
本質(zhì)上也是bool
類型,但它默認為false
,且當(dāng)程序設(shè)置為true
后,它會自動變回false
。
如下這里創(chuàng)建一個Int
類型的參數(shù)AnimState
點擊連線,在Inspecter
窗口中可以進行設(shè)置,在Conditions
欄下可以添加條件,如下圖表示當(dāng)參數(shù)AnimState
為0
時會執(zhí)行這個動畫Any State
到New Animation2
的過渡
必須在Parameters面板中添加了參數(shù)才可以在這里查看到,其次添加的條件為&&”與”關(guān)系,即必須同時滿足。
我們可以通過代碼來設(shè)置條件狀態(tài),達到動畫切換的目的
Animator ator = go1.GetComponent<Animator>(); ator.SetInteger("AnimState", 0);
上面的代碼,讓AnimState
這個參數(shù)值為0
,滿足了從Any State
到New Animation2
的過渡條件,從而實現(xiàn)New Animation2
動畫的過渡。
在腳本中添加代碼
//檢查是否正在播放jump動畫. AnimatorStateInfo stateinfo = anim.GetCurrentAnimatorStateInfo(0); bool playingJump = stateinfo.IsName("jump"); if(playingJump) { if(stateinfo.normalizedTime < 1.0f) { //正在播放 } else { //播放結(jié)束 } }
當(dāng)處于狀態(tài)jump
,則stateinfo.IsName("jump")
返回true
Animator
的每個狀態(tài)都可以掛載腳本,創(chuàng)建腳本,繼承于StateMachineBehaviour
類,用于檢測狀態(tài)機中動畫切片(Anamation
)的運行狀態(tài)。
官方示例:https://docs.unity3d.com/ScriptReference/StateMachineBehaviour.html
將腳本掛載在對應(yīng)的狀態(tài)上即可。代碼如下
using System.Collections; using System.Collections.Generic; using UnityEngine; public class JumpState : StateMachineBehaviour { private GameObject player; override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // 正在played的狀態(tài)的第一幀被調(diào)用 Debug.Log("------OnStateEnter------------"); } // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { } // OnStateExit is called when a transition ends and the state machine finishes evaluating this state override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // 轉(zhuǎn)換到另一個狀態(tài)的最后一幀 被調(diào)用 Debug.Log("-------------OnStateExit-----------------"); } // OnStateMove is called right after Animator.OnAnimatorMove() override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // 在OnAnimatorMove之前被調(diào)用 } // OnStateIK is called right after Animator.OnAnimatorIK() override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // 在OnAnimatorIK之后調(diào)用,用于在播放狀態(tài)時的每一幀的monobehavior。 // 需要注意的是,OnStateIK只有在狀態(tài)位于具有IK pass的層上時才會被調(diào)用。 // 默認情況下,圖層沒有IK通道,所以這個函數(shù)不會被調(diào)用 // 關(guān)于IK的使用,可以看看這篇文章《Animator使用IK實現(xiàn)頭部及身體跟隨》 // https://www.jianshu.com/p/ae6d65563efa } }
Animator ator = go1.GetComponent<Animator>(); var stateinfo = ator.GetCurrentAnimatorStateInfo(0); if(stateinfo.IsName("Jump")) { ator.speed = 2; }
Can Transition To Self
,不然動畫會出現(xiàn)抖動
不然如果沒有下個狀態(tài)切換,直接停止動作
Has Exit Time
,如果勾選了,則表示在該動作完成后才允許切換,
鏡像,可以反轉(zhuǎn)當(dāng)前動畫,減少動畫師工作量
Mute
相當(dāng)于把目標(biāo)過渡禁用掉。Solo
表示只生效這一條過渡
可以多選,當(dāng)選中后會出現(xiàn)箭頭提示
條件滿足優(yōu)先于Solo/Mute
,當(dāng)條件沒有滿足時依然不會過渡
感謝各位的閱讀,以上就是“Unity的Animator組件的用法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Unity的Animator組件的用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。