- 最后登录
- 2016-10-1
- 注册时间
- 2013-12-28
- 阅读权限
- 90
- 积分
- 5805
- 纳金币
- 2954
- 精华
- 3
|
今天发现自己工程里导进来的物体上带了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);
}
|
|