NarraLeaf

声音

用于人声、音乐与音效播放的 `Sound` 类,涵盖音量、静音、倍速、跳转与淡入淡出

本页面正在建设中

测试功能,可能会有变动

Sound 控制游戏中的声音

静态方法

voice

创建一个语音声音

const voice = Sound.voice({
    src: 'voice.mp3',
});

// 等同于
const voice = new Sound({
    src: 'voice.mp3',
    type: SoundType.Voice,
});

这里的 type默认值,不是强制覆盖。传入一个 id,就能把这句语音放到 voice 之下的某条总线上—— 这正是让每位角色拥有各自音量的做法

const line = Sound.voice({src: 'alice-01.mp3', type: 'alice'});
  • arg0: Partial<ISoundUserConfig> | string - 声音的配置或声音源,参见 ISoundUserConfig
  • 返回 Sound

bgm

创建一个背景音乐。type 默认为 bgm,也可以指定它之下的任意总线

  • arg0: Partial<ISoundUserConfig> | string - 声音的配置或声音源,参见 ISoundUserConfig
  • 返回 Sound

sound

创建一个声音。type 默认为 sound,也可以指定它之下的任意总线

  • arg0: Partial<ISoundUserConfig> | string - 声音的配置或声音源,参见 ISoundUserConfig
  • 返回 Sound

公共方法

constructor

重载 1 / 2

重载 2 / 2

  • src?: string - 声音的源文件路径

可链式方法

play

播放声音并等待其结束

const sound = new Sound({
    src: 'sound.mp3',
});
scene.action([
    sound.play(1000), // 播放并淡入 1 秒
]);

任何总线上的音频都可以这样播放,包括 bgm 上的。type 只决定哪一个音量控制管辖这段音频,除此之外别无影响, 所以把环境音放在 bgm 上——让玩家的音乐滑条来控制它——再从普通的一行里播放,是完全正当的做法

这和 scene.setBackgroundMusic() 不是一回事。 这样播放的音频不在场景的背景音乐槽位里, 因此离开场景不会停止它,也不会为它安排交叉淡入淡出。以这种方式播放 bgm 类型的音频会打印一条 console.warn 说明这一点;它只是提醒,不是错误。在 0.22.0 之前,它会抛出异常并在构建链时使整个故事失败

  • duration?: number - 淡入淡出持续时间(以毫秒为单位)

stop

停止声音。停止后,声音将回到开头

  • duration?: number - 淡入淡出持续时间(以毫秒为单位)

setVolume

设置声音的音量。给出持续时间后,音量变化是淡入淡出而不是瞬间跳变

const sound = new Sound({
    src: 'sound.mp3',
    volume: 0,
});
scene.action([
    sound
        .play()
        .setVolume(1, 1000), // 淡入 1 秒
]);
  • volume: number - 音量,从 0 到 1
  • duration?: number - 淡入淡出持续时间(以毫秒为单位)

mute

静默或恢复声音,但不会停止播放

scene.action([
    bgm.play(),
    bgm.mute(),
    bgm.unmute(),
]);
  • muted?: boolean - true 表示静默,false 表示恢复音量(默认 true
  • 返回 Proxied<Sound, Chained<LogicAction.Actions>> - 可链式声音实例

unmute

mute(false) 的别名,用于恢复原始音量

  • 返回 Proxied<Sound, Chained<LogicAction.Actions>> - 可链式声音实例

setRate

设置声音的播放速率

  • rate: number - 速率,基准为 1

pause

暂停声音

  • duration?: number - 淡入淡出持续时间(以毫秒为单位)

resume

恢复播放声音

  • fade?: number - 淡入淡出持续时间(以毫秒为单位)

seek

跳到音频中的某个位置(以秒计),并从那里继续播放。这是读取播放头的反向操作——音乐播放器界面, 或者「跳过前奏」这样的一行,都需要它

scene.action([
    theme.seek(30),
]);

对没有在播放的声音是空操作:没有什么可以移动。循环区间(参见 endTime)在跳转后依然保留, 因此在循环的音轨内跳转不会悄悄把它变成一次性播放

  • time: number - 位置(以秒计),从文件开头算起,而不是从入点算起
  • 返回 Proxied<Sound, Chained<LogicAction.Actions>> - 可链式声音实例

本页目录