はじめに
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へ追加せずに動作確認を始められます。