声音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方法及其解释
-
Play()
:开始播放音频。 -
Pause()
:暂停播放音频。 -
Stop()
:停止播放音频。 -
UnPause()
:继续播放已暂停的音频。 -
isPlaying
:只读属性,返回音频是否正在播放。 -
volume
:音频的音量(0-1)。 -
pitch
:音频的音调(默认为1,正常音调)。 -
loop
:是否循环播放音频。 -
clip
:要播放的音频剪辑。 -
PlayOneShot(AudioClip clip, float volumeScale = 1.0f)
:播放一个音频剪辑,并可以指定音量的缩放比例。与Play()
方法不同的是,PlayOneShot
方法可以同时播放多个音频剪辑,而不会中断当前正在播放的音频。 -
time
和timeSamples
:获取或设置音频的当前播放时间。time
是以秒为单位的浮点数,表示从音频开始播放经过的时间;timeSamples
则是以采样帧为单位的整数,表示从音频开始播放经过的采样帧数。 -
maxDistance
和minDistance
:用于设置 3D 空间音频的最大和最小距离。这两个属性可以控制音频的音量衰减效果,即随着听者与音源的距离增加,音量逐渐减小。在使用 3D 音频时,需要将 AudioSource 的spatialBlend
属性设置为非零值,以启用空间音频效果。 -
rolloffMode
:用于选择音频的衰减模式。可选的模式包括Logarithmic
(对数衰减),Linear
(线性衰减)和Custom
(自定义衰减)。 -
bypassEffects
和bypassListenerEffects
:用于控制是否跳过 AudioSource 上的音效效果或 Listener 上的音效效果。通过设置这两个属性为true
,可以直接播放原始音频数据,而不应用额外的音效效果。