UnityAudio Source组件——用代码动态控制音效的播放暂停

Posted _ElecSheep

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UnityAudio Source组件——用代码动态控制音效的播放暂停相关的知识,希望对你有一定的参考价值。

1.代码控制播放、暂停、停止

给游戏物体添加Audio Source组件
把音频文件拖入Audio Source组件的AudioCilp中

创建一个脚本并挂载

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson20 : MonoBehaviour

    //声明一个Audiosource类型变量
    AudioSource audioSource;

    void Start()
    
        //获取AudioSource组件
        audioSource = this.GetComponent<AudioSource>();
    
    void Update()
    
        //1.播放
        //  按下P键播放
        if (Input.GetKeyDown(KeyCode.P))
        
            audioSource.Play();

            //补充:延迟播放(参数1 延迟几秒)
            //audioSource.PlayDelayed(3);
        

        //2.暂停
        //  按下空格暂停播放
        if (Input.GetKeyDown(KeyCode.Space))
        
            audioSource.Pause();

            //补充:停止暂停,和暂停后再Play效果一样
            //audioSource.UnPause();
        

        //3.停止播放
        //  按S键停止播放
        if (Input.GetKeyDown(KeyCode.S))
        
            audioSource.Stop();
        
    

2.如何检测音效播放完毕

如果我们希望音乐播放完毕后 做一些事情
就需要检测音乐是否播放完毕

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson20 : MonoBehaviour

    //声明一个AudioSource类型变量
    AudioSource audioSource;

    void Start()
    
        //获取AudioSource组件
        audioSource = this.GetComponent<AudioSource>();
    
    void Update()
    
        //使用.isPlaying来检测(返回值是bool)
        if (audioSource.isPlaying)
        
            print("播放中");
        
        else
        
            print("播放结束了");
        
    

3.如何动态控制音效播放

方式一:直接在要播放音乐的对象上挂载脚本 来控制播放
1.在对象身上的脚本声明一个AudioSource类型的变量,
2.再通过.GetComponent获取挂载的AudioSource音效源脚本
3.控制此音效源脚本,实现动态控制播放
上面的知识点一就是用的这种方法

方式二:实例化挂载了音效源脚本的对象
(此方式用的较少,因为还要管理音效预制体的销毁)
1.把要播放的音效制作成预制体 且 勾选Play On Awake参数

2.给场景中一个对象挂载脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson20 : MonoBehaviour

    //外部拖入音效预制体
    public GameObject obj;

    void Start()
    
        //实例化外部拖入的音效预制体
        GameObject.Instantiate(obj);
    

4.如此以来 只要这个预制体一被实例化,就会立刻播放预制体音效

方式三:用一个AudioSource来控制播放不同的音效
AudioSource组件的AudioClip参数是可以通过代码编辑的

并且 还可以声明AudioClip类型的变量,从而从面板拖入音效源:

面板拖入拖入:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson20 : MonoBehaviour

    //从外部面板拖入的音频
    public AudioClip clip;

    void Start()
    
        //获取一个AudioSource组件
        //  获取了自己挂载的对象的AudioSource组件
        AudioSource audio = this.gameObject.GetComponent<AudioSource>();
        //让获取到的这个AudioSource组件的AudioClip参数 = 我从外部拖入的音频文件
        audio.clip = clip;
        //播放
        audio.Play();
    

音频_UnityAudio系统(1.AudioClip)

UnityAudio系统

 

unity的音频系统需要三个最基本的组件

技术图片

 

 

 

AudioClip: 音频片段

AudioSource: 音频播放器

AudioListener: 声音接收器

技术图片技术图片技术图片

 

 

 

 AudioClip:

Force To Mono: 将多声道的声音合并成单声道,大幅降低文件 大小。合并声道之后,勾选Normalize可以使 声音听起来更自然一些。

Load In Background: 在独立线程加载音频剪辑.不影响主线程.

Ambisonic: 高保真度立体声

Preload Audio Data: 在进入场景时预加载音效

 

Load Type(加载模式)

Decompress On Load: 在音频加载后马上解压缩。对较小的压缩声音使用此选项可以避免动态解压缩的性能开销。

  请注意,在加载时解压缩Vorbis编码的声音将使用大约十倍大小的内存(对于ADPCM编码约为3.5倍),因此请勿对大文件使用此选项。

Compressed In Memory: 声音在内存中以压缩的形式储存,等播放时再解压。这种方式有轻微的效率消耗,但节省了内存,

  因此适合Vorbis形式的大文件。这部分消耗可以在 Profiler中Audio面板的DSP CPU看到。

Streaming: 动态解码声音。 此方法使用最少量的内存来缓冲从磁盘中逐步读取并在运行中解码的压缩数据。 请注意,解压缩发生在单独的流线程上,

  可以在Profiler窗口的音频窗格的"Streaming CPU"部分中监视其CPU使用情况。 注意:即使没有加载任何音频数据,Streaming的剪辑也有大约200KB的消耗

 

Compression Format(指定音频在运行时的格式)

PCM: 此选项以更大的文件大小为代价提供更高的质量,并且最适合非常短的声音效果。

ADPCM: 这种格式对于包含大量噪音且需要大量播放的声音非常有用,例如脚步声,撞击声,武器。 压缩比是PCM的3.5倍,而且CPU使用率远低于MP3 / Vorbis格式,这使其成为上述类别声音的首选。

Vorbis/MP3: 压缩为较小的文件,但与PCM音频相比质量稍低。 压缩量可通过"质量"滑块进行配置。 此格式最适合中等长度的音效和音乐。

 

Sample Rate Setting (采样率设置)

PCM和ADPCM压缩格式允许自动优化或手动降低采样率

Preserve Sample Rate: 保留采样率

Optimize Sample Rate: 此设置根据分析的最高频率内容自动优化采样率。

Override Sample Rate: 此设置允许手动覆盖采样率,因此可以有效 地避免采样内容丢失

 

AudioClip配置方案归纳

对中长度音效音乐,使用Streaming + Vorbis

对短音效,使用Decompress On Load + ADPCM

 

以上是关于UnityAudio Source组件——用代码动态控制音效的播放暂停的主要内容,如果未能解决你的问题,请参考以下文章

iview+Tree 在数据中添加selected和expand属性默认展开后点不动问题

用 JavaScript 实现三次贝塞尔动画库 - 前端组件化

用 JavaScript 实现三次贝塞尔动画库 - 前端组件化

26 父组件向子组件(动静态)传值,参数为函数时的用法

Vue过渡动效

FairyGUI & Unity使用动效功能实现血条UI扣血与加血的缓动效果