Help us understand the problem. What is going on with this article?

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

Takaaki_Ichijo
Indie game developer: Back in 1995 pc/mac/consoles. Developer relations for game dev tools, Unityチョトデキルおじさん
http://head-high.com/
headhigh
オリジナルゲームタイトルの開発、ゲーム開発者向けツール・ミドルウェアのビジネスコンサルティングを行っています。
https://head-high.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away