下面实现的一个功能是对一个文件夹下的所有prefab批量修改,比如移除某个子物体,添加一个组件等,然后保存到另一个新的文件夹下;

如下,我们实现一个扩展窗口,用于选择源文件夹和目标文件夹;然后遍历所有的prefab,进行修改,然后保存到新文件夹下,在保存之前检查资源是否存在,如果已存在,就移除再保存新的;

首先,在unity内加载资源时用的是工程的相对路径,而对于C#的IO来说,需要用绝对路径,那么先提供一组相对路径和绝对路径之间的转换接口,如下所示,这里使用了正则替换,注意模式字符串要用@前缀标记为原义;

    public static string GetRelativePath(string path){string srcPath = path.Replace("\\", "/");var retPath =  Regex.Replace(srcPath, @"\b.*Assets", "Assets");return retPath;}public static string GetAbsolutePath(string path){string srcPath = path.Replace("\\", "/");var retPath =  Regex.Replace(srcPath, @"\b.*Assets", Application.dataPath);return retPath;}

然后就是简单的编辑器扩展功能,这里要使用PrefabUtility来进行prefab的保存,而不能使用AssetDatabase的接口;

using UnityEngine;
using UnityEditor;
using System.IO;public class ArtActorPrefabModifyWindow : EditorWindow
{public static string assetSrcFolderPath = Application.dataPath + "/Resources/Prefabs/FashionPartPrefab";public static string assetDstFolderPath = "Assets/Resources/Prefabs/FashionPartPrefabNew";[MenuItem ("====Tools====/Prefab/移除时装部件内的骨骼")]public static void ShowWindow () {EditorWindow thisWindow = EditorWindow.GetWindow(typeof(ArtActorPrefabModifyWindow));thisWindow.titleContent = new GUIContent("骨骼移除");thisWindow.position = new Rect(Screen.width/2, Screen.height/2, 600, 800);}void OnGUI(){EditorGUILayout.BeginHorizontal();EditorGUILayout.LabelField("选择源文件夹");EditorGUILayout.TextField(assetSrcFolderPath);if (GUILayout.Button("选择")){assetSrcFolderPath = EditorUtility.OpenFolderPanel("选择文件夹", assetSrcFolderPath, "");}EditorGUILayout.EndHorizontal();EditorGUILayout.BeginHorizontal();EditorGUILayout.LabelField("选择源文件夹");EditorGUILayout.TextField(assetDstFolderPath);if (GUILayout.Button("选择")){assetDstFolderPath = EditorUtility.OpenFolderPanel("选择文件夹", assetDstFolderPath, "");}EditorGUILayout.EndHorizontal();if (GUILayout.Button("开始提取") && assetSrcFolderPath != null && assetDstFolderPath != null){Seperate();}}private static void Seperate(){assetSrcFolderPath = PathUtil.GetAbsolutePath(assetSrcFolderPath);var files = Directory.GetFiles(assetSrcFolderPath, "*.prefab");string dstPath = PathUtil.GetRelativePath(assetDstFolderPath);foreach (var file in files){string srcPath = PathUtil.GetRelativePath(file);GameObject srcObj = AssetDatabase.LoadAssetAtPath(srcPath, typeof(GameObject)) as GameObject;if (srcObj == null)continue;GameObject dstObj = AssetDatabase.LoadAssetAtPath(dstPath, typeof(GameObject)) as GameObject;if (dstObj != null)AssetDatabase.DeleteAsset(dstPath);dstObj = GameObject.Instantiate(srcObj);Transform avatar = dstObj.transform.Find("Bip001");if (avatar != null) {GameObject.DestroyImmediate(avatar.gameObject);PrefabUtility.SaveAsPrefabAsset(dstObj, dstPath + "/" + srcObj.name + ".prefab");}GameObject.DestroyImmediate(dstObj);}}
}

Unity Prefab批量修改相关推荐

  1. Unity如何批量修改材质的属性

    Unity导入fbx资源文件的时候,需要修改材质的某个属性,其实修改某个属性为同一个值还是比较简单的,只需要全选所有的材质,然后在Inspector里面进行修改就行了,就会批量修改所有的材质属性. 如 ...

  2. Unity 编辑器批量修改Prefab

    最近写了些小工具,记录和分享一下 工具 [MenuItem("Assets/工具/赋值")]public static void SetSelectedPrefabsValue() ...

  3. Unity 中批量修改模型材质球

    实现在编辑器中,直接替换父节点下所有模型的材质球 public class CheckMaterials : MonoBehaviour {public Material mat;[ContextMe ...

  4. unity 编辑器窗口 批量修改文件名字

    unity 编辑器批量修改.替换 文件名: 记录一下,窗口效果如下,需要选中文件,可多选 在排序的基础上增加了双排序和替换功能 代码: public class RenameFile : Editor ...

  5. 新发的日常小实验——使用python的PIL库批量修改图片尺寸,确保宽和高是4的倍数(Unity、PIL、Pillow、压缩)

    文章目录 一.问题:图片导入Unity被调整成2的N次方 二.设置不转换成2的N次方 三.使用ETC压缩格式,图片宽高必须是4的倍数 四.使用python的PIL库批量修改图片尺寸,确保宽和高是4的倍 ...

  6. Unity修改批量修改名字工具

    Unity修改批量修改名字工具 using System.Collections; using System.Collections.Generic; using UnityEngine; using ...

  7. 【Unity】多方式批量修改Tag值

    本工具类主要功能: 1. 批量添加.减少Tag值: 2. 批量选择GameObject,修改Tag值 (鼠标选中场景物体或Project面板的Prefab,然后打开该窗口) 3. 查找标记任一Tag值 ...

  8. c语言;文件名批量修改要求可以修改整个文件内文件名或后缀名自动,ubuntu批量修改文件名字(换动画资源必用)...

    Ubuntu 16.04 批量改文件名 在Ubuntu16.04下给文件批量改名可以使用rename命令. MATLAB中批量修改文件的名字 在运行matlab时有时需要用统一的文件格式,这个时候对文 ...

  9. 【MAXScript】3DMax批量修改贴图名及模型名

    这应该是我的Coder路上的一段小插曲~~~ 一堆废话 想不到自己还会接触3DMAX的脚本语言--MAXScript.首先申明一下,本人不是建模组的,对建模什么的不甚了解.倒是想学来着,会点建模如果自 ...

最新文章

  1. Mongodb的的增删改查
  2. Bootstrap-下拉菜单
  3. sql之left join、right join、inner join的区别,连接自己时的查询结果测试
  4. 3.1.4 内存的连续分配管理方式
  5. springboot工程打包时将application.properties放在jar包外
  6. 数据结构基础(10) --单链表迭代器的设计与实现
  7. 排序算法(7)----桶排序
  8. java 求集合真子集_【同步练习】高一高中数学必修1集合的关系与元素性质
  9. 应用phpexcel导出excel文件后打不开的问题解决方法
  10. 用自己的数据集训练Mask-RCNN实现过程中的坑
  11. 前端MVC Vue2学习总结(八)——前端路由
  12. 获取本地视频url的方法
  13. 白盒测试技术——语句覆盖、判定覆盖、条件覆盖
  14. AkShare-期货数据-连续合约数据,2010年的IFO怎么获取呢?
  15. 51单片机的定时器/计数器
  16. 听吐的微信提示音终于能改了
  17. Be An Effective Engineer
  18. 大数据优化服务 黑科技创造价值 智慧旅游来势猛
  19. 联动报警系统服务器,社会治安综合联动报警系统
  20. python3 爬虫相关学习7:使用 BeautifulSoup下载网页图片到本地文件夹

热门文章

  1. QT应用编程:基于VLC开发音视频播放器(回调方式)
  2. 【C++】【Java】分别使用C++、Java语言实现将小数转换成分数形式
  3. 自己制作的扫雷小游戏
  4. 原生js实现漂浮广告
  5. 数据分析--辛普森悖论
  6. ISCC 2017 部分解题记录 By Assassin
  7. 二次开发:flowable审批流程实践与创建流程源码分析
  8. Ignite能替代mysql吗_IGNITE应用实践
  9. 大学溃败始于老实人吃亏
  10. 数据挖掘与机器学习 —— 数据挖掘