纳金网

标题: 预设实例批量保存(转载) [打印本页]

作者: 刀锋狼    时间: 2014-7-23 00:15
标题: 预设实例批量保存(转载)
今天发现自己工程里导进来的物体上带了Animator,于是想起来咱有学习过雨松MOMO大神的博客,知道怎么处理。
        Unity研究院之多余的MeshCollider和Animation组件 http://www.xuanyusong.com/archives/2564
        但是呢,发现一个问题,我的场景里很多是通过预设产生的实例,批量修改以后,因为没有保存预设,最后都修改不成功。所以需要批量修改的时候同时就去保存。百度了一下都没有找到答案,没办法,自己看文档吧。
        于是结合了一个旧版本的中文文档和官方文档,终于找到了我要的答案。

        旧版本的中文文档:http://game.ceeger.com/search/
        官方文档:http://docs.unity3d.com/ScriptReference/PrefabUtility.ReplacePrefab.html
--------------------------------------------------------------------------------------------------
        插嘴一句,我用的这个旧版本的文档,和官方文档一样,可以直接搜索,官方全英文看着太累而且很慢,没效率,两边对比着看比较方便。
      
        我想要的只是一个搜索框,一点击搜索,所有有关的内容都出来,这样比较好。
-----------------------------------------------------------------------------------------------------------
        在官网上搜这个类PrefabUtility,有一个CreatPrefab方法和ReplacePrefab方法,就是靠着两个方法了。
        官方还给出了案例:http://docs.unity3d.com/ScriptReference/PrefabUtility.ReplacePrefab.html

        真是very good!

       所以,我们的预设实例批量保存的代码就有了:

[MenuItem("Tools/从选择的物体保存预设")]static public void CreatPrefab(){
        GameObject[] objs = Selection.gameObjects;
        foreach(GameObject obj in objs){
                CreatPrefab(obj);
        }
}

[MenuItem("Tools/从选择的物体保存预设", true)]
static bool ValidateCreatePrefab(){
        return Selection.activeGameObject != null;
}

[MenuItem("Tools/保存场景中的预设实例")]
public static void SavePrefabAll(){
        List<GameObject> prefabObjs = new List<GameObject>();
        //获取当前场景里的所有游戏对象
        GameObject []rootObjects = (GameObject[])UnityEngine.Object.FindObjectsOfType(typeof(GameObject));
        foreach(GameObject go in rootObjects){
                //判断是否是预设实例
                if(PrefabUtility.GetPrefabType(go) == PrefabType.PrefabInstance){
                        //获取预设根物体保存到List
                        GameObject prefabRoot = PrefabUtility.FindRootGameObjectWithSameParentPrefab(go);
                        if(!prefabObjs.Contains(prefabRoot)){
                                prefabObjs.Add(prefabRoot);
                        }
                }
        }
        foreach(GameObject go in prefabObjs){
                //这里要用自己的保存prefab的路径
                string localpath = "Assets/Prefabs/"+go.name+".prefab";
                CreatNew(go, localpath);
        }
        //保存
        AssetDatabase.SaveAssets();
}

static void CreatPrefab(GameObject obj){
        //这里要用自己的保存prefab的路径
        string localpath = "Assets/Prefabs/"+obj.name+".prefab";
        //判断预设资源是否存在
        if(AssetDatabase.LoadAssetAtPath(localpath, typeof(GameObject))){
                if(EditorUtility.DisplayDialog("预设已经存在", "是否重置?", "yes", "no")){
                        CreatNew(obj, localpath);
                }
        }
        else
                CreatNew(obj, localpath);
}

static void CreatNew(GameObject go, string path){
        Object prefab = PrefabUtility.CreatePrefab(path, go);
        PrefabUtility.ReplacePrefab(go, prefab, ReplacePrefabOptions.ConnectToPrefab);
}

作者: csxyhxing    时间: 2014-7-23 10:09
非常好           
作者: hyui    时间: 2014-7-23 16:01
Very good !
作者: wucnj    时间: 2014-7-23 16:44
感谢分享!!!
作者: 李扶风    时间: 2017-3-27 10:28
请问在这里保存了预设实例之后当程序没有运行时,预设实例还在吗?





欢迎光临 纳金网 (http://rs.narkii.com/club/) Powered by Discuz! X2.5