鳩の溜まり場

猫か鳩になりたい

プロジェクト間のファイル移植時にGUIDが重複した時の挙動について【Unity】

概要

1つのプロジェクトで開発していたリソースを分離して基盤となるプロジェクトに一部移植したいという状況が発生しました。
その際unitypackageを用いてリソースを移植した際にGUIDが一時的に重複したため、その時の挙動と対処法について具体例を用いて書き留めます。

環境

分離先である基盤のプロジェクトはローカル環境下にあるため、manifestファイルには該当プロジェクトへのパスが指定されています。
そのため基盤プロジェクトに加えた変更は元のプロジェクトを開いたときに即時ロードされます。

具体例

以降移植元のプロジェクトをAプロジェクト、移植先の基盤プロジェクトをBプロジェクトとします。

Aプロジェクトに存在するPlayerプレハブのPlayerVariantであるSuperPlayerプレハブがあるとします。

PlayerプレハブをBプロジェクトにunitypackageで移植すると勿論meta情報も同時に移植されるため、この時AプロジェクトのPlayerプレハブを消さないとGUIDが重複している状況が生まれます。

この状態で移植後にAプロジェクトのウィンドウを選択した場合、Bプロジェクトのパッケージに更新があることを発見してAプロジェクトが更新ファイルの確認作業に入ります。
GUIDは重複したままなのでAプロジェクトがGUIDの再割り当てを行います。
この場合、Aプロジェクト内に存在するファイルが優先されるため、BプロジェクトのGUIDが新しいものに置き換わります。

この時本来AプロジェクトのSuperPlayerがPrefabVariantの親として参照したいのはBプロジェクトに存在するPlayerですが、GUIDが置き換わっているため、Aプロジェクト内にあるPlayerを参照し続けることになります。

この問題を解決するには、移植作業で同じGUIDが2つ存在するという状態が発生する前に、Aプロジェクト側のPlayerを削除することでSuperPlayerを一時的にMissingReferenceな状態にしてからBプロジェクトに移植することで回避できます。

結論

つまり、移植作業を行う際の手順は以下の通りになります。

  1. Aプロジェクトで移植したいファイルをunitypackageでエクスポート
  2. エクスポートしたファイルをAプロジェクト内から削除
  3. Bプロジェクトにunitypackageをインポート
  4. Aプロジェクト側でBプロジェクトに移植したファイルの参照を取得できているか確認