纳金网
标题:
预设实例批量保存(转载)
[打印本页]
作者:
刀锋狼
时间:
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://c-www.narkii.com/club/)
Powered by Discuz! X2.5