mattak's blog

気の向くままに書く

Unity 2018.1 のguidかぶりに注意

Unity 2018.1 で新しくプロジェクトを作成した際に、 Scenes/SampleScene.unity が作成され自動的に初期シーンとして開かれるようになりました。 とても便利な機能なのですが、unitypackageをexportする際には注意が必要です。

はまったところ

f:id:mattaclj:20180524234231p:plain

こんな感じの構造のunitypackageをexportしたかったのですが、新規作成したプロジェクトでimportしてみると下記のようなimport画面に...

f:id:mattaclj:20180524234434p:plain

ExamplesディレクトリがScenesディレクトリに、 EnumSelectionDemo.unitySampleScene.unity に認識されてしまっています.

なぜおきるのか?

unitypackageの実態はzipファイルなので、これを解凍してみるとその理由がわかります。 .unitypackage => .zip に変更して、解凍してます.

f:id:mattaclj:20180524235131p:plain

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