UnityCLI Macビルド

# 概要

MacでUnity CLIビルドをしてみる

Unity CLI自体はWindowsとほぼ変わらないが、path指定などが変わったりします

# 実装

https://github.com/RyuichiroYoshida/UnityMacBuild

### 注意点

Windowsで開発している人がチームにいる場合は文字コードをUTF-8などにしてもらいましょう

コメントなどが文字化けを起こし、正常に実行されません

この記事の逆パターンです

https://qiita.com/e_tyubo/items/09c7144b90c70b164ca6

### Shell変数宣言

```bash
# 使用時にダブルクォーテーションが重ならないように、変数に代入する値を調整する
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している

```bash
# 出力フォルダを処理のたびに削除する
# -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ビルドを行い、失敗時にはログを保存しコンソールに出力する

```bash
# 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チップ、両対応が選ぶことが出来る

https://docs.unity3d.com/ja/2023.2/Manual/macos-building.html

<details><summary>C#ビルドスクリプト(長いのでトグルに)</summary>

```csharp
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);
        }
    }
}
```

</details>

### Build成果物のGoogleDrive配置

```bash
# プロジェクトフォルダに移動
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"
```

# 参考資料

https://qiita.com/beckyJPN/items/ae73dd664b17f56be5ef

https://docs.unity3d.com/ja/2018.4/Manual/CommandLineArguments.html