Unity学习-音频文件导入以及使用

640 阅读3分钟

一.引言

音效也是游戏比较重要的一部分,下面会介绍音频导入到Unity项目中的一些参数设置以及介绍,并通过代码来进行操作

二.音频常规设置

音频导入参数1.png 音频导入参数2.png 先总体预览一下,比如Unity能够识别的音频后缀格式,图中的很多参数我们都用不到,它们基本上和音效设计有关,我们需要了解的就是如何Load,如何异步线程Load,如何设置压缩率,如何选择目标平台,这些就足够了,下面通过一张动图来简单展现音频的参数面板 音频面板参数展示_.gif

三.音乐的播放

上面只是将音频导入到项目中来,还未加载到游戏场景中去进行播放,音乐播放必备两个组件,一是音频源Aduio Source,而是音频监听Audio Listener,两种的关系是一对多,Audio Listener全场只有一个,但Audio Source可以有多个,默认创建一个Camera就会附带一个Audio Listener,所以需要移除多余的Audio Listener,否则会报警告 音效源参数1.png 音效源参数2.png 和音频源有关的面板参数配置如上图所示,一个空物体添加音频源后,它会呈现一个耳朵的图案,这里唯一想提的就是2D和3D的音效控制,也就是图中的Spatial Blend选项,默认是0(2D),1是3D,顾名思义,3D音效会受物体的距离影响音量,想听脚步声,就得使用3D,近大远小的效果,而一般的平面游戏,比如王者荣耀的游戏音效声就是2D,与距离无关

四.通过代码操控音频

  1. 代码控制播放停止
            if( Input.GetKeyDown(KeyCode.P) )
            {
                //播放音效
                audioSource.Play();
                //延迟播放 填写的是秒数
                //audioSource.PlayDelayed(5);
            }
            if (Input.GetKeyDown(KeyCode.S))
            {
                //停止音效
                audioSource.Stop();
            }
            if( Input.GetKeyDown(KeyCode.Space) )
            {
                //暂停
                audioSource.Pause();
            }
    
            if( Input.GetKeyDown(KeyCode.X) )
            {
                //停止暂停 和暂停后 Play效果是一样的 都会继续播放现在的音效
                audioSource.UnPause();
            }
    
  2. 检测音效播放完毕
        void Update()
        {
            //如果你希望某一个音效播放完毕后 想要做什么事情
            //那就可以在Update生命周期函数中 不停的去检测 它的 该属性
            //如果是false就代表播放完毕了
            if(audioSource.isPlaying)
            {
                print("播放中");
            }
            else
            {
                print("播放结束");
            }
        }
    
  3. 动态控制音效播放
    动态控制音效播放有如下三种方式,动态添加脚本的方式是最常用的
    • 直接在要播放音效的对象上挂载脚本 控制播放,默认勾选了Play On Awake
    • 实例化挂载了音效源脚本的对象
      //外部拖入挂载了Audio Source并制定了AudioClip(音频文件)的预制体
      public GameObject obj;
      public GameObject obj; //并且在实例化之后就直接播放音频
      
    • 用一个AudioSource来控制播放不同的音效
      // 外部拖入一个音频文件
      public AudioClip clip;
      // 使用时只需挂载一个脚本,设置播放即可
      AudioSource aus = this.gameObject.AddComponent<AudioSource>();
      aus.clip = clip;
      aus.Play();
      
    注:一个GameObject可以挂载多个音效源脚本Audio Source,使用时要注意如果要挂载多个,那一定要管理好他们,控制他们的播放和停止,不然我们没有办法准确的获取谁是谁

五.麦克风输入

喊麦在游戏中也非常常见,下面通过代码的方式梳理Unity中启用麦克风,以及获取录入的语音数据

  1. 获取设备麦克风信息
    Unity提供了相关API获取所有的麦克风设备,使用默认的也可以
            string[] strs = Microphone.devices;
            for (int i = 0; i < strs.Length; i++)
            {
                print(strs[i]);
            }
    
  2. 开始录制声音
            //参数一:设备名 传空使用默认设备
            //参数二:超过录制长度后 是否重头录制
            //参数三:录制时长
            //参数四:采样率
            if( Input.GetKeyDown(KeyCode.Space) )
            {
                clip = Microphone.Start(null, false, 10, 44100);
            }
    
    传入设备名可以通过1中的方式获取你想要的设备并传入
  3. 结束录制
            if( Input.GetKeyUp(KeyCode.Space) )
            {
                Microphone.End(null);
                //第一次去获取 没有才添加 
                AudioSource s = this.GetComponent<AudioSource>();
                if (s == null)
                    s = this.gameObject.AddComponent<AudioSource>();
                s.clip = clip;
                s.Play();
    
                // 获取录入的声音数据
                //规则 用于存储数组数据的长度 是用 声道数 * 剪辑长度
                float[] f = new float[clip.channels * clip.samples];
                clip.GetData(f, 0);
                print(f.Length);
                #endregion
            }
    
    玩家录入的声音可以通过AudioClip进行保存,然后通过上述的方式存到一个数组中,后续还可以将其转换成二进制流传输到网络中去