Table of Contents

非空间化音频

初级 程序员

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

非空间化音频

非空间化音频不需要音频发射器或音频监听器。

1. 导入音频并将其包含在构建中

  1. 将音频作为音频资产导入。

  2. 确保该音频资产是根资产(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();
        }
    }
}

将脚本添加到实体

  1. 在**场景视图(Scene view)**中,选择要添加脚本的实体:

    选择实体

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

    点击添加组件

    脚本即被添加到实体上。

  3. 如果你在脚本中添加了公共变量,需要将它们与音频资产关联起来。

    从资产视图中将资产拖放到每个变量上:

    拖放音频资产

    也可以点击 手形图标(选择资产):

    拾取资产

    然后选择要使用的音频资产:

    选择音频资产

另请参阅