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

 

 音频监听器自动回挂在主摄像机上,全场都能听到。

 

posted @ 2020-12-24 21:21  ~~mr.li~~  阅读(1969)  评论(0编辑  收藏  举报