当我们在EditMode下需要用脚本批量添加prefab时,可以用
PrefabUtility.InstantiatePrefab(prefab) as GameObject;
注意:如果用GameObject.Instantiate来创建,创建的不是prefab。也就是说当我们在Assets中修改prefab时,Scene中的prefab并不会做相应的修改。
下面是一个在EditMode下自动生成prefab并自动排序的脚本
using UnityEngine;
using UnityEditor;
using System.Collections;
[ExecuteInEditMode]
public class shuzu : MonoBehaviour {
public GameObject prefab;
public int weidu = 10;
public bool reset = false;
public bool sort = false;
// 由于unity中的二维数组无法在Inspector中显示,所以用下面的形式代替二维数组
[System.Serializable]
public class test
{
public gridId[] testids;
}
public test[] ids;
void Update()
{
if (reset) {
resetnow();
reset = false;
}
if (sort) {
sortnow ();
sort = false;
}
}
// 生成prefab,并作为该object的子object。
// 同时关联到二维数组中(此步骤是为了排序用)
void resetnow()
{
while (transform.childCount > 0)
DestroyImmediate (transform.GetChild (0).gameObject);
foreach (test t in ids) {
t.testids = new gridId[weidu];
for(int i = 0; i < weidu; i++){
// 创建prefab
GameObject o = PrefabUtility.InstantiatePrefab(prefab) as GameObject;
o.transform.parent = transform;
o.transform.localScale = Vector3.one;
t.testids[i] = o.GetComponent<gridId>();
}
}
}
// 按照二维数组中的顺序,依次排开prefabs
void sortnow()
{
int row = 0;
int col = 0;
Bounds bon = NGUIMath.CalculateRelativeWidgetBounds(ids[0].testids[0].transform);
foreach (test t in ids) {
col = 0;
foreach(gridId ele in t.testids) {
float depth = ele.transform.localPosition.z;
ele.transform.localPosition = new Vector3(bon.size.x * col, -bon.size.y*row, depth);
col++;
}
row++;
}
transform.localPosition = new Vector3 (-bon.size.x / 2 * (weidu - 1),
bon.size.y / 2 * (ids.Length - 1), 0);
}
}