Unity Prefab批量修改
下面实现的一个功能是对一个文件夹下的所有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批量修改相关推荐
- Unity如何批量修改材质的属性
Unity导入fbx资源文件的时候,需要修改材质的某个属性,其实修改某个属性为同一个值还是比较简单的,只需要全选所有的材质,然后在Inspector里面进行修改就行了,就会批量修改所有的材质属性. 如 ...
- Unity 编辑器批量修改Prefab
最近写了些小工具,记录和分享一下 工具 [MenuItem("Assets/工具/赋值")]public static void SetSelectedPrefabsValue() ...
- Unity 中批量修改模型材质球
实现在编辑器中,直接替换父节点下所有模型的材质球 public class CheckMaterials : MonoBehaviour {public Material mat;[ContextMe ...
- unity 编辑器窗口 批量修改文件名字
unity 编辑器批量修改.替换 文件名: 记录一下,窗口效果如下,需要选中文件,可多选 在排序的基础上增加了双排序和替换功能 代码: public class RenameFile : Editor ...
- 新发的日常小实验——使用python的PIL库批量修改图片尺寸,确保宽和高是4的倍数(Unity、PIL、Pillow、压缩)
文章目录 一.问题:图片导入Unity被调整成2的N次方 二.设置不转换成2的N次方 三.使用ETC压缩格式,图片宽高必须是4的倍数 四.使用python的PIL库批量修改图片尺寸,确保宽和高是4的倍 ...
- Unity修改批量修改名字工具
Unity修改批量修改名字工具 using System.Collections; using System.Collections.Generic; using UnityEngine; using ...
- 【Unity】多方式批量修改Tag值
本工具类主要功能: 1. 批量添加.减少Tag值: 2. 批量选择GameObject,修改Tag值 (鼠标选中场景物体或Project面板的Prefab,然后打开该窗口) 3. 查找标记任一Tag值 ...
- c语言;文件名批量修改要求可以修改整个文件内文件名或后缀名自动,ubuntu批量修改文件名字(换动画资源必用)...
Ubuntu 16.04 批量改文件名 在Ubuntu16.04下给文件批量改名可以使用rename命令. MATLAB中批量修改文件的名字 在运行matlab时有时需要用统一的文件格式,这个时候对文 ...
- 【MAXScript】3DMax批量修改贴图名及模型名
这应该是我的Coder路上的一段小插曲~~~ 一堆废话 想不到自己还会接触3DMAX的脚本语言--MAXScript.首先申明一下,本人不是建模组的,对建模什么的不甚了解.倒是想学来着,会点建模如果自 ...
最新文章
- Mongodb的的增删改查
- Bootstrap-下拉菜单
- sql之left join、right join、inner join的区别,连接自己时的查询结果测试
- 3.1.4 内存的连续分配管理方式
- springboot工程打包时将application.properties放在jar包外
- 数据结构基础(10) --单链表迭代器的设计与实现
- 排序算法(7)----桶排序
- java 求集合真子集_【同步练习】高一高中数学必修1集合的关系与元素性质
- 应用phpexcel导出excel文件后打不开的问题解决方法
- 用自己的数据集训练Mask-RCNN实现过程中的坑
- 前端MVC Vue2学习总结(八)——前端路由
- 获取本地视频url的方法
- 白盒测试技术——语句覆盖、判定覆盖、条件覆盖
- AkShare-期货数据-连续合约数据,2010年的IFO怎么获取呢?
- 51单片机的定时器/计数器
- 听吐的微信提示音终于能改了
- Be An Effective Engineer
- 大数据优化服务 黑科技创造价值 智慧旅游来势猛
- 联动报警系统服务器,社会治安综合联动报警系统
- python3 爬虫相关学习7:使用 BeautifulSoup下载网页图片到本地文件夹