概要
MacでUnity CLIビルドをしてみる
Unity CLI自体はWindowsとほぼ変わらないが、path指定などが変わったりします
実装
注意点
Windowsで開発している人がチームにいる場合は文字コードをUTF-8などにしてもらいましょう
コメントなどが文字化けを起こし、正常に実行されません
この記事の逆パターンです
Shell変数宣言
# 使用時にダブルクォーテーションが重ならないように、変数に代入する値を調整する
UNITY_VERSION=2022.3.48f1
UNITY_EDITOR_PATH=UnityEditorのPath
PROJECT_PATH=UnityProjectのPath
EXPORT_PATH="Build成果物を配置するGoogleDriveのPath"
LOG_FILE_PATH=logファイルを配置するPath
GAS_URL="GASのWebアプリデプロイのURL"
セットアップ処理
以前のBuild成果物を削除し、プロジェクトをPullしている
# 出力フォルダを処理のたびに削除する
# -e 指定したパスが存在するかどうかの判定キーワード
# then if文の構文で、条件式の結果でthenブロックを実行する
if [ -e "$PROJECT_PATH/Build" ]; then
# rm ファイルやディレクトリを削除するコマンド
# -r 指定したディレクトリ内のすべての要素を削除する
# -f 削除確認を表示せずに削除し、存在しないファイルに対してエラーを表示しない
rm -rf "$PROJECT_PATH/Build"
fi
# プロジェクト更新
cd $PROJECT_PATH
git pull リポジトリのURL
# エラー時処理
# $? 直前に実行されたコマンドの終了ステータス
# -eq 比較演算子 == と同じ意味
if [ $? -eq 1 ]; then
echo "プロジェクトの更新に失敗しました"
exit 1
fi
UnityBuild部分
UnityCLIビルドを行い、失敗時にはログを保存しコンソールに出力する
# Unityビルドコマンドを実行する
# Macの場合は実行ファイル内の指定デプロイまで指定する必要がある
"$UNITY_EDITOR_PATH$UNITY_VERSION/Unity.app/Contents/MacOS/Unity" -batchmode -quit -projectPath "$PROJECT_PATH" -executeMethod "BuildCommand.Build" -logfile "$LOG_FILE_PATH" -platform "Mac" -devmode true -outputPath "$PROJECT_PATH/Build"
if [ $? -eq 1 ]; then
cat "./log/TeamC.log"
exit 1
fi
Macの場合には対象のCPUを設定する必要がある
AppleSilicon、Intelチップ、両対応が選ぶことが出来る
C#ビルドスクリプト(長いのでトグルに)
using UnityEditor;
using UnityEngine;
using System.Linq;
public class BuildCommand
{
[MenuItem("Assets/Build Application")]
public static void Build()
{
//プラットフォーム、オプション
var isDevelopment = true;
var platform = BuildTarget.StandaloneWindows;
// 出力名とか
var exeName = PlayerSettings.productName;
var ext = ".exe";
string outpath = default;
// ビルド対象シーンリスト
var scenes = EditorBuildSettings.scenes
.Where(scene => scene.enabled)
.Select(scene => scene.path)
.ToArray();
// コマンドライン引数をパース
// 他の環境は今回は書かない
var args = System.Environment.GetCommandLineArgs();
for (var i = 0; i < args.Length; i++)
{
switch (args[i])
{
case "-projectPath":
outpath = args[i + 1] + "\\Build";
break;
case "-devmode":
isDevelopment = args[i + 1] == "true";
break;
case "-platform":
switch(args[i + 1])
{
case "Mac":
platform = BuildTarget.StandaloneOSX;
ext = ".app";
// Macの場合は対象CPUアーキテクチャを設定する
// 今回はAppleSiliconとIntelチップ両対応
PlayerSettings.SetArchitecture(BuildTargetGroup.Standalone, 2);
break;
}
break;
}
}
//ビルドオプションの成型
var option = new BuildPlayerOptions
{
scenes = scenes,
locationPathName = outpath + "\\" + exeName + ext
};
if (isDevelopment)
{
//optionsはビットフラグなので、|で追加していくことができる
option.options = BuildOptions.Development | BuildOptions.AllowDebugging;
}
option.target = platform; //ビルドターゲットを設定. 今回はWin64
// 実行
var report = BuildPipeline.BuildPlayer(option);
// 結果出力
if (report.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded)
{
Debug.Log("BUILD SUCCESS");
EditorApplication.Exit(0);
}
else
{
Debug.LogError("BUILD FAILED");
foreach(var step in report.steps)
{
Debug.Log(step.ToString());
}
Debug.LogError("Error Count: " + report.summary.totalErrors);
EditorApplication.Exit(1);
}
}
}
Build成果物のGoogleDrive配置
# プロジェクトフォルダに移動
cd "$PROJECT_PATH"
# ビルドファイルを圧縮
# zipを直にGoogleDriveへ配置できなかったので、圧縮のみ
zip -r MacBuild.zip Build/
if [ $? -eq 1 ]; then
exit 1
fi
# Google Driveへ移動
mv "$PROJECT_PATH/MacBuild.zip" "$EXPORT_PATH"
# Discordへ通知するGASを実行する
curl -f "$GAS_URL"
参考資料