1. k7a

    Posted

    k7a
Changes in title
+[Unity]対象のアセットと依存関係のあるアセットたちを、依存関係含めてまるごとコピーする
Changes in tags
Changes in body
Source | HTML | Preview

所用で表題のようなエディタ拡張が欲しくなったのですが、どうも無さそうな気がしたので作ってみました。
(もしかして、Unity標準の機能でできたりするんだろうか…)

コードはこちら → Gist - アセットを依存関係まるごとコピーするやつ.cs

何をするためのものなのか

例えば、こんな依存関係のアセットがあるとします

# 線は依存関係を示す

AssetA─┬─AssetB
       ├─AssetC
       └─AssetD

普通にAssetAを複製すると、こうなる…

AssetA─┬─AssetB─┬─AssetA'
       ├─AssetC─┤
       └─AssetD─┘

これを以下のように依存関係まるごと複製したいときに使えます

AssetA─┬─AssetB
       ├─AssetC
       └─AssetD

AssetA'─┬─AssetB'
        ├─AssetC'
        └─AssetD'

使い方

コピーしたいアセットをProjectウインドウ上で選択して、コンテキストメニューのDeepCopyを選ぶことで実行できます。
コピー後のファイル名は、ファイル名の接尾辞に2をつけたファイル名になります。(GUI上で変更可能にしたかったのですが、面倒なのでやめました)
ただ、あんまりテストしていないので、以下に書いてある仕組みを理解できない方は容易に使わないようにしてください。。。
特に、下の懸念点の部分も読んでおいてください。

仕組み

ソースを見るとわかりますが、System.IO名前空間を使って直接metaファイルやprefabの値を書き換えたりというなかなかアレな事をやっています。
大まかな流れとしては以下のような感じです。

  1. 選択したアセットが依存関係を持つ全てのアセットを取得
  2. 上記で取得したアセットとそのmetaファイルを複製
  3. 複製後のmetaファイルのGUIDを書き換え
  4. 複製後のprefabやanimationが持っている参照先のGUIDを、3で書き換えた複製後のGUIDに書き換え

UnityのmetaファイルとGUIDについての知識があれば理解できるかと思います。
参考: Unityの.metaファイルに書かれているguidについて - Qiita

懸念点など

あまり使いまわしたりする予定も無いので、結構適当に書いてる部分があります。
特に92行目なんですが、上記4.の処理を行うかどうかの判定を拡張子で行っていて、多分この拡張子のパターンだけだと網羅できていない所があると思います。
ここはあまりいい方法が思いつかなかったのですが、なにかいい方法があれば教えてください…