注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

Unity3D 预设实例批量保存(转载)  

2017-04-06 16:13:43|  分类: U3D |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
今天发现自己工程里导进来的物体上带了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);
}
  评论这张
 
阅读(20)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017