1. 程式人生 > >Unity3D之Mecanim動畫系統學習筆記(六):使用腳本控制動畫

Unity3D之Mecanim動畫系統學習筆記(六):使用腳本控制動畫

ont nim 復制代碼 info rip esc enter machine images

控制人物動畫播放

這裏我重新弄了一個簡單的場景和新的Animator Controller來作為示例。

下面先看看Animator Controller的配置:

技術分享

人物在站立狀態只能進入走路,走路只能進入奔跑或返回站立,奔跑只能進入跳躍或返回走路,跳躍則只能返回奔跑。

參數方面為兩個參數:

  • Float類型的moveSpeed;
  • Trigger類型的Jump;

連線直接的轉換條件為:moveSpeed大於0.1進入走路,走路moveSpeed大於0.9進入奔跑小於0.1返回站立,奔跑moveSpeed小於0.9返回走路,Jump被觸發則進入跳躍;

為人物添加Animator組件並綁定上面的Animator Controller文件,同時綁定下面的腳本:

技術分享
 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class TestAnim : MonoBehaviour
 5 {
 6     //將名稱轉換為哈希值可以提高索引的速度
 7     private int moveSpeed = Animator.StringToHash("moveSpeed");
 8     private int jump = Animator.StringToHash("Jump");
 9     private int runState = Animator.StringToHash("Base Layer.Run");
10 
11     private Animator _animator;
12 
13     void Start()
14     {
15         _animator = this.GetComponent<Animator>();
16     }
17     
18     void Update()
19     {
20         float speed = Input.GetAxis("Vertical");
21         _animator.SetFloat(moveSpeed, speed);
22 
23         //獲取動畫的當前狀態
24         AnimatorStateInfo info = _animator.GetCurrentAnimatorStateInfo(0);
25         //跳躍除了要按下空格鍵外, 還需要處於奔跑狀態才行, 否則按下空格鍵時就會標記 Jump, 一進入奔跑就馬上跳躍
26         if(Input.GetKeyDown(KeyCode.Space) && info.fullPathHash == runState)
27         {
28             _animator.SetTrigger(jump);
29         }
30     }
31 }
技術分享

State Machine Behavior

在Unity5.0中,我們可以給Animator Controller中的每個State添加腳本了,類似於專門用於GameObject的MonoBehavior,State可以添加State Machine Behavior,我們打開任意的Animator Controller,就可以在Inspector窗口發現添加腳本的按鈕:

技術分享

除了State外,我們還可以在層上添加,層可以看做包含了整個State的一個大State:

技術分享

我們可以添加一個腳本看看,下面是我添加了註釋的State Machine Behavior腳本的標準形式:

技術分享
 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class StateScript : StateMachineBehaviour
 5 {
 6     // OnStateEnter is called before OnStateEnter is called on any state inside this state machine
 7     override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
 8     {
 9         //進入當前狀態時會被調用
10     }
11 
12     // OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
13     override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
14     {
15         //進入當前狀態的每幀會被調用
16     }
17 
18     // OnStateExit is called before OnStateExit is called on any state inside this state machine
19     override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
20     {
21         //退出當前狀態時會被調用
22     }
23 
24     // OnStateMove is called before OnStateMove is called on any state inside this state machine
25     override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
26     {
27     }
28 
29     // OnStateIK is called before OnStateIK is called on any state inside this state machine
30     override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
31     {
32     }
33 
34     // OnStateMachineEnter is called when entering a statemachine via its Entry Node
35     override public void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
36     {
37     }
38 
39     // OnStateMachineExit is called when exiting a statemachine via its Exit Node
40     override public void OnStateMachineExit(Animator animator, int stateMachinePathHash)
41     {
42     }
43 }
技術分享

通過使用State Machine Behaviour我們可以更加方便的在特定的時間點觸發一些我們需要的事件,但是需要註意的是,我們一般給State Machine Behaviour賦值一些場景的對象不是直接在Inspector面板裏拖拽而是通過Animator的GetBehavior方法獲取到指定的State Machine Behaviour的實例後通過腳本進行賦值的。

Unity3D之Mecanim動畫系統學習筆記(六):使用腳本控制動畫