LoginSignup
7
9

More than 5 years have passed since last update.

[Unity]対象のアセットと依存関係のあるアセットたちを、依存関係含めてまるごとコピーする

Last updated at Posted at 2017-04-13

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

コードはこちら → Gist - アセットを依存関係まるごとコピーするやつ.cs
Unity5.3.4p5にて動作確認しています。

  • 2017/4/14 更新
    • リファクタ
    • AssetBundle名の変更に対応
    • YAML形式かどうかを拡張子で判断していたのを、ファイルの行頭から判定するように変更
  • 2017/4/15 追記
    • やっぱなんかうまく動いてない気がするのでまた見てみます…
  • 2017/4/17 更新
    • 正常に動くようになりました

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

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

# 線は依存関係を示す

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.の処理を行うかどうかの判定を拡張子で行っていて、多分この拡張子のパターンだけだと網羅できていない所があると思います。
ここはあまりいい方法が思いつかなかったのですが、なにかいい方法があれば教えてください…

→ ファイルの行頭から判断すれば良いというアイデアを貰ったので、採用させて頂きました!

ハマったポイント

prefabの参照先のGUIDを書き換えた直後、AssetDatabase.ImportAssetをするとどうも書き換えが反映されないままインポート処理が走ってしまうようでした。
全てのファイルを書き換えた後、AssetDatabase.Refleshを走らせることで解決しました。

7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9