当前位置: 首页 > news >正文

Unity3D 遍历预制体

Unity3D 遍历预制体进行批量化处理。

遍历预制体

有时候,我们需要对一些预制体资源进行批量化处理,如果每一个预制体都手动处理,就会耗费很多时间精力,也容易出错。

我们可以写一个脚本遍历预制体,对预制体进行修改,然后保存。

遍历文件路径

Editor 文件夹下创建一个脚本 TraverseAssets.cs,包含一个方法 TraversePrefab,加上 MenuItem 创建一个菜单栏按钮。

使用 Directory.GetFiles 方法,传入根目录的路径 path 和通配符 *.prefab,表示从 Assets 文件夹下获取所有以 .prefab 结尾的文件路径。

using System.IO;
using UnityEngine;
using UnityEditor;public class TraverseAssets
{public static string path = "Assets/";[MenuItem("搜索工具/遍历预制体")]public static void TraversePrefab(){var allfiles = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);foreach (var file in allfiles){Debug.Log(file);}}
}

此时,菜单栏就有了搜索工具->遍历预制体按钮了。

菜单栏按钮

点击按钮,可以看到控制台打印了预制体的路径信息。

控制台打印信息

接下来,根据路径信息,加载预制体。

使用 AssetDatabase.LoadAssetAtPath 方法,把路径传入,就可以得到一个 GameObject

using System.IO;
using UnityEngine;
using UnityEditor;public class TraverseAssets
{public static string path = "Assets/";[MenuItem("搜索工具/遍历预制体")]public static void TraversePrefab(){var allfiles = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);foreach (var file in allfiles){GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(file);if (go){Debug.Log(go.name);}}}
}

再次点击菜单栏按钮,可以看到控制台打印的是已加载预制体的名称了。

控制台打印预制体名称

修改预制体并保存

假设现在有个需求,搜索带有 SpriteRenderer 组件的预制体,把组件上的 Order in Layer 统一改成 100。

目前工程中,有两个预制体带有该组件,并且目标参数此时的值为 0。另外两个预制体没有该组件。

预制体预览

修改一下脚本,从加载出来的 GameObject 上获取 SpriteRenderer 组件,如果存在,则对 sortingOrder 进行修改,然后使用 PrefabUtility.SavePrefabAsset 方法保存预制体。

在循环结束后,使用 AssetDatabase.Refresh 对资源进行刷新。

using System.IO;
using UnityEngine;
using UnityEditor;public class TraverseAssets
{public static string path = "Assets/";[MenuItem("搜索工具/遍历预制体")]public static void TraversePrefab(){var allfiles = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);foreach (var file in allfiles){GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(file);if (go){SpriteRenderer sr = go.GetComponent<SpriteRenderer>();if (sr){sr.sortingOrder = 100;}}PrefabUtility.SavePrefabAsset(go);}AssetDatabase.Refresh();}
}

点击菜单栏按钮,可以看到预制体已经被修改了,Order in Layer 都变成了 100。

预制体修改后

至此,我们已经能够遍历资源文件夹,找出预制体,对它们统一进行需求上的处理,并保存修改。

编辑窗口

结合上一篇文章《Unity3D 自定义窗口》,我们可以制作一个窗口,把脚本里的一些参数提取出来,方便编辑。

主要是使用 EditorGUILayout.TextField 把参数呈现到文本输入框,例如 path 和 sortingOrder,在用户修改了文本输入框的内容后,这两个变量参数也会随之修改,在具体逻辑处使用这两个变量参数即可。

注意:因为文本输入框的内容是 string 类型,这里的 sortingOrder 需要使用 int.Parse 进行类型转换。

using System.IO;
using UnityEngine;
using UnityEditor;public class TraverseAssets : EditorWindow
{public static string path = "Assets/";public static string sortingOrder = "100";[MenuItem("搜索工具/遍历预制体")]public static void OpenWindow(){// 创建窗口对象TraverseAssets window = GetWindow<TraverseAssets>();// 设置窗口标题window.titleContent = new GUIContent("搜索工具");// 显示窗口window.Show();}void OnGUI(){GUILayout.Label("自定义搜索工具,可以遍历资源并修改");GUILayout.Space(10);path = EditorGUILayout.TextField("根目录", path);sortingOrder = EditorGUILayout.TextField("层级排序", sortingOrder);GUILayout.Space(10);if (GUILayout.Button("确定", GUILayout.Height(50))){TraversePrefab();}}public static void TraversePrefab(){var allfiles = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);foreach (var file in allfiles){GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(file);if (go){SpriteRenderer sr = go.GetComponent<SpriteRenderer>();if (sr){sr.sortingOrder = int.Parse(sortingOrder);}}PrefabUtility.SavePrefabAsset(go);}AssetDatabase.Refresh();}
}

现在点击菜单栏按钮,就会打开一个编辑窗口,可以修改参数,点击确定按钮就会对预制体进行修改并保存。

我们可以修改根目录,指定某个文件夹路径,对部分预制体进行修改,也可以指定层级排序,不需要修改脚本。

编辑窗口

小结

使用的方法:

  • 遍历资源文件 Directory.GetFiles
  • 根据路径加载资源 AssetDatabase.LoadAssetAtPath
  • 保存预制体 PrefabUtility.SavePrefabAsset
  • 刷新资源 AssetDatabase.Refresh

可以制作一个编辑窗口,让参数的编辑更加方便。

除了修改层级排序,还可以替换图片、修改材质等,可以自行扩展功能。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 架构师面试题系列之Mybatis面试专题及答案(36题)
  • OZON电子类目解封,OZON新品飙升榜
  • pgsql导入导出数据
  • (1)Hilt的基本概念和使用
  • 【pip】【conda】使用 `pip` 和 `conda` 生成 `requirements.txt` 文件的指南
  • 【网络安全】分析cookie实现PII IDOR
  • 人工智能与神经科学:理解大脑的新维度
  • Windows Edge浏览器的兼容性问题
  • 原型图和UI的区别与联系
  • [Java]SpringBoot快速入门
  • strlen函数模拟实现——深入理解指针(3)
  • 基于x86 平台opencv的图像采集和seetaface6的眼睛状态检测(睁眼,闭眼)功能
  • Linux开发环境搭建,虚拟机安装
  • Linux安装使用Apache(Windows下载,离线安装)
  • 构建第一个zk
  • [译]前端离线指南(上)
  • 《剑指offer》分解让复杂问题更简单
  • AHK 中 = 和 == 等比较运算符的用法
  • C++11: atomic 头文件
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • HTTP中GET与POST的区别 99%的错误认识
  • Python_网络编程
  • use Google search engine
  • vue的全局变量和全局拦截请求器
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端js -- this指向总结。
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 实现简单的正则表达式引擎
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 与 ConTeXt MkIV 官方文档的接驳
  • AI算硅基生命吗,为什么?
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (145)光线追踪距离场柔和阴影
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (独孤九剑)--文件系统
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)memcache、redis缓存
  • .NET Micro Framework初体验(二)
  • .net 设置默认首页
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • /etc/skel 目录作用
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @RequestMapping处理请求异常
  • @Transactional 竟也能解决分布式事务?
  • @Transaction注解失效的几种场景(附有示例代码)