やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

Unity製ゲームをWebGLビルドしてGitHub Pagesに公開するワークフロー

Unityプロジェクトのバージョン管理にGitHubを使用している場合、GitHub ActionsワークフローでWebGLビルドを行ない、そのままGitHub Pagesに公開する方法を紹介します。

GitHub Pagesは、GitHubリポジトリに紐づく静的コンテンツをホスティングできる機能です。 公開できるサイズが10GB以下ということと、たとえprivateリポジトリであってもGitHub Pagesにはアクセス制限はかけらない*1という制限がありますので注意してください。

Unity - Builder アクション

ビルドには、GameCIの提供するUnity - Builder アクションを使用しています。 利用方法は公式サイトか、検索すれば日本語情報もありますので割愛します。

github.com

なお、CIをキックするユーザーはUnityのライセンスを持っている必要があります*2。publicなリポジトリで使用する場合は特に注意してください*3

また、現在パーソナルライセンスのCLIによる新規アクティベーションは塞がれています。次のIssueを参照してください。

alf->ulf license activation no longer possible for personal licenses · Issue #408 · game-ci/documentation · GitHub

GitHub Pages

GitHub Pagesで公開するコンテンツは、リポジトリの特定ブランチにあらかじめチェックインするか、GitHub Actionsによってアーティファクトにアップロードしたものを使用できます。

後者であれば、リポジトリにビルド成果物をチェックインする必要がなく便利です。 本例ではこの方法を紹介します。

まず、GitHubリポジトリSettings > Pagesを開き、SourceはGitHub Actionsを選択します。

すると、リポジトリのEnvironmentsにgithub-pagesが追加されます。 あとはワークフローで、WebGLビルド出力をtarで固めてgzipしたものをgithub-pagesという名前でアーティファクトにアップロードすることで、動作するゲームが https://OWNER.github.io/REPO/ で公開されます。

なお、GitHub Pagesで公開するWebGLは、Compression FormatをDisabledに設定しなければなりません。公開は行われますが実行時に次のエラーが出ます。

Unable to parse Build/WebGL.framework.js.gz! This can happen if build compression was enabled but web server hosting the content was misconfigured to not serve the file with HTTP Response Header "Content-Encoding: gzip" present. Check browser Console and Devtools Network tab to debug.

しかし、ゲームをunityroomで公開する場合、Compression FormatはGzipに設定する必要があります。 これを手動で切り替えるのは事故の元ですので、ワークフロー内でビルド前に書き換えています。

詳しくは、下記実装例を参照してください。

ワークフロー実装例

次のワークフローをリポジトリの.github/workflows下に置くことで、masterブランチにpush(もしくはPRをマージ)されるたびにWebGLビルドが実行され、GitHub Pagesで公開されます。

name: Deploy to GitHub Pages

on:
  push:
    branches:
      - master
  # masterブランチにpushされるたびにWebGLビルドして公開。条件はプロジェクトのニーズによって調整してください

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
  # 先行ジョブがあればキャンセル

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
      - uses: actions/checkout@v4

      - name: Set CompressionFormat to Disabled
        run: |
          sed -i -e 's/webGLCompressionFormat: ./webGLCompressionFormat: 2/' ProjectSettings/ProjectSettings.asset
        # Compression Formatを`Disabled`に書き換え

      - uses: game-ci/unity-builder@v3
        with:
          targetPlatform: WebGL
          allowDirtyBuild: true # 上でProjectSettings.assetを変更しているため指定
        env:
          UNITY_LICENSE: ${{ secrets[UNITY_LICENSE_2022] }}

      - uses: actions/upload-pages-artifact@v2
        with:
          path: build/WebGL/WebGL
        # WebGLビルド出力をアーティファクトにアップロード

  deploy:
    runs-on: ubuntu-latest
    needs: build
    permissions:
      id-token: write
      pages: write
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}

    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v2
        # GitHub Pagesに公開

*1:GitHub Enterprise契約であればできます

*2:Proライセンスが必要なプロジェクトであれば全員Proライセンスが必要です

*3:public forkからのPull Requestの実行を抑止することで不特定ユーザーによるキックを防ぐことはできます。ただしこれもUnity社のお墨付きというわけではないので保証の限りではありません