@Audio

2023-04-10
概述 Overview
.音乐、音效、配乐
.播放声音需要:监听器Audio Listener、音频源Audio Source,音频片段Audio Clip
.无论在编辑状态场景视图Scene还是在播放状态的游戏视图Game的都可以通过开关选项开启或关闭声音
.更多使用细节,请查阅API
监听器 Audio Listener
.一个场景只能有一个监听器
.默认情况下,主摄像机挂载一个监听器
.监听播放过程中的事件,如播放状态、播放时长、剩余时长等
音频源 Audio Source
.播放器;通常以组件的形式挂载到某个游戏对象;也可以作为游戏对象直接使用
.可以有多个;如一个播放背景,一个播放UI音效
.可以直接把声音文件拖给对象,系统会自动为对象添加音频源组件Audio Source,运行时能直接播放
.默认情况下,会自动播放
音频剪辑 Audio Clip
.为Audio Source 提供要播放的音频剪辑/片段
.格式多为.wav或.mp3
基本使用-无脚本使用
[] 播放背景音乐
1.在层级视图Hierarchy创建一个Audio Source对象;指定clip,勾选loop和awake
2.运行游戏,查看效果
.最快的播放:直接把声音文件拖到层级Hierarchy或场景Scene,系统会自动创建一个对象并添加音频源组件Audio Source
play()
. 通常会取消自动播放,再根据需要再使用脚本控制播放
. 每次播放都会清除前面的音效
[] 单击鼠标,播放音频
1.创建对象player,添加Audio Source组件,取消自动播放,指定Audio clip
2.创建脚本Player1.cs并挂载到对象player
3.在对象player的监视Inspector中,为脚本指定Audio Source
4.运行游戏,单击鼠标,查看效果;如果连续单击鼠标呢?
  using System.Collections;
  using System.Collections.Generic;
  using UnityEngine;
  
  public class Player1 : MonoBehaviour
  {
      public AudioSource player;
      private void Update()
      {
          if (Input.GetMouseButtonDown(0))
          {
              player.Play();
          }
      }
  }
PlayOneShot()
.多用作UI音效
.每次播放都新开一个音效,可以产生叠加的效果
.使用这个函数播放音效,不能为音频源组件指定音频剪辑,而应单独指定
[] 单击鼠标,播放音效
1.创建对象player,添加Audio Source组件,取消自动播放
2.创建脚本Player2.cs并挂载到对象player
3.在对象player的监视视图Inspector中,为脚本指定Audio Source、Audio clip
4.运行游戏,单击鼠标,查看效果;如果连续单击鼠标呢?
  using System.Collections;
  using System.Collections.Generic;
  using UnityEngine;

  public class Player2 : MonoBehaviour
  {
      public AudioSource player;
      public AudioClip clip;
      private void Update()
      {
          if (Input.GetMouseButtonDown(0))
          {
              player.PlayOneShot(clip);
          }
      }
  }
[] 多音频Audio Clip播放
.定义一个clip数组,分别指定不同的clip;单击鼠标,随机获取一个index,根据index播放对应的clip
1. 创建对象player,添加Audio Source组件,取消自动播放
2. 创建脚本Player3.cs并挂载到对象player
3. 在对象player的监视视图Inspector中,为脚本指定Audio Source、多个Audio clip
4. 运行游戏,单击鼠标
  using System.Collections;
  using System.Collections.Generic;
  using UnityEngine;

  public class Player3 : MonoBehaviour
  {
      public AudioSource player;
      public AudioClip[] clips;
      int ind = 0;
      private void Update()
      {
          if (Input.GetMouseButtonDown(0))
          {
              ind = Random.Range(0, clips.Length);
              player.PlayOneShot(clips[ind]);
          }
      }
  }
Resources.Load()
.加载本地指定类型的资源,如音频
.加载的资源不需要后缀名,因为已经指定了类型
.系统默认会在Assets下的Resources文件夹中查找资源,所以资源文件必须存放在Resources文件夹中;Resources文件夹需提前建好
.可以使用多个Resources文件夹,请保持资源文件名唯一,不要重用
.使用正斜杠/路径;路径大小写敏感
.加载的音频资源可以使用Play或PlayOneShot播放;其它资源的加载和使用类似
.更多信息,请访问Resources.Load
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
  AudioSource player;
  AudioClip clip;
  void Start()
  {
      player=gameObject.GetComponent<AudioSource>();
      clip = Resources.Load<AudioClip>("wang");
      player.clip = clip;
      player.Play();
  }
}
综合示例 Demo
[] 多音源Audo Source播放:一个Audo Source播放背景;一个Audo Source播放音效
1. 创建对象player,添加2个Audio Source组件
2. 创建脚本Player4.cs并挂载到对象player
3. 在对象player的监视视图Inspector中,为脚本分别指定背景Audio Source、音频Audio clip
4. 运行游戏,查看背景音乐情况;单击鼠标,查看音效播放情况
  using System.Collections;
  using System.Collections.Generic;
  using UnityEngine;

  public class Player4 : MonoBehaviour
  {
      public AudioSource bgplayer;
      public AudioSource player;
      public AudioClip bgClip;
      public AudioClip clip;
      private void Start()
      {
          bgplayer.clip = bgClip;
          bgplayer.Play();
      }
      private void Update()
      {
          if (Input.GetMouseButtonDown(0))
          {
              player.PlayOneShot(clip);
          }
      }
  }
[] 调音台
.将音频源的输出引导至混音器,利用滑块控制输出音量大小
1. 在项目视图Project的资源Assets中创建混音器Audio Mixer
2. 按CTRL+8,打开混音器面板;混音器面板右上角是暴露Expose给外部脚本的参数,当前为0
3. 选择master,在监视视图Inspector中,右键单击音量Volume栏,暴露出去;在混音器面板右上角可以看到暴露出的参数,重命名为myVol;注意到Volume右侧出现一个箭头,表示当前参数已暴露;
4. 创建游戏对象player:
. 添加Audio Source,保留自动播放;指定音频clip;指定输出Output为混音器的master
. 创建脚本并挂载Mixer.cs,并指定脚本暴露的混音器;定义音量控制函数SetVol(),控制的对象就是混音器中暴露的音量myVol
  using System.Collections;
  using System.Collections.Generic;
  using UnityEngine;
  using UnityEngine.Audio;

  public class Mixer : MonoBehaviour
  {
      public AudioMixer audioMixer;

      public void SetVol(float vol)
      {
          audioMixer.SetFloat("myVol", vol);
      }
  }
5. 创建UI组件滑块Slider:
. 利用定位框调整到屏幕中央
. 最小值Min Value、最大值Max Value保持和混音器一致:-80,20;当前值Value设为1
. 增加一个点击事件:player中定义的SetVol函数
6. 运行游戏,拖动滑块,查看音效播放情况
为什么不是在层级视图Hierarchy中创建混音器?
切换场景时不间断背景音乐-参考逻辑
  using System.Collections;
  using System.Collections.Generic;
  using UnityEngine;
  
  public class BGMCtl : MonoBehaviour
  {
      public static BGMCtl instance;
      void Awake()
      {
          if (instance == null)
          {
              instance = this;
          }
          else if (instance != this)
          {
              Destroy(gameObject);
          }
          DontDestroyOnLoad(gameObject);
      }
  }