1. 程式人生 > 實用技巧 >unity模型動畫狀態機加音效demo

unity模型動畫狀態機加音效demo

在unity中想要分段播放模型動畫就需要使用Animator。如果單獨播放一個動畫則只使用Animation即可。Animation代表一個模型動畫,可以操作一個模型動畫播放,迴圈,暫停等。但是想要使用一個模型去載入不同的動畫片段來播放那就需要使用動畫狀態機,將每個動畫片段分別加入到一個個不同的狀態中,然後通過各個狀態之間的跳轉來控制播放不同的動畫。

AnimatorAnimation關係:上下級關係。Animation負責播放一個動畫,Animator負責控制多個Animation。控制手段就是通過狀態機來控制。

想要將多個動畫應用到一個模型身上播放,那必須動畫骨骼要和模型一致才行。

狀態機:在位置1上面的RContorller(不好意思沒圈出來)。

位置1:是一個動畫片段,將其拖入到狀態機中會生成狀態,此時的狀態就是位置2,然後滑鼠右鍵將其和其他拖入的狀態(動畫片段連線起來)。他們的連線會顯示在右邊的Inspector檢視中。

位置3:表示某個狀態要跳轉到另一個狀態下需要的條件引數。

位置4:表示此動畫片段所在的位置,拖進去的自動生成,滑鼠右鍵建立的狀態就需要將動畫片段拖入此位置。效果和直接拖入狀態機中是一樣的。

位置5:當在位置3中填寫了引數時就需要去判斷,而判斷的位置就是位置5, 注意:判斷之前先要選中從哪個狀態跳轉,這邊已經選中又沒圈出來。

以上步驟就可以在介面通過臨時變換引數而執行狀態機了。而用程式碼控制整個流程就需要建立指令碼,可在右邊導航欄下新建指令碼(這裡的指令碼和普通指令碼不一樣),所謂的程式碼控制,實際上就是通過程式碼動態變換引數從而實現狀態切換,而狀態切換後則會觸發一些事件,在程式碼中可新增自己的邏輯。

位置6:掛載的指令碼。

上面圈出位置6的指令碼:指令碼中OnStateEnter方法中寫的是動態呼叫音訊的程式碼。




using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class State01Script : StateMachineBehaviour
{
    public AudioSource au;
    public AudioClip ac;


    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { //找的物體上的元件 au = GameObject.Find("Sound").gameObject.GetComponent<AudioSource>(); //使用Resources類進行動態載入 必須和Resources資料夾對應 ac = (AudioClip)Resources.Load("a10"); au.clip = ac; //將音訊剪輯給音源 au.Play(); //au.PlayDelayed(1); //延時1s後播放 Debug.Log("進入State01狀態了"); } // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { //Debug.Log("正在State01狀態中,每幀都在呼叫"); SoundScript22.ass(); Debug.Log(SoundScript22.a); } // 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) { //au.Stop(); Debug.Log("退出State01狀態了"); } }

下面是音訊的unity介面配置:下圖中可見我音訊配置的是a3號音樂,但是程式碼中我動態賦值的是a10號音樂,所以在播放狀態1(狀態機中的State01)的時候會播放a10的音樂,因為上面的指令碼就是掛在狀態1(狀態機中的State01)上的。

音訊監聽器自動回掛在主攝像機上,全場都能聽到。