Unity+Wwise iOS构建锁屏后屏幕变暗时声音停止问题求助
解决方案:Unity+Wwise实现iOS锁屏黑屏持续播放音频
1. 修正音频会话配置(核心步骤)
你之前在UnityAppController.mm的配置存在遗漏,需确保在正确时机完成完整的音频会话配置,并处理会话中断:
- 打开
UnityAppController.mm,在application:didFinishLaunchingWithOptions:方法内添加以下代码(保留原有业务代码):
#import <AVFoundation/AVFoundation.h> - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { // 原有代码保留 AVAudioSession *audioSession = [AVAudioSession sharedInstance]; NSError *sessionError = nil; // 配置Playback类别,允许后台播放、蓝牙音频并支持混音 [audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionAllowBluetooth error:&sessionError]; if (sessionError) { NSLog(@"Audio Session Category Error: %@", sessionError.localizedDescription); } // 激活会话,中断时通知其他应用 [audioSession setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&sessionError]; if (sessionError) { NSLog(@"Audio Session Activation Error: %@", sessionError.localizedDescription); } // 开启远程控制事件(无需控制可删除,但不影响功能) [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; return [super application:application didFinishLaunchingWithOptions:launchOptions]; }
- 添加会话中断处理逻辑,防止锁屏时音频会话被系统挂起:
- (void)application:(UIApplication *)application didChangeAudioSessionInterruptionType:(AVAudioSessionInterruptionType)interruptionType { if (interruptionType == AVAudioSessionInterruptionTypeEnded) { // 中断结束后重新激活音频会话 NSError *error = nil; [[AVAudioSession sharedInstance] setActive:YES error:&error]; if (error) { NSLog(@"Reactivate Audio Session Error: %@", error.localizedDescription); } // 同步唤醒Wwise引擎 AkSoundEngine::WakeupFromSuspend(); } }
2. 修正Wwise后台配置
- 打开Wwise工程的
Platform Settings -> iOS面板,确认Background Audio已勾选,且Audio Session Category设置为Playback(不要使用默认的Ambient)。 - 在Wwise的
Init Settings中,将Maximum Voice Count设置为大于当前使用的音轨数(例如设为10),避免误触发Voice Starvation告警。
3. 优化Unity侧Wwise唤醒逻辑
替换你之前的Update循环调用逻辑,改用应用状态回调触发唤醒,减少性能消耗:
using UnityEngine; using AkSoundEngine; public class AudioBackgroundHandler : MonoBehaviour { void Awake() { // 开启Wwise后台音频开关 AkSoundEngine.SetGlobalSwitch("iOS_Background_Audio", "On"); // 注册应用前后台状态回调 Application.willResignActive += OnAppEnterBackground; Application.didBecomeActive += OnAppEnterForeground; } void OnAppEnterBackground() { // 应用锁屏进入后台时,强制唤醒Wwise并触发音频渲染 AkSoundEngine.WakeupFromSuspend(); AkSoundEngine.RenderAudio(); } void OnAppEnterForeground() { // 应用回到前台时重置引擎状态 AkSoundEngine.WakeupFromSuspend(); } void OnDestroy() { // 销毁时解绑回调 Application.willResignActive -= OnAppEnterBackground; Application.didBecomeActive -= OnAppEnterForeground; } }
4. 检查iOS项目Capabilities配置
- 在Xcode中打开项目,进入
Signing & Capabilities面板,添加Background Modes并勾选Audio, AirPlay, and Picture in Picture。 - 确认
Info.plist中存在UIBackgroundModes数组并包含audio项(Xcode未自动生成则手动添加):
<key>UIBackgroundModes</key> <array> <string>audio</string> </array>
关于AK Error: Voice Starvation的说明
该告警并非一定是资源不足,当Wwise引擎被系统挂起后,音频线程无法正常调度,会误判为资源不足导致轨道分配失败。完成上述配置后,引擎持续运行,该告警会自动消失。
内容的提问来源于stack exchange,提问作者Ando
相关产品推荐
相关产品推荐

