Windows/macOS/Git/Unity Collaborateを併用する

# Unity Collaborate は廃止されました
:::note alert
Unity Collaborate は廃止されました
Unity Collaborate は廃止されたのでこのエントリは歴史的な記録でしかありません
:::

## Unity のサービスについて感想

Unity Cloud Build やら UNet などもそうなんですが、ゲーム開発やお金稼ぎ(広告周り)以外のフォローについては安定運用やその後のフォローについて大分優先度低く作ってあるので、 **長期運用については信用しない方がいい** と思います。(CIについてもネットワーキングについても、自分で別のそれに強い会社が提供しているサービスを使う方が安全です。 **UnityはCIとかネットワークの会社ではない** ので)

超初期のプロトタイピングやらスピード感の求められているところに軽く使うのが良いと思います。

特に、 **ソースコード管理(ファイル管理)については、やはり git などの専門のソフトウェアの方が色々と細かいフォローがしっかりしており** 、大体の困りごとについては設定やら作法でどうにかなる一方、 **Unityはファイル管理ツールを作っている会社ではない** ので、やはりそのあたり **ゲーム開発ではない専門外の領域については明るくない** のかなと思います。

# 以下、元エントリです
----


- Git 2.24
- Unity 2019.2.19f1

# この記事の目的
- Unityを使った協業について、プログラマ側はGit デザイナ側は Unity Collaborate を利用していくスタイルを実現する為の環境設定について述べる

# tl; dr
- Unity Collaborate を master として扱う
- テキスト系のアセットは基本的に全部 lf(Unix式) を改行コードとする
- デザイナ側は特に何もする必要はない
- Windows 側の プログラマは `git config --local core.autocrlf input`
- macOS 側は特に何もする必要はない

# 背景

　Git はとても便利で優秀なツールなのですが、知らない人にとっては地獄です。学べば解決する話ですが、学習が容易ではない人を雑に否定することもできません。そこで、デザイナには Unity Collaborate を使ってもらうこととしました。

　しかし Unity Collaborate は Git ではなく、それぞれが相互に運用できるように作られていません。そこで、どうすればそれぞれ仲良くできるのか試行錯誤した結果をここに記します。

# 小技の紹介

## .collabignore

　Unity Collaborate で、管理しないファイルを指定する方法です。

- https://docs.unity3d.com/Manual/UnityCollaborateIgnoreFiles.html

　プロジェクトのルートフォルダにのみ存在できることに気をつけてください。ルートフォルダというのは Assets フォルダの直下ではなく Assets フォルダが置いてあるフォルダです。

　この運用モデルの場合、デザイナ側に不必要なもの(そして、ただ存在するだけでUnity Editorの動きが悪くなるもの)をこれで指定することができます。

## .gitignore

　Gitで管理しないファイルを指定する方法です。有名すぎるので説明を省略します。

## .gitattributes

　Git の側で、どのファイルをテキストとして扱うのかを明示的に設定するファイルです。とりあえずはこう書いておけば間違いないです。

```
*.cs		text
```

## Windows において、テキスト系のファイルを取得するときに改行コードを自動変換せず、コミット時に cr+lf を lf として解釈させる

`git config --local core.autocrlf input`

- https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A

　この指定です。input は、チェックアウトするときはそのまま、コミットする際に改行コードの変換を行う指定を意味します。

　true にすると、チェックアウトするときに lf -> cr+lf を行い、コミットするときに cr+lf を lf としてファイルを格納します。

　false にすると、チェックアウトにもコミットにも一切の変換を行いません。

# 運用について

- デザイナは Unity Collaborate のみを使う
    - デザイナごとに、作業するフォルダを明確に分けておくと衝突しないので良い。また、プログラマともフォルダが明確に分かれていると良い。
- プログラマは Git のみを使う
    - いつも通りの運用です。
- Unity Collaborate と Git を両方を使い、両方の変更をまとめていく管理者をプログラマ側にひとり用意する
    - この人が頑張ります
    - 運用方針としては Unity Collaborate = Git の master となるように頑張ります。
        - master じゃなくても master 的なものを目指します(便宜的に本文書では master と呼びます)
        - 単純に言うと Unity Collaborate の最新を Restore したときに、それと master の最新が一致する状態を目指します。
        - 同様に Git から最新の master を持ってきたときに、それが最新の Unity Collaborate の状態となることを目指します。

## Unity Collaborate と Git をまとめる手順

　手順と言うほどのことではありませんが、書き出すとこうなります

1. master ブランチにする。
2. Unity Collaborate 側(デザイナ側)の変更があったら、それを Update してこちらに引っ張ってくる
3. この Update で得られたものを Git 側に commit する
4. Git 側で共有したい変更を master に merge する
5. merge した内容を modified として Unity Collaborate 側へ publish する

　このときに、このまとめ作業を行うマシンが Windows だと(macOS を使っているプログラマが混在していて autocrlf の設定が true だと)master の最新を checkout したときに、改行コードが自動的に変換されてしまい Unity Collaborate の最新と異なってしまうハマりに遭遇し、地獄になるわけです。

# 結論
- みんな Git を使えるようになって欲しい
- Git は色々設定項目があるので、最悪でも Git 側の色々設定を変更することによって無理矢理解決できることがぼちぼちある
- 歴史的経緯とはいえ、改行コードが異なっているの本当につらい。次の次の世代くらいには解決していて欲しい
- Unity Collaborate はシンプルですが、それゆえにものすごく強力で便利なものでもあるので Git などの外部管理にこだわらずに採用できるか考えてみると良いかもしれません
- Unity Collaborate ももっとオプションとか機能とか増やして欲しい…… Cloud Build に連携しなくていいので、もっとローカルなエリアで動いてくれたら嬉しい……