生成 、修改预制体属性 所用到的API

PrefabUtility.SaveAsPrefabAsset(GameObject instanceRoot, string assetPath);

PrefabUtility.SavePrefabAsset(GameObject asset);

AssetDatabase.LoadAssetAtPath(string assetPath, Type type);

AssetDatabase.SaveAssets();

AssetDatabase.Refresh();

具体用法:

一、制作预制体

获取预制体所需源文件路径(源文件最好放在Resources文件夹内方便加载,等制作完成后可以移动到合适位置)

主要方法:

1)、获取路径下的所有文件夹

        /// <summary>/// 获取路径下的所有文件夹/// </summary>/// <param name="path"></param>/// <returns></returns>private string[] GetAllFolder(string path){try{string[] dirs = Directory.GetDirectories(path, "*");string[] folderName = new string[dirs.Length];for (int i = 0; i < dirs.Length; i++){string file = dirs[i].Split('\\')[1];folderName[i] = file;}return folderName;}catch (System.Exception){return null;}}

2)、获取文件下的文件

        /// <summary>/// 获取路径下的 Obj/// </summary>/// <param name="path"></param>/// <returns></returns>private GameObject GetFileObj(string path){GameObject go = Resources.Load<GameObject>(path);if (go != null){return go;}else{Debug.Log(path);return null;}}

3)、实践:

导入需要制作预制体的源文件,查看文件结构

新建Editor 文件夹 并创建脚本 MakePrefab

public class MakePrefab : EditorWindow
{[MenuItem("Tools/MakePrefab")]public static void CreatePrefabWindow(){EditorWindow window = EditorWindow.GetWindowWithRect(typeof(MakePrefab), new Rect(Screen.width / 3, Screen.height / 3, 800, 500), true, "MakePrefab");window.Show();}
}

绘制面板

 private static string toSavePrefabPath = "Assets/Entities";private void OnGUI(){EditorGUILayout.LabelField("预制体保存路径::", toSavePrefabPath, GUILayout.Width(110));toSavePrefabPath = EditorGUILayout.TextArea(toSavePrefabPath, GUILayout.Width(250));if (GUILayout.Button("转换预制体", GUILayout.Width(260))){ToPrefab();}if (GUILayout.Button("修改预制体", GUILayout.Width(260))){ModifyPrefab(toSavePrefabPath);}}

效果展示

制作预制体

private void ToPrefab(){string path = "Assets/Resources";string[] allFolder1 = GetAllFolder(path);if (allFolder1 == null)return;//循环次数取决于 ,源文件的目录结构 ,此处为 4 级结构for (int i = 0; i < allFolder1.Length; i++){string path2 = $"{path}/{allFolder1[i]}";string[] allFolder2 = GetAllFolder(path2);if (allFolder2 == null){return;}for (int j = 0; j < allFolder2.Length; j++){string path3 = $"{path2}/{allFolder2[j]}";string[] allFolder3 = GetAllFolder(path3);if (allFolder3 == null)return;for (int k = 0; k < allFolder3.Length; k++){string path4 = $"{path3}/{allFolder3[k]}";string[] allFolder4 = GetAllFolder(path4);Debug.Log($"编号:{k}     {allFolder3[k]}文件下有        {allFolder4.Length}       个文件夹!");if (allFolder4 == null)return;if (!Directory.Exists(toSavePrefabPath)){Directory.CreateDirectory(toSavePrefabPath);}for (int l = 0; l < allFolder4.Length; l++){string speedTree = $"{path4}/{allFolder4[l]}/{allFolder4[l]}";string[] strs = Regex.Split(speedTree, path + "/", RegexOptions.IgnoreCase);GameObject go = Instantiate(GetFileObj(strs[1]));go.name = go.name.Replace("(Clone)", string.Empty);//给预制体添加脚本,修改属性//go.transform.tag = "Model";if (go.GetComponent<BoxCollider>() == null)go.AddComponent<BoxCollider>();if (go.GetComponent<Rigidbody>() == null)go.AddComponent<Rigidbody>();go.GetComponent<Rigidbody>().isKinematic = true;string modeName = allFolder4[l].Split('_')[0];PrefabUtility.SaveAsPrefabAsset(go, $"{toSavePrefabPath}/{modeName}.prefab");DestroyImmediate(go);}AssetDatabase.Refresh();}}}}

效果展示

二、修改预制体:

当预制体中的某个属性设置错误的时候,比如 IsKinematic 属性时,需要统一修改这个属性

    /// <summary>/// 修改预制体/// </summary>/// <param name="path"></param>private void ModifyPrefab(string path){//获取文件下所有预制体文件DirectoryInfo info = new DirectoryInfo(path);FileInfo[] fileInfos = info.GetFiles("*.prefab");List<GameObject> prefabs = new List<GameObject>();foreach (var item in fileInfos){string paths = $"{path}/{item.Name}";GameObject prefab = AssetDatabase.LoadAssetAtPath(paths, typeof(GameObject)) as GameObject;prefabs.Add(prefab);}//修改属性for (int i = 0; i < prefabs.Count; i++){if (prefabs[i].transform.childCount > 0 && prefabs[i].transform.GetChild(0) != null){if (prefabs[i].GetComponent<Rigidbody>() != null){prefabs[i].GetComponent<Rigidbody>().isKinematic = false;                 PrefabUtility.SavePrefabAsset(prefabs[i]);                  }              }          }AssetDatabase.SaveAssets();AssetDatabase.Refresh();}

效果展示

这样所有的预制体都已经制作完成啦,以及后续修改里面的属性!

Unity 一键制作预制体,一键修改预制体相关推荐

  1. Unity一键制作预制体Prefab一键修改Prefab属性

    1.适用于制作多个预制体(一个模型文件下面几百个子物体,都需要制作成预制体,这一个一个拖不是要炸裂) 模型资源如下图 ![请添加图片描述](https://img-blog.csdnimg.cn/63 ...

  2. 【Unity】由预制体实例获取预制体资源及预制体资源路径

    [Unity]由预制体实例获取预制体资源及预制体资源路径 Unity中一个预制体对象可能处于3种状态: 位于Project中,是PrefabAsset: 位于Scene中,是PrefabInstanc ...

  3. Unity 理解预制体(Prefab)和预制体变体(PrefabVariant)

    关于预制体的要点: 官方文档中已包含关于预制体都是详细介绍,这里不再赘述,以下要点仅供个人回顾以及总结. 官方文档快捷入口:(ง •_•)ง 预制体的创建 预制体两种修改方式 预制体实例的覆盖和撤销 ...

  4. Unity3D如何脚本修改预制体并保存

    一直忙于工作就很久没发博客了,从这周期打算一周一更,先从简单的实用的一些编辑器扩展用起. 这篇文章记录一下一个修改prefab的简单方法,只做一下Api的简单列举,用此方法可以单独或批量进行prefa ...

  5. unity预制体与非预制体的区别

    预制体: 首先预制体是预先准备好的物体,可以重复使用和利用的.就如同我们编程语言中的函数. 区别: 预制体与非预制体的区别: 在hierarchy中预制体是蓝色的,非预制体是白色的. 在inspect ...

  6. windowbuilder怎么加图片_一键制作音乐图片,这效果太惊艳了!微信这个功能简直是“宝藏”...

    试过给视频添加音乐,那你有没有试过给图片添加音乐呢?如果没有试过的话,建议你可以试试,效果绝对让你惊艳.没有加音乐的图片就只是张图片,加了音乐之后,它就有了属于自己的故事~ 一.微信自带功能 不知道大 ...

  7. 【ROM制作工具】如何三分钟学会制作手机线刷包?一键制作线刷包详细教程

    如何在最短的时间内制作一款手机线刷包让卡顿的手机线刷回官方?线刷回官方的手机刷机包在制作时有什么样的技巧?接下来将和大家分享一下如何在三分钟制作一款手机线刷包! 一键制作线刷包详细教程 准备工作: 首 ...

  8. 一键制作三维真实地形DEM

    一键制作三维真实地形 建过三维地形的同仁们都清楚,要建出一个精确的地形模型基本要靠CAD,GIS,AI这些软件协同操作.还需要下载在线底图,多重叠加分析. 如果说有一个PS插件可以在半个小时,甚至几分 ...

  9. ramos一键处理多合一_PrimoCache驱RAMOS一键制作工具四合一 V2.99版

    基于PrimoCache软件的RAMOS一键制作工具,不需要进winpe,直接以你的系统为基础制作出ramos系统,而且有4种模式可以选择,每一种都有其自己的特点,跟之前的Primo Ramdisk驱 ...

最新文章

  1. 介绍Smart Client组件网站
  2. 关于未能映射路径问题
  3. javascript跨域实践
  4. JConsole监控远程Tomcat服务器
  5. iOS开发-多线程开发之线程安全篇
  6. 浅谈 Java 字符串(String, StringBuffer, StringBuilder)
  7. android长按加入购物车,《Android APP可能有的东西》之UI篇:加入购物车动画
  8. 来学习ansibie(1)
  9. linux sd卡 分区变大,Linux 动态调整分区大小
  10. 在MVC3中怎么实现分类列表?
  11. VC6.0和VC2005项目配置详解
  12. win10下安装SQL2000
  13. uniapp button字体没有垂直居中
  14. 锁定计算机后等于睡眠吗,详细教你电脑休眠和睡眠的区别
  15. 大数据给交通行业带来的五大变革
  16. 2020面试要点大全
  17. 运维祈求不宕机_一份运维监控的终极秘籍!监控不到位,宕机两行泪
  18. 致命错误:异常代码=C0000005(这篇最详细,收藏之~)
  19. 利用VirtualBox搭建私有云
  20. python爬虫登录网站_主流网站 Python 爬虫模拟登陆方法汇总

热门文章

  1. 404丨天朝BAT者……牛么?
  2. git extensions 设置成中文
  3. 三星270E5K-X0D黑苹果安装教程
  4. 3877——鬼吹灯之黄皮子坟(螺旋矩阵)
  5. 如何免费使用Pycharm专业版
  6. 2021年云原生技术趋势
  7. Exp2 后门原理与实践 20164321 王君陶
  8. php7序列化,PHP内核层解析反序列化漏洞
  9. 基于超算平台气象预警并行计算架构研究
  10. mysql 拼音排序_MySQL按常规排序、自定义排序和按中文拼音字母排序的方法