狀態機的狀態(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,勾選后,不會切入到該狀態
