【Unity】WebGLビルドが「テストプレイできない」時の解決手順

今回は、UnityでWebGL向けにビルドを行ってみたけどテストプレイが上手くいかない!と困っている方の解決方法の1つかと思い紹介しておきます。ちなみに、Windowsを使用しているのでWindowsユーザー向けの内容となります。

【Unity】WebGLビルドが「テストプレイできない」時の解決手順

UnityでWebGLにビルドしたのに、index.htmlを開いても起動しない/赤いエラーが出る。
今回ハマった原因はWebGLはfile://で動かせないBrotli(.br)圧縮の配信ヘッダー問題ブラウザのキャッシュでした。

この記事では、これらの解決手順についてまとめています。

症状1:index.htmlをダブルクリックするとエラー

まず、前提としてUnityからビルドするときに「Build」でビルドしたものを開く際のエラーです。「Build and Run」したわけではありません。

WebGLビルドのindex.htmlをエクスプローラーからダブルクリックで開くと、赤文字のエラーが出て起動できません。

webGLエラー①

原因

WebGLはブラウザの制限で、file://から別ファイルを読み込めません。
必ずHTTPサーバー経由(http://localhost/)で開く必要があります。

まず確認:ビルドフォルダの場所(OneDriveに注意)

私の環境ではデスクトップがOneDrive配下になっていて、ビルドフォルダがこの場所にありました:

  • C:\Users\(ユーザー名)\OneDrive\デスクトップ\kazenorenzu

フォルダが見つからない場合にはOneDrive配下になっていないか要チェックです。ビルドする際にデスクトップにゲームのタイトル等で何かしらフォルダを作ってその中にビルドファイルを作る事が多いと思います。

私も、デスクトップに「kazenorenzu」という名前のフォルダを作っています。

手順1:PowerShellでビルドフォルダへ移動

PowerShellを開いて、ビルドフォルダへ移動します。

cd “C:\Users\(ユーザー名)\OneDrive\デスクトップ\kazenorenzu”

手順2:ローカルサーバーを立てる(Python)

WebGLはサーバー経由で起動するので、Pythonでローカルサーバーを立てます。

Pythonが入っているか確認

python –version
  • Python 3.xx.xと出ればOK

  • Microsoft Storeが開く/動かない場合はPythonが未導入(またはエイリアス問題)なのでPythonをインストールします

Pythonが入っていない場合には、Windows Storeに行ってPythonと検索してインストールします。

症状2:python -m http.serverで起動しても .brが読めない

python -m http.server 8000で起動してhttp://localhost:8000/を開くと、今度はこんなエラーが出ました。

webGLエラー②

原因

Unity WebGLのビルドは.br(Brotli圧縮)ファイルを出力しますが、簡易サーバーだと.br に Content-Encoding: brを付けずに配ってしまい、ブラウザが展開できないことがあります。

手順3:Unity用のローカルサーバー(.br対応)を使う

そこで、ビルドフォルダ直下にserve_unity.pyを作って、.br / .gzに適切なヘッダーを付けて配信できるようにします。

serve_unity.pyを作成

kazenorenzuフォルダにserve_unity.pyという名前で作成し、以下を貼り付けて保存します。

from http.server import ThreadingHTTPServer, SimpleHTTPRequestHandler

class Handler(SimpleHTTPRequestHandler):
    # .br / .gz でも元の拡張子を元にContent-Typeを決める
    def guess_type(self, path):
        if path.endswith(".br") or path.endswith(".gz"):
            path = path[:-3]
        return super().guess_type(path)

    # 圧縮ファイル用のヘッダーを付ける
    def end_headers(self):
        p = self.path.split("?", 1)[0]
        if p.endswith(".br"):
            self.send_header("Content-Encoding", "br")
        elif p.endswith(".gz"):
            self.send_header("Content-Encoding", "gzip")
        super().end_headers()

if __name__ == "__main__":
    ThreadingHTTPServer(("localhost", 8000), Handler).serve_forever()

サーバー起動

cd “C:\Users\(ユーザー名)\OneDrive\デスクトップ\kazenorenzu”
python “.\serve_unity.py”

成功するとPowerShellにアクセスログが流れます(例:GET / … 304など)。
304はエラーではなくキャッシュが有効という意味です。

serve_unity.pyの拡張子が「txt」だったり、ファイル名が間違っていたりするとうまくいかないので要チェックです。

dirコマンドで一覧を出せるのでここでtxtになっていないか確認します。

ren “serve_unity.py.txt” “serve_unity.py”

txtファイルになっていたら上のようにファイル名を改名します。

ブラウザで起動

http://localhost:8000/
を開く。

症状3:通常Chromeだとエラー、シークレットだと動く

ここまでやっても 通常のChromeではまだエラー。でもシークレットウィンドウだと正常起動しました。

原因

通常Chrome側に、過去に失敗したときの壊れたキャッシュ(.br を誤った扱いで保存した等)が残っている可能性が高いです。

シークレットはキャッシュを使わないので正しく読み直せて動きます。

通常Chromeでも動かす(キャッシュ削除)・強制リロード・キャッシュの削除

Ctrl + Shift + R(またはCtrl + F5)でリロードしてみましょう。これでも上手くいかない場合Chrome設定 → プライバシーとセキュリティ → 閲覧履歴データの削除 → 「Cookieと他のサイトデータ」「キャッシュされた画像とファイル」を選んで削除します。

localからテストプレイ

これで大抵Chromeならテストプレイ出来るかと思います。

まとめ(私がやった解決手順)

  1. WebGLはfile//では動かないので、ローカルサーバーが必要

  2. OneDrive配下のデスクトップにビルドフォルダがあったので、正しいパスへ

  3. .brがUnable to parseになったので、.brにContent-Encoding: brを付けるserve_unity.py を用意

  4. シークレットで動いた=通常Chromeはキャッシュが原因 → localhostのサイトデータ削除で解決

同じような状況で困っている方の参考になればと思います。

著者プロフィール
うんくん

IT系に特化した記事がメインです。(Unity多め。)
Udemy講師もやっています。よろしくお願いします。

※Amazonのアソシエイトとして、当メディアは適格販売により収入を得ています。

うんくんをフォローする
unity基本操作
シェアする
うんくんをフォローする