在《Unity插件开发:PrefabUtility--Prefab实例引用断开和替换》中咱们使用了PrefabUtility实现了Prefab实例的引用断开和替换功能,如今咱们继续使用PrefabUtility来实现场景中全部Prefab实例的Apply功能。html
在不少状况下,咱们会在场景中修改Prefab实例,这些修改理应apply到Prefab上,可是有时候会忘记Apply,过后再去找,可能花费不少时间。或者在一些条件下,须要对场景中的一些Prefab实例进行批量修改。这时候也须要批量apply到Prefab上。app
遍历场景中全部GameObject,若是是Prefab实例,找到这个Prefab实例的Prefab根节点(可能重复,因此这里还须要过滤一下,避免重复处理),而后找到这个Prefab实例对应的Prefab,用场景中的这个物体制做一个Prefab替换掉原来的Prefab。函数
注意,上图中Directional Light是场景中的根节点,而Ticket是Prefab根节点。工具
要完成这个功能,须要用到如下几个函数:spa
[MenuItem("Tools/Prefab/ApplyAll")] public static void AllApply() { var prefabs = Object.FindObjectsOfType<GameObject>();//场景中全部GameObject var lst = new List<GameObject>();//用于避免重复的列表 foreach (var gameObject in prefabs)//遍历 { var isprefab = PrefabUtility.GetPrefabType(gameObject);//物体的PrefabType if (isprefab != PrefabType.PrefabInstance)//不是Prefab实例 continue; var prefab = PrefabUtility.GetPrefabParent(gameObject);//没有对应的Prefab(可能被删除掉了) if (prefab == null) continue; //Debug.Log(prefab); var rt = PrefabUtility.FindPrefabRoot(gameObject);//物体的Prefab根节点 if (rt == null || lst.Contains(rt))//存在且不重复 continue; lst.Add(rt);//增长到列表中 //Debug.Log(rt.name); PrefabUtility.ReplacePrefab(rt, prefab);//实现替换达到Apply的目的 } }
以上还能够增长一些过滤,好比没有修改过的物体不须要作替换等等插件
直接在工具栏,Tools->Prefab->ApplyAll便可。code
转载保留:http://www.cnblogs.com/CodeGize http://www.codegize.comhtm