0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unity × git worktree:AI並列開発で各worktreeをすぐデバッグする方法【macOS】

0
Posted at

はじめに

Unityでゲーム開発をしている際、これまでは一つのブランチでAIを動かし、作業が終わるまで待つという進め方をしていました。しかし、これでは待ち時間が発生し、手が空いてしまうことが多々ありました。
そこで、複数のブランチで複数のAIを同時に動かし、開発速度を爆上げしたいと思って調べたところ、git worktreeという機能を見つけました!
実際にgit worktreeを使ってAIに並列開発をさせてみたのですが、作成したworktreeを動作確認するたびに、Unity Hubへプロジェクトとして追加して開いていました……。
そこでこの記事では、worktreeを毎回Unity Hubへ追加しなくても、各worktreeのUnityプロジェクトを直接開く方法についてまとめます!

概要

この記事では、git worktreeで作成した作業ディレクトリ内のUnityプロジェクトを、Unity Hubのプロジェクト一覧へ毎回追加せず、直接Unity Editor(Unityエディター)で開く方法を紹介します。
プロジェクト内にOpenUnity.commandというファイルを配置し、実行したworktreeのパスと、そのプロジェクトが使用しているUnityのバージョンを自動で取得します。
OpenUnity.commandをGitで管理しておけば、新しく作成したworktreeにも自動で含まれるため、worktreeを作成してすぐに動作確認できます。

動作環境

  • macOS Tahoe 26.5.1
  • Unity 6
  • GitHub Desktop
  • Shell:zsh

完成後の動き

各worktreeに含まれるOpenUnity.commandを実行すると、そのworktreeのUnityプロジェクトが直接Unity Editorで開きます。

worktreeを作成
↓
各worktreeでAIに実装させる
↓
Tools/OpenUnity.commandを実行
↓
対象のworktreeをUnity Editorで開く

完成後のディレクトリ構成は次のようになります。

TetrisGame/
├── Assets/
├── Packages/
├── ProjectSettings/
├── Tools/
│   └── OpenUnity.command
└── .gitattributes

起動コマンドの作成

まず、Terminal(ターミナル)で自分のUnityプロジェクトへ移動します。

cd ~/Desktop/TetrisGame

パスは自分のUnityプロジェクトに合わせて変更してください。
続いて、以下のコードを先頭から最後まで、改行を維持したままTerminalへ貼り付けます。

mkdir -p Tools
cat > Tools/OpenUnity.command <<'EOF'
#!/bin/zsh

set -euo pipefail

# このスクリプトが置かれているToolsフォルダを取得
SCRIPT_DIR="$(cd -- "$(dirname -- "$0")" && pwd)"

# Toolsフォルダの1階層上をUnityプロジェクトとして使用
PROJECT_PATH="$(cd "$SCRIPT_DIR/.." && pwd)"

# Unityバージョンが記録されているファイル
VERSION_FILE="$PROJECT_PATH/ProjectSettings/ProjectVersion.txt"

# エラーを表示してスクリプトを終了する関数
show_error_and_exit() {
    echo ""
    echo "エラー: $1"
    echo ""
    printf "Enterキーを押して終了します。"
    read -r
    exit 1
}

# Unityプロジェクトか確認
if [[ ! -d "$PROJECT_PATH/Assets" ]]; then
    show_error_and_exit "Assetsフォルダが見つかりません。"
fi

if [[ ! -d "$PROJECT_PATH/ProjectSettings" ]]; then
    show_error_and_exit "ProjectSettingsフォルダが見つかりません。"
fi

if [[ ! -f "$VERSION_FILE" ]]; then
    show_error_and_exit "ProjectVersion.txtが見つかりません。"
fi

# ProjectVersion.txtからUnityバージョンを取得
UNITY_VERSION="$(
    sed -n 's/^m_EditorVersion: //p' "$VERSION_FILE" |
    head -n 1 |
    tr -d '\r'
)"

if [[ -z "$UNITY_VERSION" ]]; then
    show_error_and_exit "Unityバージョンを取得できませんでした。"
fi

# Unity Hubの標準インストール先
UNITY_APP="/Applications/Unity/Hub/Editor/$UNITY_VERSION/Unity.app"

if [[ ! -d "$UNITY_APP" ]]; then
    echo ""
    echo "Unity $UNITY_VERSION が見つかりません。"
    echo ""
    echo "確認した場所:"
    echo "$UNITY_APP"
    echo ""
    echo "インストールされているUnityバージョン:"

    if [[ -d "/Applications/Unity/Hub/Editor" ]]; then
        ls -1 "/Applications/Unity/Hub/Editor"
    else
        echo "Unity HubのEditorフォルダが見つかりません。"
    fi

    echo ""
    printf "Enterキーを押して終了します。"
    read -r
    exit 1
fi

echo ""
echo "Unity Editorを起動します。"
echo "Unityバージョン: $UNITY_VERSION"
echo "プロジェクト: $PROJECT_PATH"
echo ""

# Unity Hubを経由せずにUnity Editorを起動
open -n "$UNITY_APP" --args \
    -projectPath "$PROJECT_PATH"
EOF

# 現在のOpenUnity.commandをLF形式に統一
perl -pi -e 's/\r$//' Tools/OpenUnity.command

# .gitattributesが存在しなければ作成
touch .gitattributes

# 既存の.gitattributesの末尾に改行がなければ追加
if [[ -s .gitattributes && -n "$(tail -c 1 .gitattributes)" ]]; then
    printf '\n' >> .gitattributes
fi

# .commandと.shをGit上でLF形式に固定
grep -qxF '*.command text eol=lf' .gitattributes ||
    printf '%s\n' '*.command text eol=lf' >> .gitattributes

grep -qxF '*.sh text eol=lf' .gitattributes ||
    printf '%s\n' '*.sh text eol=lf' >> .gitattributes

# OpenUnity.commandに実行権限を付与
chmod +x Tools/OpenUnity.command

最後のEOFは、必ず行の先頭に単独で置いてください。コード全体を一行にして実行すると、正常にファイルを作成できません。
このコマンドでは、次の処理をまとめて行っています。

Toolsフォルダを作成
↓
OpenUnity.commandを作成
↓
改行コードをLFに統一
↓
.gitattributesにLF固定の設定を追加
↓
OpenUnity.commandに実行権限を付与

すでに.gitattributesが存在する場合も、ファイル全体は上書きせず、必要な設定だけを追加します。同じ設定がすでに存在する場合は重複して追加されません。

Gitで管理する

作成したOpenUnity.command.gitattributesはGitで管理し、mainブランチ、またはmasterブランチに入れておきます。
OpenUnity.commandを基準となるブランチへ入れておくことで、そこから新しく作成したworktreeにも自動で含まれるようになります。
⚠️すでに作成済みのworktreeには自動で追加されないため、mainの変更を取り込むか、worktreeを作り直す必要があります。

git worktreeを使ったAI並列開発

OpenUnity.commandをmainへマージしたあと、GitHub Desktopでローカルのmainを最新の状態にします。
その後、GitHub Desktopのメニューバーから次の順番で操作します。

Repository
↓
New Worktree...
↓
worktree名とブランチ名を入力
↓
Create Worktree

たとえば、次のように機能ごとのworktreeを作成します。

TetrisGame-main
TetrisGame-player
TetrisGame-enemy
TetrisGame-ui

作成した各worktreeで自分が作業する、またはAIに実装させます。
AIを並列で動かす場合は、worktreeごとに別のAIセッションを開き、それぞれ異なる機能を担当させます。

実装した機能をUnity Editorで確認する場合は、対象worktree内のTools/OpenUnity.commandをダブルクリックします。
Terminalから実行する場合は、対象のworktreeへ移動したあとに実行します。

cd ~/Desktop/TetrisGame-worktrees/feature-player
./Tools/OpenUnity.command

注意点

worktreeごとにLibraryが生成されてしまいます。
各worktreeは異なるパスにあるUnityプロジェクトとして開かれるため、それぞれにLibraryフォルダが生成されます。
初回起動時にはImport(インポート)が発生し、worktreeの数に応じてSSD容量も使用します。

まとめ

git worktreeを使うと、機能やIssueごとにブランチと作業フォルダを分け、複数のAIへ並列で実装を任せられます。一方で、UnityプロジェクトをworktreeごとにUnity Hubへ追加する運用は、worktreeを頻繁に作成・削除する場合には手間がかかります。
OpenUnity.commandを導入すると、コマンドだけで対象のworktreeをUnity Editorで直接開けるようになります!
スクリプトをGitで管理してmainへ入れておけば、新しく作成したworktreeにも自動で含まれます。そのため、worktreeを作成した直後から、Unity Hubへ追加せずに動作確認を始められます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?