查看: 4395|回复: 6
打印 上一主题 下一主题

[其他] 预设实例批量保存(转载)

[复制链接]

711

主题

10

听众

5805

积分

高级设计师

Rank: 6Rank: 6

纳金币
2954
精华
3

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-7-23 00:15:42 |只看该作者 |倒序浏览
今天发现自己工程里导进来的物体上带了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);
}
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

2

主题

1

听众

81

积分

设计初学者

Rank: 1

纳金币
20
精华
0

活跃会员 灌水之王

沙发
发表于 2014-7-23 10:09:41 |只看该作者
非常好           
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2014-7-23 16:01:51 |只看该作者
Very good !
回复

使用道具 举报

无效楼层,该帖已经被删除
5#
无效楼层,该帖已经被删除
wucnj    

1

主题

1

听众

3160

积分

中级设计师

Rank: 5Rank: 5

纳金币
1065
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

6#
发表于 2014-7-23 16:44:41 |只看该作者
感谢分享!!!
回复

使用道具 举报

0

主题

1

听众

38

积分

设计初学者

Rank: 1

纳金币
2
精华
0
7#
发表于 2017-3-27 10:28:59 |只看该作者
请问在这里保存了预设实例之后当程序没有运行时,预设实例还在吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-24 07:01 , Processed in 0.101321 second(s), 37 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部