【エディタ拡張】設定を変えたPrefabを複製する

Prefabの一部設定だけを変更して大量に生成したいという事が稀によくあります
いちいちコピーしながら手で設定するのは大変なので、スクリプトを書いて一発で終わらせてしまいましょう
サンプルでは、テンプレートPrefabに追加されたスクリプトHogeに定義された変数の値をイジってPrefabを沢山複製してみます

サンプル

HPが設定できるだけのHogeを定義しておきます

Hoge.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Hoge : MonoBehaviour
{
    public int hp;
}

Hogeを追加したPrefabをTemplateという名前でAssets直下に置いておきます
スクリーンショット 2018-05-01 14.31.44.png

hpをランダムで設定しながらPrefabをたくさん作ってくれるエディタ拡張です

HogeGenerator.cs
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEditor;

public class HogeGenerator
{
    //Assets直下にTemplateがあるという想定
    static string TEMPLATE_PATH = "Assets/Template.prefab";

    [MenuItem("Hoge/ホゲを生成")]
    public static void Generate()
    {
        var template = AssetDatabase.LoadAssetAtPath(TEMPLATE_PATH, typeof(GameObject)) as GameObject;
        for(int i = 1; i <= 5; i++) { //とりあえず5回回してみる
            var prefabPath = $"Assets/Hoge{i}.prefab"; //.net4.6の書き方です
            var prefab = PrefabUtility.CreatePrefab(prefabPath, template); //複製
            //以下に"prefab"に対して行いたい変更を記述して下さい
            prefab.GetComponent<Hoge>().hp = Random.Range(10, 100);

            EditorUtility.SetDirty(prefab);
        }
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
    }
}

Hoge > ホゲを生成を実行すればHoge1~5が生成されて、それぞれにHpがランダムに設定されていると思います

軽い解説

var template = AssetDatabase.LoadAssetAtPath(TEMPLATE_PATH, typeof(GameObject)) as GameObject;

AssetDatabase.LoadAssetAtPathは関数名の通り、アセットを読み込む関数です
サンプルではPrefabをGameObjectとして読み込んでいますが、テクスチャをTexture2Dで読み込んだりとかも出来ます

var prefabPath = $"Assets/Hoge{i}.prefab"; //.net4.6の書き方です
var prefab = PrefabUtility.CreatePrefab(prefabPath, template); //複製

prefabPathでは複製するPrefabの名前まで含めてパスを記述します
PrefabUtility.CreatePrefabで先ほど読み込んだPrefab(template)を生成しています

//以下に"prefab"に対して行いたい変更を記述して下さい
prefab.GetComponent<Hoge>().hp = Random.Range(10, 100);

prefabには、複製したPrefabがGameObject型で格納されていますので好き放題に設定をしてあげます

    EditorUtility.SetDirty(prefab);
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();

詳細は割愛、おまじないという事で

以上のような使い方以外にもリソースを入れ替えたりとか、マテリアルも複製してカラー変更して適用するとか...いろいろ出来ますので、じゃんじゃん効率化していきましょう!
ProgressBarを表示してユーザーフレンドリーにしてもいいですね

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.