Unity + Bitbucket + SourceTreeで数名で別々のシーンを作成後マージする

Unityで複数人で1つのシーンを作業する記事はたまに見かけますが、1人1つのシーンを担当するような記事はあまり見ません。
今回、Git管理でプログラマー数名でそれぞれ別々のシーンを作成後、1つにマージする機会がありましたのでメモしておきます。

はじめ、人数分のブランチをきってシーン作成後、Bitbucket上でプルリクエストを出してmasterブランチにマージしようとしていたのですがマージチェックがいつまでも完了しませんでした。
どうやらローカルでシーンのマージをした後、リモートにプッシュするのが正しいやり方のようです。
以下はそのやり方です。
自信無いので間違ってるとか、よりスマートな方法などがあればぜひご教示お願いします。

※環境:MacOS10.13.4, Unity2017.4.3f1, Bitbucket, SourceTree2.7.3


#UnityYAMLMergeをSourceTreeのマージツールとして設定
Sourcetree -> 環境設定 -> Diff

![sourcetree_setting.png](https://qiita-image-store.s3.amazonaws.com/0/142334/03733dd6-e390-e991-1a4d-e03a782ed8e3.png)

Diffコマンド、Mergeコマンド共に
`/Applications/Unity/Unity.app/Contents/Tools/UnityYAMLMerge`
引数共に
`merge -p $BASE $REMOTE $LOCAL $MERGED`
を設定する

#p4mergeをmergespecfile.txtに指定
[ここ](https://www.perforce.com/products/helix-core-apps/merge-diff-tool-p4merge "p4merge")のページのDLリンクからDLします。Registerは特にしません。p4mergeのみチェックしDLします。

そして
`/Applications/Unity/Unity.app/Contents/Tools/mergespecfile.txt`
を開きます。
下の画像のように、unity use句とprefab use句、そしてApple File Mergeのところに変更をかけます。
![mergespecificfile.png](https://qiita-image-store.s3.amazonaws.com/0/142334/50391e1d-e88a-8f86-b46b-0ee9e39ed68f.png)

それでは新規にUnityプロジェクトを作っていきます

#BitbucketでUnityプロジェクトを作成し、ブランチをきる

まず下の画像のように、Unity新規プロジェクトでmain(scene1)を作ってmasterにプッシュします。
そしてそのmasterを親とするブランチscene2とscene3を切ります。
ブランチscene2にはこれからscene2を追加、
ブランチscene3にはこれからscene3を追加しようというわけです。

この時にUnityの設定で、Editor -> Project Setting -> EditorでVersion ControlをVisible Meta File, Asset SerializationをForce Textにします。こうするとprefabやsceneといったバイナリフォーマットのファイルをテキストで確認する事ができるようになるようです

![branches.png](https://qiita-image-store.s3.amazonaws.com/0/142334/6a2c1600-9d7f-b34c-f342-e5af41dcd391.png)

<img width="637" alt="unity_setting.png" src="https://qiita-image-store.s3.amazonaws.com/0/142334/1dd0a119-29fa-ccdf-6d0b-0cafc6ceeb9b.png">


#各ブランチで担当シーンを実装->コミット->プッシュ
(SS撮り忘れちゃいました...)scene2実装担当者は、Sourcetreeのブランチでリモート->scene2をダブルクリックでブランチscene2をローカルにチェックアウトします。
* リモートブランチの表示更新がされていない場合は、masterブランチで一度プルをかけた方がいいかもしれません

同じく、scene3実装担当者は、Sourcetreeのブランチでリモート->scene3をダブルクリックでブランチscene3をローカルにチェックアウトします。そしてUnityを開いてシーンの実装作業をしていきます。下の画像はscene3の場合です


![unity_scene3.png](https://qiita-image-store.s3.amazonaws.com/0/142334/4c679edf-8176-626b-ed6e-30ddd07ea4f4.png)

Unityで担当シーンを作成したら、Sourcetreeでコミット->プッシュします

![commit_scene3.png](https://qiita-image-store.s3.amazonaws.com/0/142334/f54eb6a6-e10e-b9ee-8bf2-2fa2110504ed.png)

ここまでやると、Bitbucket上はこのような状態になります。枝分かれしちゃってますのでこれをマージしたいわけです。

![commits.png](https://qiita-image-store.s3.amazonaws.com/0/142334/c337645c-10cd-9f19-d30c-297f9617e1ea.png)

#ローカルでブランチをマージ
今回はscene2実装担当者がリモートのscene3ブランチをローカルにプルしてマージする事にします。
![checkout_scene3_to_scene2.png](https://qiita-image-store.s3.amazonaws.com/0/142334/34d9e050-1148-4d41-677a-07d199ee4055.png)

マージ先がscene2,マージ元がscene3なので、現在の作業リポジトリをscene2に切り替えます。
![sourcetree_scene2_scene3.png](https://qiita-image-store.s3.amazonaws.com/0/142334/eafceb20-110a-105f-5812-41a35e61c39d.png)


マージ->ログからマージ->scene3選択->該当コミット選択->OK
![sourcetree_merge.png](https://qiita-image-store.s3.amazonaws.com/0/142334/f988ae04-56db-f605-94a1-4ab1266db8d7.png)



#コンフリクトを解決する
Uncommitted Changeを選ぶと、下の画像のように、！マーク(コンフリクト有)のファイルがある事がわかります。1つ1つ解消していきます。まずassetdatabase3はマージツールで開く事ができないので、「自分の変更を使って解決」か「相手の変更を使って解決」かどちらかで解決します。

![conflict_assetdatabase3.png](https://qiita-image-store.s3.amazonaws.com/0/142334/ef9b19ee-d898-f9b0-3362-79b4f90af5ca.png)

CurrentLayoutとLastSceneSetupについてはp4mergeで開けるので「外部マージツールを起動」を選択します。
見方は左から「マージ先の内容」「共通の親の内容」「マージ元の内容」
下が「コンフリクト解決後の内容」です

![conflict_currentlayout.png](https://qiita-image-store.s3.amazonaws.com/0/142334/c735928b-6a24-8695-bc21-d0e52bd9f1b6.png)

![conflict_lastscenesetup.png](https://qiita-image-store.s3.amazonaws.com/0/142334/7e4813be-a2e6-84cc-8520-469936540b03.png)

#リモートにプッシュ
下の図のようにコンフリクトが全て消えたら、Unityで開いてシーンのマージが出来ているか確認します。場合によってはDefaultLayoutの再設定が促されたり、Rebuildが必要になるかもしれません。

![sourcetree_after_merged.png](https://qiita-image-store.s3.amazonaws.com/0/142334/d05719da-973f-1991-3cf3-ba9df11b7cfc.png)

![unity_merged_scenes.png](https://qiita-image-store.s3.amazonaws.com/0/142334/b83bb6d6-4c8f-d18f-ae8e-14d6cbc16d09.png)

問題ない事が確認出来たら、リモートにプッシュします。この時点でマスターにまでプッシュしてしまうかどうかは運用状況に寄るかと思います。
![push_after_merged.png](https://qiita-image-store.s3.amazonaws.com/0/142334/36f740c8-572a-5a2f-af4a-da7ed836bcd3.png)

Bitbucketでも下の図のように確認出来ました
![bitbucket_after_merged.png](https://qiita-image-store.s3.amazonaws.com/0/142334/ff057204-f8f3-a10c-fb71-cd50b41d8058.png)

以上です。
ただ単にシーンを追加しただけなので、実際はもっと色々大変な事があると思います...

参考URL:
http://tsubakit1.hateblo.jp/entry/2015/05/14/040852
https://muzigram.muzigen.net/2017/06/unitysceneprefabunityyamlmerge.html
http://labs.gree.jp/blog/2015/04/13836/
http://wadahiro.hatenablog.com/entry/20111115/1321372150

Windowsならp4mergeじゃなくMeldでもいいと思います
https://www.youtube.com/watch?v=EQB-N-ClO9g

*あと、この記事用に話を簡単にする為にそれっぽくブランチを切りましたが、GitFlowを織り交ぜてちゃんとした方がより良い運用だと思いました
https://qiita.com/Sansuusetto/items/90b602f25f49016188d3