下面实现的一个功能是对一个文件夹下的所有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. SmartWeatherAPI C#版
  2. 代码审计——命令执行
  3. LeetCode 301. 删除无效的括号(回溯)
  4. 前端在线学习网站W3School
  5. matlab编译dll vb调用,用matlab的deploytool生成DLL,VB无法调用的问题
  6. Django的设计模式
  7. es6 string includes_蔚来初体验,蔚来ES6用车日记!开着挺轻松的
  8. 【个人笔记】OpenCV4 C++ 快速入门 06课
  9. ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
  10. OpenGl图元基本操作之点选高亮
  11. 在线作图|2分钟在线绘制三维PCOA图
  12. 揭秘北京奥运会上的中国保镖[转贴]
  13. 在线免费制图云平台架构
  14. date linux 计算日期,科技常识:linux命令详解date使用方法(计算母亲节和父亲节日期脚本示例)...
  15. 面试积累——嵌入式软件工程师面试题(非常经典)
  16. Androidstudio 连接夜神模拟器
  17. 头条流量android,今日头条的免流量看视频是怎么操作的?
  18. 双目视觉三维重构(一)————简介
  19. 验证邮箱地址和手机号码
  20. 玩转Tomcat高级篇

热门文章

  1. CUDA error: out of memory
  2. 关于spi的半双工读写和全双工读写的一些理解
  3. 网站服务器播放视频无法播放视频教程,使用nginx部署服务器来播放视频
  4. Visual Studio2017安装和使用教程(详细)
  5. python网易云单首音乐下载
  6. plsql打开sql窗口快捷键_plsql 快捷键配置
  7. SSL加速和证书卸载的配置方式
  8. 【定时同步系列9】QPSK基带调制+Gardener定时误差检测+解调误码率曲线之MATLAB并行仿真姊妹篇二
  9. 浅析黑盒测试与白盒测试
  10. SOC验证环境的启动方式