1. 程式人生 > 程式設計 >關於Unity動畫狀態機Animator使用教程

關於Unity動畫狀態機Animator使用教程

目錄
  • 一、前言
  • 二、Animator元件
  • 三、Animator Controller檔案
  • 四、Animation Clip檔案
  • 五、 狀態機的狀態(State)
    • 1、Any State狀態
    • 2、Entry狀態
    • 3、Exit狀態
  • 六、動畫狀態的屬性
    • 七、狀態間的過渡關係(Transitions)
      • 八、新增狀態控制引數
        • 九、編輯切換狀態的條件
          • 十、程式碼中控制狀態
            • 十一、檢查動畫狀態
              • 方法1、AnimatorStateInfo
              • 方法2、繼承StateMachineBehaviour
            • 十二、控制播放速度
              • 十三、注意事項
                • 1 取消勾選
                • 2 動作迴圈。
                • 3.一般我們要的都是立即切換,所以這裡 不要勾選
              • 十四、補充
                • 1、Mirror
                • 2、Solo與Mute

              一、前言

              Unity可以用兩種方式控制動畫
              1 Animation,這種方式簡單,直接 Play(“Idle”)或者CorssFade(“Idle”)就可以播放動畫;
              2 AnimatorUnity5.x之後推薦使用這種方式,因為裡面可以加上混合動畫,讓動畫切換更加平滑。

              二、Animator元件

              你通過Animation視窗(快捷鍵是Ctrl+6)中的Create New Clip建立Animation時,一個 Animator已經悄無聲息地出現在了對應的GameObject

              在這裡插入圖片描述

              三、Animator Controller檔案

              在第一步中生成的Animator元件上,第一個Controller

              引數在建立Animator時已經被賦值了,可以點選該值,並切換到Project視窗下,會發現這個 Controller對應的檔案是一個.controller檔案。
              Animator Controller就是動畫控制器,負責在不同的動畫間切換,屬於製作動畫效果的必備原件。

              在這裡插入圖片描述

              注意,你也可以通過GameObject上的 Add Component新增一個嶄新的 Animator元件,但是這種情況下 AnimatorController引數預設為空,所以需要我們手動將事先準備好的.controller檔案拖拽到該引數位置,動畫控制器才能正常工作。

              四、Animation Clip檔案

              雙擊 .controller"

              檔案,會彈出一個 Animator視窗,該視窗中顯示的就是動畫控制器檔案中的所有內容(也可以在頂部的工具欄通過 Window - Animator開啟這個介面)

              在這裡插入圖片描述

              Project視窗右鍵單擊,選擇Create->Animation建立Animation Clip.anim檔案)

              在這裡插入圖片描述

              在這裡插入圖片描述

              再把.anim檔案拖拽進Animator視窗,作為Animator Controller的一個狀態(State

              在這裡插入圖片描述

              通過Animator創建出來的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是遺產的意思,也就是傳統的通過Animation元件來播放Animation Clip的做法,如果使用Animation元件來播放Animation Clip,則必須把Legacy勾選上,不過這種方式已經是過時的做法,推薦使用Animator來播放Animation Clip

              五、 狀態機的狀態(State)

              每個Animator Controller都會自帶三個狀態:Any State,EntryExit

              在這裡插入圖片描述

              1、Any State狀態

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

              2、Entry狀態

              表示狀態機的入口狀態。當我們為某個GameObject新增上Animator元件時,這個元件就會開始發揮它的作用。
              如果Animator Controller控制多個Animation的播放,那麼預設情況下Animator元件會播放哪個動畫呢? 由Entry來決定的。
              但是Entry本身並不包含動畫,而是指向某個帶有動畫的狀態,並設定其為預設狀態。被設定為預設狀態的狀態會顯示為 橘黃色。

              在這裡插入圖片描述

              當然,你可以隨時在任意一個狀態上通過 滑鼠右鍵->Set as Layer Default State更改預設狀態。

              在這裡插入圖片描述

              記住, EntryAnimator元件被啟用後 無條件 跳轉到預設狀態,並且每個Layer有且僅有一個預設狀態。

              3、Exit狀態

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

              在這裡插入圖片描述

              六、動畫狀態的屬性

              我們可以選中某個自定義狀態,並在Inspector視窗下觀察它具有的屬性

              在這裡插入圖片描述

              www.cppcns.com
              屬性名 描述
              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上點選滑鼠左邊即可。

              在這裡插入圖片描述

              八、新增狀態控制引數

              引數有FloatIntBoolTrigger

              在這裡插入圖片描述

              FloatInt用來控制一個動畫狀態的引數,比如速度方向等可以用數值量化的東西,
              Bool用來控制動畫狀態的轉變,比如從走路轉變到跑步,
              Trigger本質上也是bool型別,但它預設為false,且當程式設定為true後,它會自動變回false

              如下這裡建立一個Int型別的引數AnimState

              在這裡插入圖片描述

              九、編輯切換狀態的條件

              點選連線,在Inspecter視窗中可以進行設定,在Conditions欄下可以新增條件,如下圖表示當引數
              AnimState0時會執行這個動畫Any StateNew Animation2的過渡

              必須在Parameters面板中添加了引數才可以在這裡檢視到,其次新增的條件為&&”與”關係,即必須同時滿足。

              在這裡插入圖片描述

              十、程式碼中控制狀態

              我們可以通過程式碼來設定條件狀態,達到動畫切換的目的

              Animator ator = go1.GetComponent<Animator>();
              ator.SetInteger("AnimState",0);
              

              上面的程式碼,讓AnimState這個引數值為0,滿足了從Any StateNew 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

              方法2、繼承StateMachineBehaviour

              Animator的每個狀態都可以掛載指令碼,建立指令碼,繼承於StateMachineBehaviour類,用於檢測狀態機中動畫切片(Anamation)的執行狀態。
              官方示例:https://docs.unity3d.com/ScriptReference/StateMachineBehaviour.html
              將指令碼掛載在對應的狀態上即可。程式碼如下

              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的狀態的第一幀被呼叫
                      Debug.Log("------OnStateEnter------------");
                  }
                  // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
                  override public void OnStateUpdate(Animator animator,AnimatorStateInfo stateInfhttp://www.cppcns.como,int layerInhttp://www.cppcns.comdex)
                  {        
                  }
                  // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
                  override public void OnStateExit(Animator animator,int layerIndex)
                  {
                      // 轉換到另一個狀態的最後一幀 被呼叫
                      Debug.Log("-------------OnStateExit-----------------");
                  }
                  // OnStateMove is called right after Animator.OnAnimatorMove()
                  override public void OnStateMove(Animator animator,int layerIndex)
                  {
                  	// 在OnAnimatorMove之前被呼叫 
                      
                  }
                  // OnStateIK is called right after Animator.OnAnimatorIK()
                  override public void OnStateIK(Animator animator,int layerIndex)
                  {
                      // 在OnAnimatorIK之後呼叫,用於在播放狀態時的每一幀的monobehavior。
                      // 需要注意的是,OnStatwww.cppcns.comeIK只有在狀態位於具有IK pass的層上時才會被呼叫。
                      // 預設情況下,圖層沒有IK通道,所以這個函式不會被呼叫
                      // 關於IK的使用,可以看看這篇文章《Animator使用IK實現頭部及身體跟隨》
                      // https://www.jianshu.com/p/ae6d65563efa
                  }
              }
              

              十二、控制播放速度

              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,當條件沒有滿足時依然不會過渡

              在這裡插入圖片描述

              以上就是關於Unity動畫狀態機Animator使用教程的詳細內容,更多關於Unity動畫狀態機Animator使用的資料請關注我們其它相關文章!