こんにちは!Life is TechでUnityメンターをしている,やまゆです!
今回はUnityでもCI/CDができることを知ったのですが,結構詰まったところもあったので共有します!
なんでやろうと思ったか
僕は趣味で開発する時は大体Web開発をやっているんですが,最近ハッカソンと技育展に出していたプロダクトでUnityを使うことになりました.
Unityで作ったゲームをunityroomで公開していたんですが,なにか機能作るたびに毎回ビルドするのがめんどくさくなって最後の方まで更新しなくなっちゃったんですよね...
Web開発の文脈では,GitHub上でブランチがmainブランチにマージされるとCI/CDによって自動ビルド・自動デプロイをやっちゃうことが多かったので,「これをUnityでもできないか?」と考えたのがきっかけでした.
やりたいこと
PullRequestが承認されてmainブランチにマージされると,GitHub Actionsによって自動的にWebGLビルドにしてダウンロードできるようにする!

上の画像のように,ビルドされたファイルをGitHubのActionsのタブからダウンロードできるところまでをゴールにします!
手順
1. unityroomで公開するための設定
今回はunityroomで公開するのがゴールなので設定しっかりやっておきましょう!
この話に関しては他にもたくさん記事があるので,参考になりそうな記事のリンク貼っておきます!
https://help.unityroom.com/build-settings
https://qiita.com/kurisaka_konabe/items/73471f00439befea807d
2. GitHubActionsを動かすためのymlファイルを書いていく
今回はgame-ciというものを使ってビルドします!
name: WebGL Build
# コードがmainにpushされた時とpullrequestが飛んできた時に自動で実行し手動でも実行できるようにする
on:
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch: {} #手動実行のためにつけておく
# 連続して実行されたときに一つ前の実行中のジョブが停止されるようにする
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
webgl-Build:
name: Run the unity build steps
runs-on: ubuntu-latest
steps:
# Unityビルドは容量を大量に消費するため、不要なファイルを削除して空き容量を確保する
- name: Free Disk Space
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
swap-storage: true
# Actionsがリポジトリにアクセスできるようにする
- name: Checkout
uses: actions/checkout@v3
# LibraryをCacheしてBuildを高速化する
- name: Cache Library
uses: actions/cache@v3
with:
path: Library
key: Library-${{ hashFiles('Assets/**', 'Packages/**','ProjectSettings/**') }}
restore-keys: Library-
# Unityプロジェクトのビルド
# 設定しない場合、buildフォルダに出力される
- name: Run the WebGL build
uses: game-ci/unity-builder@v4
env:
UNITY_EMAIL: ${{ secrets.UNITY_USERNAME }}
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
with:
targetPlatform: WebGL
unityVersion: 6000.0.57f1 #ここに使うUnityのバージョンを入れる
buildsPath: build
# Build成果物をアップロードする
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: build
path: build
ざっくり何やってるかというと...
- Actionsが実行されるサーバー側のいらないファイルを削除
- サーバーの制限が厳しい上にUnityが重いのでこれやっとかないと大体ビルド失敗する
- Github Actionsでリポジトリ扱えるようにして
- Libraryキャッシュしといて
- UnityゲームをWebGLにビルトする
使いたいプロジェクトの構成に合わせてpath等々うまいこと書き換えてください!
3. Unityのライセンスファイルを取得する
Actionsでのビルドに使用するgame-ciの中でライセンスが必要なので取得します
これら参考
https://game.ci/docs/github/activation/
https://github.com/game-ci/documentation/issues/408
「ライセンス」から

右上の「ライセンスを加える」を押して

「無料のPersonalライセンスを取得」をクリック

同意してライセンスを追加しよう
game-ciの公式ドキュメントより
以下のフォルダに配置されている.ulfファイルを見つけてください!
Windows: C:\ProgramData\Unity\Unity_lic.ulf
Mac: /Library/Application Support/Unity/Unity_lic.ulf
Linux: ~/.local/share/unity3d/Unity/Unity_lic.ulf
こいつを次のステップで使うので、メモ帳かなんかでひらいて中身を見れるようにしといて下さい!
すでにライセンス登録していて、指定のパスに.ulfファイルが存在しない場合は今回の手順に従って取得しなおしてみてください!
もしかしたら生成されるかもです!
これでも無理だった方へ
もし以上の方法でも取得できなかったら,
- ライセンスリクエストのページのCSS書き換えて無理やり取得する
- Actionsで
game-ciではなくbuildalonを使う- 僕はうまいことできませんでした。。。
4. GitHub ActionsのSecretsを設定する
Actionsで使用するSecretsを指定していく
Github->今回自動ビルドしたいリポジトリ->画面上部のSettings->画面左側のSecurity->Secrets and Variables->Actions->New repository secretsから追加する
この記事では追加したいのは
-
UNITY_USERNAME: あなたのアカウントのメールアドレス -
UNITY_PASSWORD: あなたのアカウントのパスワード -
UNITY_LISENCE: 手順3で取得した.ulfファイルの中身
変数名はActionsのymlファイルに書いてあるのと同じにしてください!
この記事のymlの通りだとこんな感じになってて欲しい

5. 準備完了!!あとは動かすだけ!!!
mainブランチにマージされたら自動で動くし,手動で動かしたかったらRun workflowのボタン押したら実行できます

動いて成功したやつクリックして,下の方にスクロールしていくと....

Artifactsの欄からダウンロードできます!!!
これで全部終わりです!!!!!!!お疲れ様でした!!!!!!
終わりに
CI/CDはUnityのゲーム開発の文脈ではあまり聞かない気がします.
個人的に作業効率がダンチなのでぜひ導入してみて欲しいです!
補足
unityroomへの自動更新は行えなかった
unityroomが流石に自動デプロイをサポートしていなかった
もしかしたらpythonのplaywrightを使えば無理やりできんのかな...?とか思いましたが,時間かかるし難易度高いしunityroomのUIの変更でぶっ壊れるのでやめました
ローカルで単純に実行しようとしても動かない
実はダウンロードしたファイルをクリックして実行しようとしても動かないです(unityroomだと動く)
ローカルで動かしたいならサーバー建てないとダメみたい
参考はこの辺
.ulfファイルを使わずにビルドする方法もあるみたい
buildalonというOSSではメアドとパスワードだけで認証できる
うまいことビルドできなかったので今回は使わなかった
参考