Unity引擎学习笔记之【声音操作】

声音Sound


  • 对于摄像机Camera组件,默认包含Audio Listener组件,可以收听场景中的声音
  • 需注意多个摄像机的情况下会包含多个Audio Listener,可能会导致警告

一、默认播放音频组件:Audio Source


1.AudioClip

  • 加载、存储和播放音频片段
  • 包括音量、音调、优先级
  • 包括静音效果、激活时播放、循环播放等

2.3D SoundSettings

  • 包括音量衰减类型,可选的模式包括 Logarithmic(对数衰减),Linear(线性衰减)和 Custom(自定义衰减)。
  • 最小距离:在该半径以内将不会有声音

二、自定义组件Script

1.自定义AudioClip

    public class audioExample:MonoBehaviour
    {
        public AudioClip music;//音乐
        public AudioClip se;//音效
    }
  • 以上两行代码的作用相当于添加了一个音频组件,音频拖动到脚本组件对象上进行绑定,从而实例化对象

2.播放器组件

    public class audioExample:MonoBehaviour
    {
        private AudioSource player;//播放器组件
    }


3.获取播放器组件

    void Start()
    {
        player = GetComponent<AudioSource>();
        //设定要播放的音频片段    
        player.clip = music;
    }

player.clip = music;相当于把已经绑定过音乐文件的music对象设置为播放器需要播放的对象


4.设置循环

    //循环
   player.loop = true;

5.设置音量

    //音量取值范围0~1
    player.volume = 0.5f;

6.播放

    player.Play();

7.播放状态的播放与暂停

a.是否播放
    
    // 检查当前AudioSource是否正在播放音频
    if (player.isPlaying)
    {
        // 当前正在播放音频
        Debug.Log("音频正在播放");
    }
    
    else if(!player.isPlaying)
    {
        // 当前没有在播放音频
        Debug.Log("音频未播放");
    }
b.使用空格切换播放状态
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            if(player.isPlaying)
            {
                Debug.Log("pause");
                player.Pause();

            }
            else
            {
                Debug.Log("play");
                player.UnPause();
            }
        }
    }

  • 补充:

    • 我原来的程序是这样设计的:
      void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            if(player.isPlaying)
            {
                Debug.Log("pause");
                player.Pause();

            }
            if(!player.isPlaying)//使用了!isPlaying来判断是否处于播放
            {
                player.UnPause();
            }
        }

● 但是这会导致无法正常控制

产生这个问题的原因是代码中使用了多个if语句来控制音频的播放和暂停状态。

当玩家按下空格键时,每个if语句都会被执行一次,这会导致播放和暂停状态之间的切换变得复杂。

例如,在当前的代码中,如果音频正在播放,并且用户按下空格键,那么程序将首先进入第一个if语句,暂停音频并输出"pause"。然后,程序将进入第二个if语句,检查音频是否正在播放,发现已经暂停了,于是调用player.UnPause()继续播放音频。这样就导致了无法正常控制播放暂停状态的问题。

为了解决这个问题,我们可以使用单个if-else语句来切换播放和暂停状态。这将确保在按下空格键时,只有一个状态切换会被执行,从而避免了多余的操作。


c.单击鼠标播放一次音效
    if(Input.GetMouseButtonDown(0))
    {
        player.PlayOneShot(se);
    }

三、API方法及其解释

  1. Play():开始播放音频。

  2. Pause():暂停播放音频。

  3. Stop():停止播放音频。

  4. UnPause():继续播放已暂停的音频。

  5. isPlaying:只读属性,返回音频是否正在播放。

  6. volume:音频的音量(0-1)。

  7. pitch:音频的音调(默认为1,正常音调)。

  8. loop:是否循环播放音频。

  9. clip:要播放的音频剪辑。

  10. PlayOneShot(AudioClip clip, float volumeScale = 1.0f):播放一个音频剪辑,并可以指定音量的缩放比例。与 Play() 方法不同的是,PlayOneShot 方法可以同时播放多个音频剪辑,而不会中断当前正在播放的音频。

  11. timetimeSamples:获取或设置音频的当前播放时间。time 是以秒为单位的浮点数,表示从音频开始播放经过的时间;timeSamples 则是以采样帧为单位的整数,表示从音频开始播放经过的采样帧数。

  12. maxDistanceminDistance:用于设置 3D 空间音频的最大和最小距离。这两个属性可以控制音频的音量衰减效果,即随着听者与音源的距离增加,音量逐渐减小。在使用 3D 音频时,需要将 AudioSource 的 spatialBlend 属性设置为非零值,以启用空间音频效果。

  13. rolloffMode:用于选择音频的衰减模式。可选的模式包括 Logarithmic(对数衰减),Linear(线性衰减)和 Custom(自定义衰减)。

  14. bypassEffectsbypassListenerEffects:用于控制是否跳过 AudioSource 上的音效效果或 Listener 上的音效效果。通过设置这两个属性为 true,可以直接播放原始音频数据,而不应用额外的音效效果。

你可能感兴趣的:(#,Unity学习笔记,unity,学习,笔记)