UnityでSceneやPrefabがコンフリクトした時のUnityYAMLMergeについて

■はじめに
Unityでチーム開発する際ってみんなどうしてるんすか案件の話。
つまりは同じSceneやPrefabを触ったときにコンフリクトとか起きると思うんですけど、どうやってその問題を
解決、もしくは回避してますか?
  • 声かけて同じ物を触らないようにするのか -> 運用でカバーしてもミスは避けられない気がする。
  • git-lfsのロック機能を使うのか -> YAMLを登録するのなんかずれてる感じがしません?

■つまり?
SceneとPrefabの作業が被ってYAMLマージすか死ねますね。

■対策

あるのか?あるらしい、以下
https://docs.unity3d.com/jp/540/Manual/SmartMerge.html

■検証

今回は

Unity 5.5.1p4
SourceTree 2.5.2 (111)
の環境で試しました。

解決済みになってるのにコンフリクトが解決されてなかったりしてつらすぎる。うまく動いてなくね?というわけで調査。

* http://labs.gree.jp/blog/2015/04/13836/
* http://qiita.com/Shaula/items/ebe778c232c30aff46fd
* http://tsubakit1.hateblo.jp/entry/2015/05/14/040852

だいぶ参考にさせてもらったのですが、少なくとも自分の環境(5.5.1p4)では上記だけではうまくいかない模様。特に「auto」というファイルでツールを指定するところがうまく行きません。

フォーラムみたり
https://www.reddit.com/r/Unity3D/comments/39bdq5/how_to_solve_scene_conflicts_with_unitys_smart/

色々触ってみた結果、以下のような挙動をするらしい


  1. gitでマージする
  2. SceneやPrefabでコンフリクトが発生する。
  3. CLIならgit mergetool。SourceTreeなら外部マージツールで設定したUnityYAMLMergeを起動。
  4. マージ作業を行ってくれる
  5. どうしても解決できない更新があった場合(同じPrefabの同じパラメータを触った場合)
  6. /Applications/Unity/Unity.app/Contents/Tools/mergespecfile.txt で指定した外部マージツールを起動させる。
  7. マージツールでDiffを解消して、マージツール終了するとUnityYAMLMergeに戻り、終了。


■いろいろつまったところ

MacのデフォルトのDiffツールとUnityYAMLMergeの相性が悪い。Diffツールのファイル保存を待たず、UnityYAMLMergeが終了するのでDiffが残ったままのファイルが残り、Sceneが死ぬ。ということでP4Mergeを利用してます。

libc++abi.dylib: terminating with uncaught exception of type std::runtime_error: Cannot find transform parent for fileID
で死ぬ。ファイル削除とかそのあたりなのかなー。あんまり詳しくは見てない。

autoファイルで指定するって話があったけど、認識してくれなかった。結局app内のファイル書き換えた。←マジで?
自分はこんな感じで指定してます。
それでも、マージが失敗するときがある。何回かmergetoolを起動すると動くことがある(いやいやいや…




結論

git mergetoolやSourceTreeの外部マージツールにUnityYAMLMergeを適用。
/Applications/Unity/Unity.app/Contents/Tools/mergespecfile.txt

細かくブランチを切って、細かくマージする。に勝る対策はない感じ。
それでも、ちょっとした更新のマージならUnityYAMLMergeが吸収してくれるのではないか。という手応えはある。
ただ、情報がすくなかったり、機能が更新されたりすると、また喧々諤々としそうではあるけども。
というわけで、うまい感じのgit-flowを構築しつつ、UnityYAMLMergeを頼っていくるのがいいのかなという感じ。

Unityを触っている開発者がココらへんどうやって運用してるのかいい感じの運用やツールがあったら教えてください

このブログの人気の投稿

[Unity]「落ちたら消えるオブジェクト」の作り方

GoとDockerのお勉強 #golang #docker

Firebase と Androidで認証、ストレージ、データベース #firebase