Unity——Animation的normalizedTime實現動畫播放結束的獲取

一、作用

獲得當前播放動畫的播放進度(0-1的浮點值)

 二、本文目的

獲取什麼時候切換新動畫。跟隨模型播放的動畫  的不同來進行不同的處理 (此處爲播放對應的音頻),主要是根據normalizedTime(值是0-1的浮點數,如果想知道當前動畫播放到第幾幀,也可以用此值 * 動畫的總幀數)的值來得知當前動畫播放的狀態。

因爲重寫項目已經做了很久了,重寫animation的play要動的地方太多了,所以就在Update里根據當前動畫播放的進度的值來判斷播放不同動畫。

 

代碼如下: 主要思路是記錄normalizedTime的最大值,如果normalizedTime的值變小了,那麼就說明此時播放了新的動畫(這是在不重寫animation方法時的處理)。

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

public class AudioByAnim : MonoBehaviour {
    //可序列化的動畫、音頻組
    [System.Serializable]
    public class AudioClipSet {
        public AnimationClip model_anims;
        public AudioClip model_audios;
    }
    public AudioClipSet[] m_audioClipSets;
    private Animation m_anim;
    private float m_normalizedTime;
    void Start () {
        m_anim = gameObject.transform.GetComponent<Animation>();
    }
#if UNITY_EDITOR
    void OnGUI()
    {
        //生成按鈕模擬調用動畫
        for (int i = 0; i < m_audioClipSets.Length; i++)
        {
            if (GUI.Button(new Rect(50, 50 + i * 60, 80, 50), m_audioClipSets[i].model_anims.name))
            {
                m_anim.wrapMode = WrapMode.Once;
                m_anim.Play(m_audioClipSets[i].model_anims.name);
            }
        }
    }
#endif
    void Update () {
        //如果當前動畫的播放進度"變小"了,即爲播放新的動畫了
        for (int i = 0; i < m_audioClipSets.Length; i++)
        {
            if (m_anim.IsPlaying(m_audioClipSets[i].model_anims.name))
            {
                float m_curNormalizedTime = m_anim[m_audioClipSets[i].model_anims.name].normalizedTime;
                if (m_curNormalizedTime >= m_normalizedTime)
                {
                    m_normalizedTime = m_curNormalizedTime;
                }
                else
                {
                    m_normalizedTime = 0;
                    if (m_audioClipSets[i].model_audios != null)
                    {
                        AudioSource.PlayClipAtPoint(m_audioClipSets[i].model_audios, Vector3.zero);
                    }
                    else
                        Debug.Log("音頻爲空,請拖入對應的音頻!");
                }
            }
        }
    }
}

 

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