TL;DR

  • 大部分玩家都会静音游戏。但是,声音仍然是游戏的重要组成部分,能让游戏感到更加统一。
  • 在iOS游戏中,应该默认尊重静音开关(Ambient音频类别),并让“打破静音模式”成为可选开关。
  • 背景化、中断(闹铃、Siri、来电)和音频路由更改(蓝牙、耳机)是三个不同的事件。处理其中一个不一定能处理其他两个。
  • AdMob可能会在您没有显示任何广告之前播放音频。建议在广告显示时才解除音频静音。
  • 有一个AI审计提示,可以快速检查您的应用程序是否处理了所有这些问题。

背景

我开发了一款骰子合并益智游戏(Topside:骰子落下,iOS优先,React Native)。声音从添加一些弹响和叮当声开始,到目前为止,我花了最多的调试时间。
这篇文章是iOS专题,因为那是所有锐利边缘的地方。我与AI助手一起解决了大多数这些问题。

大多数玩家都静音

您的玩家可能永远不会听到任何声音。即使如此,我仍然认为声音很重要,因为它让游戏感到更加统一。我们的声音包和音乐与视觉主题相匹配,合并声音会随着链条的增长而升级,一键“匹配”选项会设置音乐、声音和视觉效果以一致的感觉。这些都不会出现在截图中,但玩家可以通过声音来判断声音是否是后台添加的还是真正的。

背景音频和播放音频,用户可以选择

iOS为您提供了一个分叉:Ambient音频类别尊重静音开关并与其他应用程序的音频混合;Playback忽略静音开关并可以中断正在播放的音频。
游戏应该几乎总是默认为Ambient音频类别。玩家不希望您的游戏声音覆盖静音开关在候机室或公共交通工具上。
但是,一些玩家真正渴望在静音时播放音乐和声音效果,因此我们添加了一个“打破静音模式”的可选开关,可以切换到Playback类别。
我们还检查用户是否正在播放自己的音频(Spotify、播客),如果是,我们会避免让我们的音乐和声音干扰它们。

背景化、中断和音频路由更改是三个不同的问题

  • 背景化是每个人都会处理的:用户滑动主屏幕,游戏暂停;他们返回时,游戏恢复。如果您只处理这一点,可能只解决了实际世界中音频干扰的三分之一。
  • 中断是第二类问题,陷阱是许多中断从来不会将应用程序背景化。警报横幅、计时器、Siri、来电横幅:应用程序始终保持在前台,而iOS会从您的应用程序中夺取音频会话。您的恢复逻辑如果与前台/后台转换相关,则根本不会运行。
  • 音频路由更改是第三类问题,它是一个完全不同的通知。蓝牙连接或断开、有线耳机插入或拔出、CarPlay。我们的领域问题是:打开应用程序时AirPods插入,似乎一切正常,但那些依赖于知道播放开始时的确切时间的系统会静默失败,因为蓝牙路由协商花费的时间超过了我们的“播放是否实际开始?”超时。所有依赖于此检查的下游系统都会失败,只有在路由再次更改时才会自行恢复。
    AdMob可能会播放您没有要求它播放的音频

这部分是关于广告SDK,AdMob在我们的例子中。预加载的插屏/奖励创意(已加载但未显示)可能会在分钟后在全音量下播放音频。因为这是SDK自己的播放器,您的应用程序中的音量设置和静音开关都不能控制它,所以用户会经历它为“我的手机开始在主屏幕上播放广告”。这是一个已知的bug,Android上广泛报告,iOS上我们也观察到了,但我们还没有在AdMob侧找到一个真正的解决方案。
我们的解决方案是:全局静音SDK(setAppVolume(0) + setAppMuted(true)),并在广告呈现时解除静音,然后重新静音。当广告关闭时。这种做法的代价是静音广告请求可能会降低视频广告的资格和因此而降低eCPM。虽然隐形广告音频会产生一颗星级评论,但我们愿意取这种代价。

获取声音

我选择了Zapsplat.com。免费计划允许您在商业项目中使用声音并进行属性。Premium为€4.99/月(约$5.50美元),并移除属性要求,添加WAV下载,并且您下载的所有内容在订阅期间都保持永久许可,甚至在您取消订阅后也如此。
因此,实践的做法是订阅一个专注的月份,然后抓取您可能需要的所有内容。阅读他们的许可协议(不能重新分发,不能作为您的产品的主要价值,不能在声音上训练AI)。

小问题会积累

  • 池多个每个声音效果的实例。如果玩家快速触发相同的声音,单个实例会自我中断并产生卡顿效果。
  • 每次添加来自新源的音频时都要重新设置音量。原始音量会大幅波动,声音包和源之间的差异很大。
  • RN特定:检查您的音频库在每次播放调用时会发生什么。我们的库在每次播放时都会重新激活音频会话,这会导致每个声音效果播放时的动画卡顿,直到我们修复了它。

与音乐同步的视觉效果

如果您想进一步,您可以将屏幕上的动画与音乐的节拍网同步。我们在主屏幕上会在节拍上pulse一些UI,Bars-since-track-starting某些动画会升级,Logo会在节拍上摆动。
一些使这一点比预期要轻松的事情是:
* 不要假设音频“开始”的固定启动延迟。刚装载的音频播放器的实际启动时间会因设备和格式而异。我们会通过实际播放位置来轮询并在音频真正启动时才将节拍网锁定。
* 每次循环时都重新锁定节拍网,而不是只锁定一次。我们的轨道的实际循环长度比其名称长度长十几毫秒,所以如果我们只锁定一次,就会积累漂移并在长时间会话后变得可见。重新锁定每个循环可以保持它锁定。
* 将与音频同步的所有内容都继承了上述所有音频问题。当蓝牙超时问题发生时,显示的症状不是静音,而是节拍网同步的动画会僵硬,因为它依赖的东西从来没有被设置。先确保音频状态机是坚固的,然后再同步到它。