Edited at

Chrome 66でUnity WebGLビルドの音が鳴らない状況を緩和する

More than 1 year has passed since last update.


何が起きているのか

Chromeのバージョン66から、ビデオ・オーディオの自動再生のポリシーが変更されました。

現状はユーザーがクリックかタップでオーディオのサスペンド状態を解除しないといけなくなりました。

Autoplay Policy Changes

https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio

Chrome On The Dev Branch (version 66) May Block Audio For Unity WebGL

https://forum.unity.com/threads/chrome-on-the-dev-branch-version-66-may-block-audio-for-unity-webgl.517758/

で、これに現状Unityが対応してないので完全に音が鳴りません。

※4/17追記

しかも、この自動再生の可否はユーザーごとに変化するため、デバッグ時に気が付かないことがあります。

Chrome 66ではMEI(Media Engagement Index)という仕組みによって内部で動画・音声が再生されるサイト上での挙動が記録され、ユーザーごとにスコアリングされます。

この数値をもとに、自動再生を許可するかしないか判定する仕組みです。

参考:Safari, Chromeの自動再生ポリシー変更のまとめ

https://qiita.com/ktknest/items/e81b3a4caac540098fc8

なお66は今ベータですが、4/17米国時間で正式リリースされます。やばい。

forumは超キレている人がいたりして荒れてます...


回避(緩和)方法

WebGLビルド用のjsファイルをいじるとある程度緩和できます。


修正対象ファイル

[Unityインストール位置]\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\lib\Audio.js


修正前


JS_Sound_Init: function()
{
try {
window.AudioContext = window.AudioContext||window.webkitAudioContext;
WEBAudio.audioContext = new AudioContext();
WEBAudio.audioWebEnabled = 1;
}
catch(e) {
alert('Web Audio API is not supported in this browser');
}
},


修正後

JS_Sound_Init: function()

{
try {
window.AudioContext = window.AudioContext||window.webkitAudioContext;
WEBAudio.audioContext = new AudioContext();
WEBAudio.audioWebEnabled = 1;
var wakeupWebAudio = function() {
if (WEBAudio.audioContext.state === "suspended") {
WEBAudio.audioContext.resume();
}
document.removeEventListener("click", wakeupWebAudio);
document.removeEventListener("touchend", wakeupWebAudio);
document.removeEventListener("keydown", wakeupWebAudio);
};
document.addEventListener("click", wakeupWebAudio);
document.addEventListener("touchend", wakeupWebAudio);
document.addEventListener("keydown", wakeupWebAudio);
}
catch(e) {
alert('Web Audio API is not supported in this browser');
}
},

※4/17修正: wilfremさんのコメントのご指摘で修正しました

編集が終わたたら、普通にWebGLビルドします。

この対処を行ったとしてもページを開いた直後はやっぱり音は出ないので、一回どこかをクリックかタップもしくはキーを入力してもらう必要があります。(つらい..


Unity issue tracker立ってます

エンジン側で根本解決してもらうためにも、issue trackerのチケットが余ってる人は突っ込んでくださいませ。

https://issuetracker.unity3d.com/issues/chrome66-no-longer-playing-integrated-audio