一、作用
获得当前播放动画的播放进度(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("音频为空,请拖入对应的音频!");
}
}
}
}
}