🍇

GithubActionsでUnity製アプリをBuildする!

2022/12/17に公開

この記事はUnity Advent Calendar 2022(カレンダー1)の17日目の記事です。
昨日はsu10さん【Unity】レイヤーを実質無限に使えるようにするライブラリの紹介【Layer2】SainaさんUnityでVJをしようでした。

https://qiita.com/advent-calendar/2022/unity

皆さんこんにちは!
普段Unityで遊んでいる、やはぎです!
最近ハマっているGithubActionsでUnityアプリをビルドする時の知見がたまってきたので共有したいと思います。

GameCIの紹介

GameCIはGithubActionsなどを使ってUnityのアプリをビルドするときに使うことができるオープンソースのライブラリです。

https://game.ci/

プロジェクトを作成する


Sample用にCubeが無限に回転するだけのプロジェクトを作成しました。
BuildSettingsで制作したSceneをScene in Buildに追加するのを忘れないでください。

今回は、このSceneをWindows用にBuildしたいと思います。

Githubに制作したプロジェクトをPushする


今回制作したプロジェクトはこちらのリポジトリで公開しています。
ignoreファイルだけ追加して全部pushすれば問題ないと思います。

LICENCEのアクティベート

いよいよGithubActionsを使って行きます。
Unityのビルドをするためには最初にライセンスを設定する必要があります。
リポジトリのActionsタブを選択してset up a workflow yourselfを選択します。


選択すると下記の画像のような画面になります。ここで実際にActionsで実行する内容をymlファイルに書いて指定していきます。

基本的にはGameCIのドキュメントに添って書いて行けば大丈夫ですが日本語のコメントで解説を入れたコードを書いていきます。

activation.yml
name: Acquire activation file # Action名 なんでもいいがわかりやすいほうが良い
on: # このActionsを実行するタイミングの指定
  workflow_dispatch: {} # workflow_dispatchは手動で実行ボタンを押したときに実行される 他にもpushされた時とかpull_requetsされた時などを指定できる。
jobs:
  activation:
    name: Request manual activation file
    runs-on: ubuntu-latest # 動作するOSを制作する ubuntu以外にwindowsやmac-osが選べるが課金体系に注意!
    steps:
    - name: Request manual activation file # Licenceを要求する部分
      id: getManualLicenseFile
      uses: game-ci/unity-request-activation-file@v2
    - name: Expose as artifact #取得した.alfファイルをアップロードする部分
      uses: actions/upload-artifact@v2
      with:
        name: ${{ steps.getManualLicenseFile.outputs.filePath }}
        path: ${{ steps.getManualLicenseFile.outputs.filePath }}

コードがかけたらStart Commitボタンを押して保存します。
そうするとActionsのタブに先程作成したAcquire activation fileが表示されるようになりました。

さっそくRun workflowを押して実行してみます。

実行中のワークフローはオレンジ色のStatusが表示されます。完了するまで待ちましょう。
失敗すると赤いステータスが、成功すると緑のステータスが表示されます。

成功したActionsを見てみるとArtifacts欄にUnity_v2019.2.11f1.alfが生成されているのがわかります(ここの名前は人によって異なるかも)。

これをクリックしてzipファイルをダウンロードして解凍し、中のalfファイルを取り出しましょう。
取り出したら"license.unity3d.com/manual"にアクセスしてalfファイルをアップロードします。

その後は自分のLicenceに当てはまるものを選んでください

Licenceファイルをダウンロードしましょう(Unity_v2019.x.ulfでした。ここのUnityのversionが実際に使用するUnityのversionと一致しなくても問題ありません)

次にGithubのリポジトリをダウンロード開いてSettings→Secrets→Actionsを選択します。

New repository secretを選択してUNITY_LICENSEというSecretsを作成して中身に先程作成してUnity_v2019.x.ulfの内容をコピーします。

ここまで追加することができたらLicenceの設定は完了です!

Unityのプロジェクトをビルドする

いよいよGithubActionsをBuildするためのymlを制作します。GameCiのドキュメントを参考にしながら使いやすい用に編集して下記のymlを作成しました。

windows-build.yml
name: Windows Build
# コードがmainにpushされた時とpullreqが飛んできた時に自動で実行し手動でも実行できるようにする
  
on:
  push:
    branches: main
  pull_request: 
    branches: main
  workflow_dispatch: {}

# 連続して実行されたときに一つ前の実行中のジョブが停止されるようにする
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
  
jobs:
  unity-Build:
    name: Run the unity build steps
    runs-on: ubuntu-latest
    steps:
      # 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-
      # WindowsBuildする
      - name: Run the Windows build
        uses: game-ci/unity-builder@v2
        env:
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
        with:
          targetPlatform: StandaloneWindows64
          unityVersion: 2021.3.15f1
          buildName: GithubActionsBuildSample
      # Build成果物をアップロードする
      - name: Upload artifact
        uses: actions/upload-artifact@v3.1.0
        with:
          name: Build
          path: build

上記のコードを作成しコミットすると自動的にjobが走り始めます
無事に完了するとSummeryページのArtifactにBuildと書かれた項目がありzip形式でダウンロードすることができます。

これを展開して実行すると…
無事にビルドしたexeが動作することが確認できました!

終わりに

人生初アドカレで、記事のUnity本体の内容ではないという若干ニッチなチョイスだった気がしましたが最近頑張っていた部分を共有することができたと思います。本当はbundleVersionを自動で更新する部分も書きたかったのですが時間がないので次回書きます。最後までお読みいただきありがとうございました!。
質問などあればtwitterでしただけると何でもお答えします!
Unityゲーム開発者ギルドの#times_yahagi_dayでも大丈夫です!

明日はmaoさんの"UnityのiOS NativeRenderingPlugin辺りで何か書けたら (変わる可能性あり)"と若旦那さんの"Unityでピッチ推定を広くやる"です!
楽しみですね!

Discussion