Unityでインディゲームを作る!

Unityでのゲーム制作を目指し、それに関わる話題についてのブログ

Unity WebGLにおけるAudioについて。PlayOnAwakeやStart関数でのPlayが効かない!?

(※2022/05/12追記)

 今現在、WebGLについていろいろ試しているのですが、なんかよく分からない挙動が多い!その中の一つが音楽が上手く始まらないこと!

 

 今回扱うのは、音楽流す用のAudio SourceでPlayOnAwake設定を有効にしているのに、WebGL上では上手く機能せず音楽の再生が始まらない、という現象です。またStart関数にaudioSource.Play()と書いても上手く音楽が始まりません。

 エディターでプレイする上ではちゃんと再生されるのに、ビルドしてブラウザ上でプレイすると、これらの問題が発生します。

 

 UnityのWebGLにおけるオーディオは、他のプラットフォームの実装とは異なり、Web Audio APIを利用して、ブラウザ上でオーディオの再生とミキシングを行っている、らしいです。

 つまり、いろいろ制限、制約が多いようなので、ロードしたばかりにブラウザが音楽を上手くスタートできない、という特性があるのかもしれません。めんどくせー!

(※追記 後述しますがブラウザが許可するまでは音は出せない、とのことです)

 

WebGLaudioIssue_Script

 ひとまずの対策としてInvoke()で音楽のスタートを遅らせることで、無事再生されるようになりました。

 

 しかし、1秒くらい間を取っても上手くならないこともあるので、より余裕を持たせて再生を始めるのが良いかもしれません。

 引き続き原因は調べますが、とりあえずこのような簡単な対策で問題回避は出来てるっぽいので良かったです。

 

※追記

 その後、このような対策をしても音が出ないことがありました。ちゃんと調べたら判明したのですが、ブラウザはセキュリティ上の都合でユーザーのマウスクリックしたり画面をタッチするなどの動作が感知されるまでは音出力を許可しない、ということでした。

Audio in WebGL(Unity公式ドキュメント)

 なので、上で書いたような対策はその許可が時間内に下りなければ、結局BGMがスタートしないということになってしまいます。

 じゃあどうすればいいのか、というとOnApplicationFocusを使うことで、プレイヤーが画面にフォーカスした時点で音楽をスタートさせるのがいいのかな、と思いました。

 

 というか、そもそもスタート画面を作ってプレイヤー自身にゲームをスタートさせる機会を作ればいい、だけではあります。