【Unity】【AssetBundle】gitのautocrlfをfalseにしないとWindowsとMacでAssetBundleのハッシュが異なる件

Unityでgitのautocrlfを設定しないとWindowsMacでAssetBundleのハッシュが異なる件についてまとめました。

Unity2019.3.0

AssetFileHash?

AssetFileHashとは、AssetBundleの更新判定に使われるハッシュ値です。
Assetにシリアライズされている情報が変わったりするとこの値も変わります。
AssetFileHashについては次の記事にまとめていますので、必要に応じて参照してください。

light11.hatenadiary.com

WindowsMacでAssetBundleのハッシュ値が異なる問題

いま、適当なリポジトリに、適当なUnityプロジェクトをプッシュしておきます。
中には一つだけAssetBundleを配置しておきます。

f:id:halya_11:20191218120434p:plain

ここで、Windows PCとMac PCを用意してそれぞれこのリポジトリをチェックアウトします。
そしてそれぞれのPCでAssetBundleをビルドします。

出来上がったAssetBundleのmanifestを見ると、それぞれAssetFileHashが別の値を示していることがわかります。

f:id:halya_11:20191218121530p:plain
Windows

f:id:halya_11:20191218121443p:plain:w400
Mac

同じAssetBundleをビルドしているはずなのでAssetFileHashも同一でないとおかしいです。

gitのautocrlfをfalseにする必要がある

こうなってしまう原因は、Windows版のgitのautocrlfという機能です。
これはチェックアウト時に改行コードを自動的にCRLFに変えてくれる便利機能なのですが、
WindowsだけCRLFに書き換えられてしまうためアセットの同一性判定がWin <-> Mac間でおかしくなってしまいます。

git config -lcore.autocrlf=trueとなっていたらこの機能が有効になっています。

f:id:halya_11:20191218121956p:plain

この場合、git config --global core.autocrlf falseとすればこの機能を無効化できます。
git config --global core.autocrlf inputでもOKですが、下記のフォーラムではUnityの方がfalseにすることを推奨しています。

https://forum.unity.com/threads/how-are-assetfilehashes-calculated.488550/

結果

上記の手順でautocrlfをfalseにして再度WindowsMacでチェックアウト・AssetBundleビルドを行ったところ、
WindowsMacで同じAssetFileHashが得られることが確認できました。

f:id:halya_11:20191218122520p:plain
Windows

f:id:halya_11:20191218122604p:plain:w400
Mac

参考

https://forum.unity.com/threads/how-are-assetfilehashes-calculated.488550/

qiita.com