1 [ExecuteInEditMode]
2 [MenuItem("Tools/RecordPoint Add Flame")]
3 private static void RecordPointAddFlame()
4 {
5 GameObject twoSphere = AssetDatabase.LoadAssetAtPath("Assets/Resources/Prefabs/TwoSphere.prefab", typeof(GameObject)) as GameObject;
6
7 string[] ids = AssetDatabase.FindAssets("t:Prefab", new string[] { "Assets/Resources/Prefabs" });
8 for (int i = 0; i < ids.Length; i++)
9 {
10 string path = AssetDatabase.GUIDToAssetPath(ids[i]);
11 Debug.Log(path);
12 if (!path.Contains("TwoCube"))
13 {
14 continue;
15 }
16 GameObject originTwoCube = AssetDatabase.LoadAssetAtPath(path, typeof(GameObject)) as GameObject;
17 GameObject twoCube = PrefabUtility.InstantiatePrefab(originTwoCube) as GameObject;
18
19 foreach (Transform item in twoCube.transform)
20 {
21 if (item.FindChild("TwoSphere") == null)
22 {
23 GameObject ts = PrefabUtility.InstantiatePrefab(twoSphere) as GameObject;
24 ts.transform.parent = item;
25 }
26 }
27
28 var newprefab = PrefabUtility.CreateEmptyPrefab("Assets/Resources/Prefabs/TwoCube.prefab");
29 PrefabUtility.ReplacePrefab(twoCube, newprefab, ReplacePrefabOptions.Default);
30 }
31
32 AssetDatabase.SaveAssets();
33 Debug.Log("Done");
34 }
这段代码的功能是在TwoCube这个prefab的两个子对象cube上挂一个名为TwoSphere的prefab。如图

最终结果如下:

代码中为什么要使用PrefabUtility.InstantiatePrefab和PrefabUtility.ReplacePrefab,这是因为上述例子有一点比较特殊的地方,就是是一个prefab中嵌入另一个prefab。如果单纯的只是操作一个prefab是没有必要这样做的。

