音频由多个Audio Source组件和一个Audio Listener组件组成,其中Audio Listener负责监听所有的Audio Source,最终通过设备的扬声器播放出来。同一个场景只能有一个Audio Listener组件启用,它会默认添加在主摄像机上。如果是3D音效,Unity会自动判断Audio Listener与音频的距离,从而增强或者减少音量。
//--音频文件
Unity支持的音频文件是非常丰富的,它们包括 .mp3 .ogg .wav .aiff .aif .mod .it .s3m 和 .xm ,最常用的是.mp3和.ogg文件。
我们将一个.wav文件拖入工程。
我们可以设置声音文件是否在后台加载,以及压缩格式等。右下角可以预览播放,设置是否循环播放。
这些设置并不是修改了声音文件本身,而是Unity在导入时自动生成一个新的音频文件,它与原始文件只有简单的引用关系,将来打包发布后其实使用的是新的音频,而使用者是毫无感知的。
//--Audio Source(各个属性的介绍)
可以给任意对象绑定Audio Source组件,即可播放声音。
可以将音频文件绑定在AudioClip处,设置Play On Awake (运行就播放)和 Loop(循环)等。
//--3D音频
3D音频就是根据生源与主角的距离自动增加或减弱的音频。
由于Audio Listener是绑定在主摄像机上的,所以控制摄像机的远近即可满足3D音频的条件。
默认情况下,Audio Source是2D音频。
调节Spatial Blend 其中0表示2D1表示3D。0~1之间表示2D和3D之间的插值音频。
球形区域表示3D声音最大区域。点击周围的蓝色小方块,拖动鼠标即可调节它的区域。球心到表面音量递减。超出最大区域时会保持递减后的最小音量。运行游戏移动主相机试听。
//--代码控制播放
在代码中获取Audio Source组件,就可以动态控制音频了。
由于音频组件没有提供播放音频结束的回调,可以先获取音频播放时间,通过协程处理结束后事件。
using System.Collections;
using UnityEngine;
using UnityEngine.Events;
public class AudioSourceMyTest : MonoBehaviour
{
public AudioClip clip1;
public AudioClip clip2;
public AudioSource source;
private Coroutine m_Coroutine = null;
private void OnGUI()
{
if (GUILayout.Button("播放音频1 "))
{
PlayAudioClip(clip1, delegate (AudioClip clip) { Debug.LogFormat("音频:{0}播放结束", clip.name); });
}
if (GUILayout.Button("播放音频2 "))
{
PlayAudioClip(clip2, delegate (AudioClip clip) { Debug.LogFormat("音频:{0}播放结束", clip.name); });
}
}
private void PlayAudioClip(AudioClip clip, UnityAction callback)
{
StopAudioClip();
source.clip = clip;
source.Play();
m_Coroutine = StartCoroutine(AudioClipCallback(clip, callback));
}
private void StopAudioClip()
{
if (m_Coroutine != null)
{
StopCoroutine(m_Coroutine);
m_Coroutine = null;
}
source.Stop();
}
private IEnumerator AudioClipCallback(AudioClip clip, UnityAction callback)
{
yield return new WaitForSeconds(clip.length);
callback(clip);
}
}
//--声音进度
可以拖动Slider来调节音乐的进度。
using UnityEngine;
using UnityEngine.UI;
public class AudioSourceSliderMyTest : MonoBehaviour
{
public Slider slider;
public AudioSource source;
private void Start()
{
slider.minValue = 0;
slider.maxValue = System.Convert.ToSingle(source.clip.length.ToString("f3"));
slider.onValueChanged.AddListener(delegate (float value)
{
source.Stop();
source.time = value;
source.Play();
});
source.Play();
}
}
运行即可体验。(做了一个截取三位小数的操作,要不拖到最大值会报错)。
//--录音
Unity3D 录音, 压缩, 保存, 读取, 实时检测音量
Unity3d录音