一、作用
獲得當前播放動畫的播放進度(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("音頻爲空,請拖入對應的音頻!");
}
}
}
}
}