GameCIでUnityのビルドを自動化してみる。[Unity,GithubActions]

最近共同開発でUnityを使うことが増えてきたのですが、その中でUnityのビルドを自動化できるといざビルドして動かしたい時に困らなくていいよなと感じていました。

ただ、Unityのアプリケーションをビルドするには、Unityのエディタ環境(ビルド環境)をGithubActions上で準備する必要があったりします。

今回はGithubActions上でUnityのCI環境を簡単に組めるGameCIの簡単な使い方について調べてみました。

# GameCIとは
Unityにおける自動テスト、ビルド、デプロイを行ってくれるCIツールです。

https://game.ci/

:::note
### CI(継続的インテグレーション)とは
自動テストや自動ビルドを行うことでコードの品質を維持しながら、開発効率を上げていく手法です。
CIを導入することで
- チーム生産性の向上
- 自動デプロイによる市場投入への時間短縮
- 高品質な状態でのリリース
というメリットを得られることができます。
:::

GameCIが用意しているGithubActionsのActionsを使用することで、簡単に自動ビルド等を行うことができます。

# 実際にCIを組んでみる

## 下準備
下準備として以下の3つ情報が必要になります。
- Unityのアカウントemailアドレス
- Unityのアカウントパスワード
- Unityライセンス


Unityのライセンスは、PersonalやProなどUnityを使用する際に選択したプランに紐づいた証明書のことです。

Unityライセンスを使用してGithub上でUnityを使うために`アクティベーション`を行います。

### ulfファイルを取得する

ulfファイルを使ってアクティベーションをおこないます。

https://game.ci/docs/gitlab/activation

>ulfは`Unity Licence File`の略らしい

各OSごとに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ファイルが存在しないため、ulfファイルを発行する必要があります。

発行するためにまずUnityHubの設定画面から下のライセンス画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/c50c70ea-d2ce-4576-ad78-80f5e81a2406.png)

`ライセンスリクエストによる認証`を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/d79a5c4e-52b9-4f85-9166-10e7345ff4b9.png)

すると手順が表示されるので、以下の手順を順番に行っていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/8d44a5e8-1032-431a-b9d9-22b4414d5caf.png)

まず、`ライセンスリクエストをダウンロード`を選択して、alfファイルを取得します。

>alfは、`Activation Licence File`のこと


次に、URLを選択します。
alfファイルをuploadします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/8ddf46b5-dc53-4db3-8ae5-425c7a681b0f.png)

すると、次のページが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/bca8abd3-8688-4bfa-bceb-5434fbf70ea2.png)

Proライセンス等ではシリアルナンバーがありますが、Personalライセンスはシリアルコードがありません。

学生が使うアカウントや一般使用する場合は、Personalライセンスだと思うのでこのままだと進むことができません。

本来は、Personalアカウント用に表示される部分がオフになってるのでオンにしようと思います。

>2025/3/1現在の話なので表示されるように今後なってるかもしれません。

デベロッパーツールで下の`option option-personal clear`クラスの部分のcssで`display: none;`をオフにします。

- オン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/46813988-f1d6-4027-99e0-6af67cb2df56.png)

- オフ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/6944b357-f4a1-40dc-9e3d-f1bfa8595a1d.png)

すると、下の画面が出てくるので`I don't use Unity in a professional capacity`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/98a3deb6-9f88-4418-8d84-585617c34203.png)

ここまでくるとulfファイルがダウンロードできるようになるのでダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/50764128-c138-47e5-a5c5-562a1cb5ff81.png)

### Githubのsecrets変数に格納する
リポジトリの`Settings`に下のようにSecrets変数を設定できます。

各情報を下の変数名に割り当てて設定します。

- UNITY_EMAIL:Unityアカウントのメールアドレス
- UNITY_PASSWORD:Unityアカウントのパスワード
- UNITY_LICENSE:ulfファイルの中身

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/1f417336-bf06-4b90-a81f-65129521a247.png)


## ymlを書いていく
`.github/workflows`内にymlファイルを書いていきます。

今回は自動ビルドを行いたいので下のように記述します。


```.github/workflows/build.yml
name: build.yml
on:
  workflow_dispatch: {} //手動でビルドできるように
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v4 //リポジトリをクローン

      - name: build
        uses: game-ci/unity-builder@v4 //ビルド
        env:
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} //secrets変数を使用する
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
        with:
          targetPlatform: StandaloneOSX //MacOSを選択する
          unityVersion: 6000.0.36f1
```

`actions/checkout`は、Actions内にリポジトリをクローンします。
```yml
- name: checkout
  uses: actions/checkout@v4
```

そこからGameCIのActionの`game-ci/unity-builder`を使ってビルドを行います。
```yml
 - name: build
   uses: game-ci/unity-builder@v4 
   env:
     UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} 
     UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
     UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
   with:
     targetPlatform: StandaloneOSX 
     unityVersion: 6000.0.36f1
```

`secrets.<変数名>`とすることでSecrets変数にアクセスすることができます。
`targetPlatform`はMacOSに対応している`StandaloneOSX`を指定します。
`unityVersion`でUnityのversionを指定します。

では、このactionsを走らせたいと思います。
Github上の場面から`Actions`を選択して、先ほど執筆したymlファイルを選択します。
次に`Run Workflows`を押すことで手動でActionを走らせることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/551c4336-35a4-4d5e-a4d2-add2594fa483.png)

CIが通ると下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/e401efc4-b5be-4f61-b22a-e87e6d6dd02c.png)

buildにチェックマークがついたらビルド成功です!

## デプロイも自動化する

デプロイも自動化できるのでやってみようと思います。


```yml
name: build.yml
on:
  workflow_dispatch: {}
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v4

      - name: build
        uses: game-ci/unity-builder@v4
        env:
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
        with:
          targetPlatform: StandaloneOSX
          unityVersion: 6000.0.36f1
          
      - name: Upload Build
        uses: actions/upload-artifact@v4 //デプロイ
        with:
          name: Build //ビルドしたファイル名
          path: build //ビルドしたファイルのパス
```

`actions/upload-artifact@v4`を使用することでデプロイできます。
`name`にはビルドしたファイル名、`path`ビルドしたファイルのパスを指定します。

```yml
uses: actions/upload-artifact@v4 
with:
    name: Build
    path: build
```

これで先ほどと同じようにデプロイしてみようと思います。
`Artifacts`にデプロイ結果が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/0863ebda-9761-4d2c-8052-293b34cc56ac.png)

ビルドしたファイルをダウンロードして動かしてみます。

そのまま開くのがセキュリティ的にできないので権限を変えます。

```zsh
xattr -rc <ダウンロードしたファイルのパス>
```
>自己責任でお願いします。

こんな感じで開けました!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/25527f37-5c64-4a01-813b-9ffb9211e5dd.png)

# 最後に
今回はGameCIを使った、GithubActionsでの自動ビルドとデプロイの方法を調査しました。

GameCIでは自動テストも行えるのですが、あまり自分はやったことがなかったので今回はやりませんでしたが、どこかのタイミングでやりたいと思います。

# Unity関連の記事
https://qiita.com/maooz4426/items/732df32ae04071820a96

# GithubActionsの記事
https://qiita.com/maooz4426/items/ecdfc0c4e33e76ffc432

https://qiita.com/maooz4426/items/f6740347eec6df320a1e

https://qiita.com/maooz4426/items/caf1537e469eff68e3c5

https://qiita.com/maooz4426/items/44a71129ce2f0a463817

https://qiita.com/maooz4426/items/e6ee4ed7909f7b2c0fb7

https://qiita.com/maooz4426/items/056e0fa08cd0edcee4bf

https://qiita.com/maooz4426/items/015241f9c97f5aa4f411