非空间化音频
初级 程序员
**非空间化音频(Non-spatialized Audio)**在整个场景中听起来始终相同,不受实体(例如玩家摄像机)位置的影响。它使用立体声,并沿单个轴(通常是 X 轴)移动。与空间化音频不同,空间化音频的_音量_、音调(频率)和其他参数会发生变化,而非空间化音频不会。这非常适合用于背景音乐和菜单音效等场景。

1. 导入音频并将其包含在构建中
确保该音频资产是根资产(root asset)。根资产是 Stride 会包含在构建中的资产,以便在运行时使用。
在资产视图中,右键点击该资产,选择作为根资产包含在构建中:

如果菜单选项显示为不作为根资产包含在构建中,则说明该选项已经启用,你无需更改。
2. 创建脚本以播放音频
要在运行时播放非空间化音频,请创建它的实例并在代码中定义其行为。
SoundInstance 通过以下属性在运行时控制音频:
| 属性 | 功能 |
|---|---|
| IsLooping | 获取或设置音频的循环(Loop)。 |
| Pan | 设置左右扬声器之间的声道平衡。默认情况下,每个扬声器的值为 0。 |
| Pitch | 获取或设置音频音调(频率)。 |
| PlayState | 获取 SoundInstance 的状态。 |
| Position | 获取音频当前的播放位置。 |
| Volume | 设置音频音量。 |
更多详细信息,请参阅 SoundInstance API 文档。
Note
如果声音已经在播放,Stride 会忽略所有对 SoundInstance.Play 的重复调用。SoundInstance.Pause(当声音已暂停时)和 SoundInstance.Stop(当声音已停止时)也是如此。
例如,以下代码:
- 实例化非空间化音频
- 设置音频循环播放
- 设置音量
- 播放音频
private Sound musicSound;
private SoundInstance music;
public override async Task Execute()
{
// 加载声音
musicSound = Content.Load<Sound>("MySound");
// 创建声音实例
music = musicSound.CreateInstance();
// 循环播放
music.IsLooping = true;
// 设置音量
music.Volume = 0.25f;
// 播放音乐
music.Play();
}
public override void Cancel()
{
// 释放与正在播放的实例关联的内存,并停止播放音乐
music.Dispose();
// 释放音乐占用的内存
Content.Unload(musicSound);
}
替代方案:创建带有公共变量的脚本
为你想使用的每个音频资产创建一个公共变量。你可以使用上面列出的相同属性。
例如:
public class MySoundScript : SyncScript
{
public Sound MyMusic;
private SoundInstance musicInstance;
public bool PlayMusic;
public override void Start()
{
musicInstance = MyMusic.CreateInstance();
}
public override void Cancel()
{
// 释放与正在播放的实例关联的内存,并停止播放音乐
musicInstance.Dispose();
}
public override void Update()
{
// 如果音乐没有在播放但应该播放,则播放音乐
if (PlayMusic & musicInstance.PlayState != PlayState.Playing)
{
musicInstance.Play();
}
// 如果音乐正在播放但不应该播放,则停止音乐
else if (!PlayMusic)
{
musicInstance.Stop();
}
}
}
将脚本添加到实体
在**场景视图(Scene view)**中,选择要添加脚本的实体:

在属性网格中,点击添加组件并选择你的脚本:

脚本即被添加到实体上。
如果你在脚本中添加了公共变量,需要将它们与音频资产关联起来。
从资产视图中将资产拖放到每个变量上:

也可以点击
(选择资产):
然后选择要使用的音频资产:
