Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

所用で表題のようなエディタ拡張が欲しくなったのですが、どうも無さそうな気がしたので作ってみました。
(もしかして、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を走らせることで解決しました。

k7a
Game & Web application Engineer
happyelements
私たちの社名「Happy Elements(幸せのもと)」の意味するものは、一緒に働く仲間たちや、サービスを受け取るユーザーの皆様、そして社会全体の感じる思いです。ゲームコンテンツ・サービスを通じて、多くの人々に感動をお届けし、人生をより豊かにすることを追求し続けています。
https://www.happyelements.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away