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

何が起きているのか

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.