Prefabの一部設定だけを変更して大量に生成したいという事が稀によくあります
いちいちコピーしながら手で設定するのは大変なので、スクリプトを書いて一発で終わらせてしまいましょう
サンプルでは、テンプレートPrefabに追加されたスクリプトHoge
に定義された変数の値をイジってPrefabを沢山複製してみます
#サンプル
HPが設定できるだけのHogeを定義しておきます
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Hoge : MonoBehaviour
{
public int hp;
}
Hoge
を追加したPrefabをTemplate
という名前でAssets直下に置いておきます
hp
をランダムで設定しながらPrefabをたくさん作ってくれるエディタ拡張です
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を表示してユーザーフレンドリーにしてもいいですね