Unity 2018.1 のguidかぶりに注意
Unity 2018.1 で新しくプロジェクトを作成した際に、 Scenes/SampleScene.unity
が作成され自動的に初期シーンとして開かれるようになりました。
とても便利な機能なのですが、unitypackageをexportする際には注意が必要です。
Default guid of Scenes.meta & SampleScene.unity.meta is same on every project in Unity 2018.1. So be aware of conflicting guid when you export library project. #unity3d
— mattak (@mustankatti) 2018年5月24日
はまったところ
こんな感じの構造のunitypackageをexportしたかったのですが、新規作成したプロジェクトでimportしてみると下記のようなimport画面に...
ExamplesディレクトリがScenesディレクトリに、 EnumSelectionDemo.unity
が SampleScene.unity
に認識されてしまっています.
なぜおきるのか?
unitypackageの実態はzipファイルなので、これを解凍してみるとその理由がわかります。
.unitypackage
=> .zip
に変更して、解凍してます.
guidをdirectoryとして、3つのファイルが各ディレクトリに保存されています
<guid>/asset
<guid>/asset.meta
<guid>/pathname
詳しくは下記のような感じ
- asset は実態ファイル (Sample.csのようなファイルがそのまま).
- asset.meta は対応するunityのmetaファイル.
- pathname は展開先のそのままのパスが1行書き込まれているだけ (例:
Assets/Plugins/EnumSelection/Editor/EnumSelectionDrawer.cs
)
この情報を元に.unitypackageはimportされるのですが、ここでexportした際のguidが展開先のプロジェクトのguidと一致しているとそのファイル もしくはフォルダが上書きされるという仕組みです.
つまり、今回は2つのguidがかぶっていたためにimportの認識がおかしくなっているように見えたというわけです
- Scenes.meta のguid == Examples.meta のguid
- SampleScene.unity.meta のguid == EnumSelection.unity.meta のguid
UnityEditor上でファイルやフォルダをリネームするとguidは保持したままにしてくれるので、SampleScene.unityとScenesのguidが別プロジェクトでも一致してしまっていたというわけです。
注意
通常はguidがかぶるような危険性はほぼ確率的には起こり得ないと思うのですが、Unityのデフォルトで生成される Scenes.meta と SampleScene.unity.metaはすべての新規プロジェクトで一致してしまうのでライブラリを作ってexportする際には気をつけてください..
下手をすると今後世界中のライブラリでguidの衝突が起きる可能性があるという感じです。
多分テンプレートからコピペするようなUnityの実装なので、guidを動的に生成するようにfixしてくれればこの問題はなくなると思うのですが、一旦修正されるまではexportする際のguidには注意が必要そうです.
あとでissueおくろう..
試行 8