你是不是替换了appID?我猜测可能时appID换了导致广告ID无法使用导致拉取激励视频失败
那应该是了,我使用的是自己的appID, 我查了下你分享的原版工程文件,打开后appID也是空的。
那么你有可以使用的广告ID吗,如果有的话在场景里唯一的那个脚本里面替换一下
很遗憾我们这边没有可以使用的广告ID,我看到官网上的信息写的要求是必须达到500访问量才能激活微信激励广告。
我在论坛里找到了一篇可能与你所遇到问题相关的帖子,或许你可以试一试看是否能够解决你的问题,帖子如下:FMOD music will not resume after Ironsource Ads - #13 by Leah_FMOD
这个讨论里面主要说的是某些第三方平台的激励广告插件在广告播放时,可能将缓冲区调整到超过FMOD正常情况下的音频缓冲区,而这种变化会立即触发错误,因为FMOD的缓冲区长度不足以应对这种突然的变化,从而导致FMOD无法正常输出音频。在播放完广告后,这些第三方平台通常不会将缓冲区长度恢复到原始设置,这也便意味着即使广告结束后,FMOD仍然无法恢复正常输出音频。
因此我会建议你试一下在 FMOD → Edit Settings → Platform Specific → DSP buffer length
的设置里,尝试将缓冲区长度增加到1024试一试,如果还是不行的话,还可以多试几个不同的缓冲区数看看。
我找微信小游戏插件那边的技术人员发现问题了,在打开激励视频的时候,微信小游戏暂停了游戏的音频,在之后关闭激励视频的时候,fmod的音频没有被恢复,他让我在微信小游戏插件一个方法名为resumeWebAudio的方法中加入 GameGlobal.Module.mContext?.resume();
GameGlobal.Module.context?.resume();
这两行代码之后,播放激励视频声音消失的bug解决了,但是引出了一个新的bug,即17.5版本以上的ios设备会有在运行小游戏切后台之后,再将游戏切换会前台,游戏声音会消失,直到退出,然后重新运行游戏
他告诉我这两个bug不兼容,可能fmod还是无法使用了
感谢你分享的这个解决办法。
不知你可否试一试在resumeWebAudio 的方法中调用 System::mixerResume 这个方法看看是否能解决这个问题呢?
请问下具体怎么加呢?这个脚本貌似是js脚本,它位于 WXSDK/Runtime/wechat-default/unity-sdk/audio/utils.js , 我对js脚本不太熟悉,这是这个脚本的全部逻辑:
import { uid } from ‘…/utils’;
import { isSupportCacheAudio } from ‘…/…/check-version’;
import { WEBAudio, audios } from ‘./store’;
import { TEMP_DIR_PATH } from ‘./const’;
export const resumeWebAudio = () => {
GameGlobal.Module.mContext?.resume();
GameGlobal.Module.context?.resume();
WEBAudio.audioContext?.resume();
};
export const createInnerAudio = () => {
const id = uid();
const audio = (isSupportCacheAudio && WEBAudio.audioCache.length ? WEBAudio.audioCache.shift() : wx.createInnerAudioContext());
if (audio) {
audios[id] = audio;
}
return {
id,
audio,
};
};
export const destroyInnerAudio = (id, useCache) => {
if (!id) {
return;
}
if (!useCache || !isSupportCacheAudio || WEBAudio.audioCache.length > 32) {
audios[id].destroy();
}
else {
['Play', 'Pause', 'Stop', 'Canplay', 'Error', 'Ended', 'Waiting', 'Seeking', 'Seeked', 'TimeUpdate'].forEach((eventName) => {
audios[id][`off${eventName}`]();
});
const state = {
startTime: 0,
obeyMuteSwitch: true,
volume: 1,
autoplay: false,
loop: false,
referrerPolicy: '',
};
Object.keys(state).forEach((key) => {
try {
// @ts-ignore
audios[id][key] = state[key];
}
catch (e) { }
});
audios[id].stop();
const cacheAudio = audios[id];
setTimeout(() => {
WEBAudio.audioCache.push(cacheAudio);
}, 1000);
}
delete audios[id];
};
export const printErrMsg = (msg) => {
GameGlobal.manager.printErr(msg);
};
export function mkCacheDir() {
const fs = wx.getFileSystemManager();
fs.rmdir({
dirPath: TEMP_DIR_PATH,
recursive: true,
complete: () => {
fs.mkdir({
dirPath: TEMP_DIR_PATH,
});
},
});
}
您可以直接告诉我怎么写吗?
我尝试了一下:
export const resumeWebAudio = () => {
System.mixerResume();
// GameGlobal.Module.mContext?.resume();
// GameGlobal.Module.context?.resume();
WEBAudio.audioContext?.resume();
};
但是在播放激励视频回到游戏后,游戏还是失去了声音
我在和同事讨论后,觉得在JS文件里使用 System::mixerResume 可能会过于繁琐不太现实,因为这可能还涉及到初始化FMOD系统以及暴露mixerResume这个方法。
对于这个加入那两行代码后产生的新bug,不知你可否尝试一下在Unity脚本的 OnApplicationFocus 方法里调用mixerResume这个方式试一试,看看声音在从后台切换回前台后有没有恢复呢?比方说这样:
private void OnApplicationFocus(bool focus)
{
RuntimeManager.CoreSystem.mixerResume();
}
如果xcode里有FMOD相关的Log信息的话,也可以麻烦你分享一下么?
目前比较头疼的是我这边没有找到可以在微信小游戏平台使用的其他广告插件,一直无法在我们这边复现这个问题,所以调查起来很有难度,可能还需要麻烦你给我更多时间进行调查。
我尝试了一下,在一个OnApplicationFocus方法中调用了RuntimeManager.CoreSystem.mixerResume();,但是17.5版本以上的ios设备且后台游戏声音消失的问题仍然存在
我是使用Unity直接打包微信小游戏,双端都可以直接用,中间不存在XCode
没关系,还是很感谢您对我的问题的关注
你好,我在其他不同的WebGl游戏中继续测试的时候发现,无论那些游戏是否使用Unity,是否使用了FMOD,或使用不同浏览器,只要在17.5版本以上的IOS设备上将游戏切换至后台再返回前台,游戏音频均无法恢复播放。目前结论是这有可能是IOS方面的问题。