Unity——Animation的normalizedTime实现动画播放结束的获取

一、作用

获得当前播放动画的播放进度(0-1的浮点值)

 二、本文目的

获取什么时候切换新动画。跟随模型播放的动画  的不同来进行不同的处理 (此处为播放对应的音频),主要是根据normalizedTime(值是0-1的浮点数,如果想知道当前动画播放到第几帧,也可以用此值 * 动画的总帧数)的值来得知当前动画播放的状态。

因为重写项目已经做了很久了,重写animation的play要动的地方太多了,所以就在Update里根据当前动画播放的进度的值来判断播放不同动画。

 Unity——Animation的normalizedTime实现动画播放结束的获取_第1张图片

代码如下: 主要思路是记录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();
    }
#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("音频为空,请拖入对应的音频!");
                }
            }
        }
    }
}

 

你可能感兴趣的:(Unit杂类)