音效文件

音效文件(Audio Clips)是通过 AudioSource 组件来播放的。

当你将一个音频文件导入 Unity 项目后,Unity 会自动将其转换为 AudioClip 资源,并在 Inspector 面板中显示一系列属性,这些属性允许你配置音频文件的行为和优化设置

1. 音效文件格式

2. 音效文件面板参数

  • Force To Mono:多声道转单声道

  • Load in Background:在后台加载,不阻塞主线程(适用于大的音频)

  • Ambisonic:立体混响声

  • LoadType:加载类型

    • Decompress on Load: 将整个音频文件解压到内存中,内存占用高,适合短小的音频片段,如音效。

    • Compress in memory:加载慢,内存小。仅适用于较大音频。

    • Streaming: 按需从磁盘加载音频数据,适合长音频文件,如背景音乐。

  • Preload Audio Data: 预加载音频数据,勾选后进入场景就加载。不勾选,第一次使用才加载

  • Compression Format:压缩格式。

    • PCM (未压缩): 不对音频进行任何压缩,提供最佳音质但文件较大。

    • Vorbis: 使用 Vorbis 编码进行有损压缩,适合大多数情况,提供较好的音质/大小平衡。

    • ADPCM: 使用 ADPCM 编码进行轻度有损压缩,适合需要快速加载的短音频片段,如碰撞声。

音频源和音频监听器脚本

1. AudioSource音频源

  • AudioClip:声音剪辑文件(音频文件)

  • Mute:静音开关

  • Play On Awake:对象创建时就播放音乐

  • Loop:循环

  • Priority:优先级

  • Volume:音频大小

  • Pitch:音高

代码控制音频源

1. 代码控制播放停止

using UnityEngine;

public class Testing_01 : MonoBehaviour
{
    AudioSource audioSource;

    private void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }

    private void Update()
    {
        // 播放音频
        if (Input.GetKeyDown(KeyCode.S))
        {
            audioSource.Play();
        }
        // 暂停音频
        if(Input.GetKeyDown(KeyCode.P))
        {
            audioSource.Pause();
        }
        // 停止音频
        if (Input.GetKeyDown(KeyCode.Space)){
            audioSource.Stop();
        }
    }
}

2. 检查音频是否播放完毕

using UnityEngine;

public class Testing_01 : MonoBehaviour
{
    AudioSource audioSource;
    private void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }
    private void Update()
    {
        if(audioSource.isPlaying)
        {
            print("播放中");
        }else
        {
            print("播放完毕");
        }
    }
}

3. 动态控制音频播放

using Unity.VisualScripting;
using UnityEngine;
public class Testing_01 : MonoBehaviour
{
    AudioSource audioSource;
    public AudioClip clip;
    private void Start()
    {
        audioSource = GetComponent<AudioSource>();
        // 一个GameObject可以有多个Audio Source组件
        AudioSource aus = transform.AddComponent<AudioSource>();
        aus.clip = clip;
        aus.Play();
    }
}

麦克风输入相关

1. 获取设备麦克风设备

string[] devices = Microphone.devices;
for(int i = 0; i < devices.Length; i++)
{
    print(devices[i]);
}

2. 开始录制和结束录制

using UnityEngine;
public class Testing_01 : MonoBehaviour
{
    private AudioClip clip;
    private AudioSource audioSource;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // 参数一:设备名,设置null用默认设备
            // 参数二:超过录制长度后,是否从头录制
            // 参数三:录制时长
            // 参数四:采样率
            clip = Microphone.Start(null, false, 10, 44100);
        }
        if(Input.GetKeyUp(KeyCode.Space))
        {
            Microphone.End(null);
            audioSource = GetComponent<AudioSource>();
            if(audioSource == null )
            {
                audioSource = this.gameObject.AddComponent<AudioSource>();
            }
            audioSource.clip = clip;
            audioSource.Play();
        }
    }
}

3. 获取音频数据用于存储和传输

clip.channels:表示音频剪辑中的声道数量。例如,单声道音频有1个通道,立体声有2个通道。

clip.samples:表示每个声道中的样本数。样本是音频数据的基本单位,代表了在某一时刻的声音振幅。

using UnityEngine;
public class Testing_01 : MonoBehaviour
{
    private AudioClip clip;
    private AudioSource audioSource;
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            clip = Microphone.Start(null, false, 10, 44100);
        }
        if(Input.GetKeyUp(KeyCode.Space))
        {
            Microphone.End(null);
            audioSource = GetComponent<AudioSource>();
            if(audioSource == null )
            {
                audioSource = this.gameObject.AddComponent<AudioSource>();
            }
            audioSource.clip = clip;
            audioSource.Play();

            // 处理录制的音频
            float[] f = new float[clip.channels * clip.samples];
            clip.GetData(f, 0); // 将音频数据放入f数值中
            // TODO:将f数组转化为二进制流,然后输出文件
            print(f.Length);
        }
    }
}