Unity狀態機(Animator)


狀態機的狀態(State)

 

每個Animator Controller都會自帶三個狀態:Any State, Entry和 Exit。
 

1、Any State狀態

 

表示任意狀態的特殊狀態。
 
例如我們如果希望角色在任何狀態下都有可能切換到死亡狀態,那么Any State就可以幫我們做到。
 
當你發現某個狀態可以從任何狀態以相同的條件跳轉到時,那么就可以用Any State來簡化過渡關系。

2、Entry狀態

 

表示狀態機的入口狀態。
 
當我們為某個GameObject添加上Animator組件時,這個組件就會開始發揮它的作用。
 
如果Animator Controller控制多個Animation的播放,那么默認情況下Animator組件會播放哪個動畫呢? 由Entry來決定的。
 
但是Entry本身並不包含動畫,而是指向某個帶有動畫的狀態,並設置其為默認狀態。被設置為默認狀態的狀態會顯示為 橘黃色。
 
 
可以隨時在任意一個狀態上通過 鼠標右鍵->Set as Layer Default State更改默認狀態。
 
 
Entry在Animator組件被激活后 無條件 跳轉到默認狀態,並且每個Layer有且僅有一個默認狀態。

3、Exit狀態

 

表示狀態機的出口狀態,以紅色標識。如果你的動畫控制器只有一層,那么這個狀態可能並沒有什么卵用。
 
但是當你需要從子狀態機中返回到上一層(Layer)時,把狀態指向Exit就可以了。
 

動畫狀態的屬性

 

我們可以選中某個自定義狀態,並在Inspector窗口下觀察它具有的屬性
 
 
 
屬性名
描述
Motion
狀態對應的動畫。每個狀態的基本屬性,直接選擇已定義好的動畫(Animation Clip)即可
Speed
動畫播放的速度。默認值為1,表示速度為原動畫的1.0倍。
Mutiplier
勾選右側的Parameter后可用,即在計算Speed的時考慮 區域1 中定義的某個參數。若選擇的參數為smooth, 則動畫播放速度的計算公式為 smooth * speed * fps(animation clip中指定)
Mirror
僅適用於humanoid animation(人型機動畫)
Cycle Offset
周期偏移,取值范圍為0-1.0,用於控制動畫起始的偏移量。把它和正弦函數的offset進行對比就能夠理解了,只會影響起始動畫的播放位置。
Foot IK
僅適用於humanoid animation(人型機動畫)
Write Default
最好保持默認,感興趣可以參考官方手冊
Transitions
該狀態向其他狀態發起的過渡列表,包含了Solo和Mute兩個參數,在預覽狀態機的效果時起作用
Add Behaviour
用於向狀態添加“行為”
 

狀態間的過渡關系(Transitions)

 

直觀上說它們就是連接不同狀態的有向箭頭
 

 

要創建一個從狀態A到狀態B的過渡,直接在狀態A上 鼠標右鍵 - Make Transition並把出現的箭頭拖拽到狀態B上點擊鼠標左邊即可。
 

添加狀態控制參數

 

參數有Float,Int,Bool,Trigger。
 
 
Float、Int用來控制一個動畫狀態的參數,比如速度方向等可以用數值量化的東西,
 
Bool用來控制動畫狀態的轉變,比如從走路轉變到跑步,
 
Trigger本質上也是bool類型,但它默認為false,且當程序設置為true后,它會自動變回false。

編輯切換狀態的條件

 

點擊連線,在Inspecter窗口中可以進行設置,在Conditions欄下可以添加條件,如下圖表示當參數
 
AnimState為0時會執行這個動畫Any State到New Animation2的過渡
 
 
必須在Parameters面板中添加了參數才可以在這里查看到,其次添加的條件為&&”與”關系,即必須同時滿足。
 
 

代碼中控制狀態

 

我們可以通過代碼來設置條件狀態,達到動畫切換的目的
 
Animator ator = go1.GetComponent<Animator>();
ator.SetInteger("AnimState", 0);
 
上面的代碼,讓AnimState這個參數值為0,滿足了從Any State到New Animation2的過渡條件,從而實現New Animation2動畫的過渡。

檢查動畫狀態

 

1.AnimatorStateInfo

在腳本中添加代碼
 
//檢查是否正在播放jump動畫 . AnimatorStateInfo stateinfo = anim.GetCurrentAnimatorStateInfo(0);
bool playingJump = stateinfo.IsName("jump");if(playingJump){
if(stateinfo.normalizedTime < 1.0f)
{
// 正在播放
}
else
{
// 播放結束
}
}
 
當處於狀態jump,則stateinfo.IsName("jump")返回true

控制播放速度

 

Animator ator = go1.GetComponent<Animator>();
var stateinfo = ator.GetCurrentAnimatorStateInfo(0);
if(stateinfo.IsName("Jump"))
{
ator.speed = 2;
}
 

注意事項

 

1 取消勾選 Can Transition To Self,不然動畫會出現抖動

 

 

 

2 動作循環。不然如果沒有下個狀態切換,直接停止動作

 

 

 

3 Has Exit Time,如果勾選了,則表示在該動作完成后才允許切換,但是一般我們要的都是立即切換,所以這里 不要勾選

 

1、Mirror

 

鏡像,可以反轉當前動畫.
 

2、Solo與Mute

 

Mute相當於把目標過渡禁用掉。Solo表示只生效這一條過渡
 
可以多選,當選中后會出現箭頭提示
 
條件滿足優先於Solo/Mute,當條件沒有滿足時依然不會過渡
 
Solo,勾選后,只會在所有 勾選Solo 中切換,其他默認等同 勾選Mute
 
Mute,勾選后,不會切入到該狀態
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM