はじめに
この記事はUnity Advent Calendar 2023 13日目の記事です
これまでUnityでCICDを実現する記事をいくつか書いてきました
近年はリモートワークが普及したことによりオンプレミス環境のJenkinsよりクラウドビルド環境が求められることが増えてきました。
今回の記事ではGameCIとGithubActionsを使ってクラウドビルド環境の構築の仕方を紹介します
今回使ったプロジェクトなどはGithubにアップしてあります
GameCIとは
GameCIはUnityのクラウドビルド環境を簡単に構築できるライブラリです
GitHub/GitLab/CircleCIなどに対応しています
GameCIでビルドするまでの大まか流れとしては以下の通りです。
1.Unityプロジェクトの準備
2.ライセンスファイルの取得
3.ライセンスファイルをGithubに登録する
4.GithubActionsでビルドできるように設定
5.ビルドを実行する
Unityプロジェクトの準備
まずUnity Projectを作成し、Githubにプッシュしましょう
Build Settingsにビルドしたいシーンを入れておきます
ライセンスファイルの取得
GithubActions上でUnityを動かすためにはUnityのライセンスファイル(.ulfファイル)が必要となります
Personalライセンスの場合でも取得が必須となっています。
GameCI公式によると下記の場所にulfファイルは存在します。
Windows: C:\ProgramData\Unity\Unity_lic.ulf
Mac: /Library/Application Support/Unity/Unity_lic.ulf
Linux: ~/.local/share/unity3d/Unity/Unity_lic.ulf
どのOSのファイルであっても問題ないようです。
※少し古い記事だとUnityのManualActivationを使ってulfファイルを取得する方法が掲載されていますが、2023年12月現在 PersonalライセンスはManual Activationを使ってulfファイルを取得することができません
ライセンスファイルをGithubに登録する
GithubのSettings->Secrets and variables->Actionsを開きます
Repository secretsのNew repository secretをクリックします
入力画面になるのでNameにUNITY_LICENSE
Secretに.ulfファイルの中身をコピーしてAdd secretします
同様にUNITY_EMAIL
とUNITY_PASSWORD
にUnityログインに使っているメールとパスワードを入力して保存します
※Secretに入れた文字列はログに表示されたり、他のGithubユーザーに見られることはありません
GithubActionsでビルドできるように設定
GithubのActionsタブを開き、Simple workflowからGithubActions用のファイル(workflow)を作成します
Editorが開いたら下記のコードをコピーしてコミットします
# 名前を付ける。これがGithubActions上に表示される
name: Run the Windows build
on:
workflow_dispatch: {}
jobs:
build:
name: Run the Windows build
runs-on: ubuntu-latest
steps:
# リポジトリのチェックアウト
- name: Check out my unity project.
uses: actions/checkout@v4
- name: Create LFS file list
run: git lfs ls-files -l | cut -d' ' -f1 | sort > .lfs-assets-id
# LFSファイルのキャッシュを取得する
- name: Restore LFS cache
uses: actions/cache@v3
id: lfs-cache
with:
path: .git/lfs
key: ${{ runner.os }}-lfs-${{ hashFiles('.lfs-assets-id') }}
# LFSファイルをPullする
- name: Git LFS Pull
run: |
git lfs pull
git add .
git reset --hard
# ファイル名にgitのハッシュを含めたいので$GITHUB_OUTPUTに保存しておく
- name: Set outputs
id: vars
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
# Cache
- uses: actions/cache@v3
with:
path: Library
key: Library-${{ hashFiles('Assets/**', 'Packages/**', 'ProjectSettings/**') }}
restore-keys: |
Library-
# Unityプロジェクトのビルド
# 設定しない場合、buildフォルダに出力される
- name: Run the Windows 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: StandaloneWindows64
unityVersion: 2022.3.0f1 #ここに使うUnityのバージョンを入れる
# 成果物をZIPにしてアップロードする
- name: Upload the Windows Build
uses: actions/upload-artifact@v3
with:
name: Build-${{ steps.vars.outputs.sha_short }}
path: build
ビルドを実行する
上手く設定ができるとActionsタブに先ほど作ったworkflowが表示されます
Run workflow
を実行してみましょう
上手くいくと下記のようになりArtifactsからZIPがダウンロードできます
ダウンロードしたZIPを展開してStandaloneWindows64.exeを実行するとプロジェクトが正しくビルドされていることが分かります
workflowが表示されない場合
GithubActionsはデフォルトブランチで実行されることが前提になっています
そのため、デフォルトブランチ以外でworkflowを作成したときにworkflowとして表示されない場合があります。
この時は一度デフォルトブランチでファイルを作成したのち、別ブランチで作業をするのが良いでしょう
応用編
自動でビルドするようにする
workflowを少し変更して自動でビルドが走るように変更します
下記のように記述するとmainブランチにpushがあるたびに自動で実行されるようになります
name: Run the Windows build
on:
workflow_dispatch: {}
# mainブランチにpushがあるたびに自動で実行される
push:
branches:
- main
他にもプルリクエストが作られたらトリガーにするなどいろいろな使い方があります
公式ドキュメントを見てみてください
Unityの任意の関数を実行する
JenkinsビルドするときもUnityのビルド用の関数を作成してそちらを叩くことが多かったですがGameCIでも同じことができます
まずUnity側にビルド用のクラスを作成します
今回はカスタムパラメータを使う例を示すために、パラメータからもらった値をStreamingAssetsに保存しています
using UnityEditor;
using UnityEditor.Build.Reporting;
using UnityEngine;
public class Builder
{
public static void Build()
{
var message = "";
var args = System.Environment.GetCommandLineArgs();
for(var i=0;i<args.Length;i++)
{
if (args[i] == "-message")
{
//-messageの次の引数を入力した文字列とする
message = args[i + 1];
}
}
if(!string.IsNullOrEmpty(message))
{
Debug.Log("Message---->"+message);
using(var writer = new System.IO.StreamWriter(Application.streamingAssetsPath+ "/message.txt"))
{
writer.Write(message);
}
}
var option = new BuildPlayerOptions();
option.target = BuildTarget.StandaloneWindows64;
//ビルドシーンのパスを配列で指定
option.scenes = new[] { "Assets/Scenes/SampleScene.unity" };
//ビルドプラットフォーム名のフォルダに入れないと上手くいかない
option.locationPathName = "build/StandaloneWindows64/Sample.exe";
var result = BuildPipeline.BuildPlayer(option);
if (result.summary.result == BuildResult.Succeeded)
{
Debug.Log("BUILD SUCCEED");
Debug.Log(result.summary.outputPath);
Debug.Log($"{result.summary.totalSize:N}bytes");
Debug.Log($"{result.summary.totalTime.TotalSeconds}seconds");
}
else
{
Debug.LogError("BUILD FAILED");
}
EditorApplication.Exit(result.summary.result == BuildResult.Succeeded ? 0 : 1);
}
}
また、StreamingAssetsに保存したパラメータをゲーム上に表示するためにスクリプトを作っておきます
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
public class MessageFromStreamingAssets : MonoBehaviour
{
[SerializeField] Text text;
private void Start()
{
try
{
using (StreamReader sr = new StreamReader(Application.streamingAssetsPath + "/message.txt"))
{
text.text = sr.ReadToEnd();
}
}
catch (System.Exception e)
{
Debug.LogException(e, this);
}
}
}
そしてworkflowにbuildMethod
とcustomParameters
を追加し任意の関数にパラメータを渡すように修正します
- name: Run the Windows build
uses: game-ci/unity-builder@v4
env:
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
with:
targetPlatform: StandaloneWindows64
unityVersion: 2022.3.0f1 #ここに使うUnityのバージョンを入れる
buildMethod: Builder.Build #呼び出すクラス名・関数名を入れる
customParameters: -message MyCustomParameters #渡したいパラメータをここに入れる
この状態でビルドするとMyCustomParametersという文字列がゲーム上に表示されるようになりました
まとめ
GameCIとGithubActionsを使ったUnityクラウドビルドの仕方を紹介しました
今回はWindowsビルドの例を紹介しましたが他プラットフォームもビルドすることが可能です
またGithubのワークフローに組み合わせることで、プルリクを出したときにビルドチェックを通したりと様々な応用ができます
是非いろいろな使い方を試してみてください