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)上的。

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章