Unity查找功能编辑器扩展Searcher
我的Github:https://github.com/LanslotChung/Unity3d-Editor-Extensions
专门在Github上记录我写的一些编辑器扩展工具,这是Searcher的源码
///作者:Lanslot Chung /// QQ:1935941005 /// EMail:exlanslotchung@gmail.com /// 如有错漏或新的想法,欢迎联系本人一起探讨 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.Linq; using System.Reflection; using System.Text.RegularExpressions;public class Searcher:EditorWindow{#region Menu[MenuItem("Tools/Searcher %f")]static void ShowWindow(){var searcher = EditorWindow.GetWindow<Searcher>(true);searcher.titleContent = new GUIContent("Seacher");searcher.Show();}#endregion//采用反射的方式避免了硬编码//你可以随意添加更多的搜索方式,只需在脚本添加实现一个名为://DisplayAllGameObjectsBy+搜索方式的方法即可private enum Mode{Name,Type,FieldName,FieldValue,Tag,Layer}private Mode currentMode = Mode.Name;private string searchText = string.Empty;private List<GameObject> searchedGameObjects = new List<GameObject>();private Vector2 scrollPosition;void OnGUI(){EditorGUILayout.LabelField(new GUIContent("Keyword:"),EditorStyles.boldLabel);searchText = SearchField(searchText);//if(string.IsNullOrEmpty(searchText.Trim())) return;EditorGUILayout.LabelField(new GUIContent("Search By:"),EditorStyles.boldLabel);EditorGUILayout.BeginHorizontal(GUILayout.Width(this.position.width - 5));for(int i = 0;i < GetEnumCount(typeof(Mode));i++){string label = GetEnumItemName(typeof(Mode),i);GUI.backgroundColor = Color.white;if((int)currentMode == i)GUI.backgroundColor = Color.green;if(GUILayout.Button(new GUIContent(label))){currentMode = (Mode)i;searchedGameObjects.Clear();}}EditorGUILayout.EndHorizontal();GUI.backgroundColor = Color.white;if(GUILayout.Button(new GUIContent("Done"))){if(!string.IsNullOrEmpty(searchText)){scrollPosition = Vector2.zero;InvokeMethodByName(typeof(Searcher),"DisplayAllGameObjectBy" + currentMode.ToString(),new object[]{searchText});}}scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);if(searchedGameObjects != null){foreach(var item in searchedGameObjects){if(item == null) continue;GUI.backgroundColor = Color.white;if(Selection.activeObject == item)GUI.backgroundColor = Color.green;if(GUILayout.Button(new GUIContent(item.name))){if(item == null) continue;EditorGUIUtility.PingObject(item);Selection.activeObject = item;}}}EditorGUILayout.EndScrollView();}private void DisplayAllGameObjectByName(string name){List<GameObject> allGameObjects = GetAllSceneObjectsWithInactive();searchedGameObjects = allGameObjects.Where(go => go.name.ToLower().Contains(name.ToLower())).OrderBy(go => go.name).ToList();}private void DisplayAllGameObjectByType(string type){List<GameObject> allGameObjects = GetAllSceneObjectsWithInactive();searchedGameObjects = allGameObjects.Where(go =>go.GetComponents<Component>().Where(cp => cp.GetType().ToString().ToLower().Contains(type)).Count() > 0).OrderBy(go => go.name).ToList();}//这个方法一直很难写,始终获取不到Unity自带的Component的字段名,有好的方法可以通知我//思路:获取所有Component,取出所有的Type,并且去重,然后逐个检查Type是否包含搜索内容//只要包含了,就在所有问题中搜索Attach了这个Type的物体private void DisplayAllGameObjectByFieldName(string fieldName){List<GameObject> allGameObjects = GetAllSceneObjectsWithInactive();List<System.Type> components = allGameObjects.SelectMany(go => go.GetComponents<Component>()).Select(com => com.GetType()).Distinct().ToList();components = components.Where(com =>{var fields = com.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public).ToList();if(fields == null || fields.Count <= 0) return false;return fields.Select(fi => fi.Name.ToLower()).Contains(fieldName.ToLower());}).ToList();searchedGameObjects = allGameObjects.Where(go => go.GetComponents<Component>().Select(com => com.GetType()).Intersect(components).Count() > 0).ToList();}//同上一个方法,获取不到Unity自带的Component的字段//思路:获取所有的Component后,逐个获取Component的所有字段,判断存在字段木有,有的话对比//字段的值是否包含搜索内容,但是要记得去掉括号里的类型值,比如名为GameObject的物体会和类型//的GameObject重叠,导致搜索错误private void DisplayAllGameObjectByFieldValue(string fieldValue){List<GameObject> allGameObjects = GetAllSceneObjectsWithInactive();List<Component> components = allGameObjects.SelectMany(go => go.GetComponents<Component>()).ToList();searchedGameObjects = components.Where(com => {var fields = com.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public).ToList();if(fields == null || fields.Count <= 0) return false;return fields.Where(fi => {var value = fi.GetValue(com);if(value == null) return false;var valueName = value.ToString().ToLower();//不会写正则表达式var reg = new Regex(@"\(([^)]*)\)").Match(valueName);if(reg.Success){var valueType = reg.Result("$1");valueName = valueName.Replace("(" + valueType + ")","");}return valueName.Contains(fieldValue.ToLower());}).Count() > 0;}).Select(com => com.gameObject).ToList();}private void DisplayAllGameObjectByTag(string tag){List<GameObject> allGameObjects = GetAllSceneObjectsWithInactive();searchedGameObjects = allGameObjects.Where(go => go.tag.ToLower().Contains(tag.ToLower())).OrderBy(go => go.name).ToList();}private void DisplayAllGameObjectByLayer(string layer){List<GameObject> allGameObjects = GetAllSceneObjectsWithInactive();var possibleLayer = GetAllLayers().Where(ly => ly.ToLower().Contains(layer)).ToList();searchedGameObjects = allGameObjects.Where(go => possibleLayer.Contains(LayerMask.LayerToName(go.layer))).OrderBy(go => go.name).ToList();}#region Util//很气,Unity把这个控件给隐藏起来了private string SearchField(string value, params GUILayoutOption[] options) {MethodInfo info = typeof(EditorGUILayout).GetMethod("ToolbarSearchField", BindingFlags.NonPublic | BindingFlags.Static, null, new System.Type[] { typeof(string), typeof(GUILayoutOption[]) }, null);if (info != null) {value = (string)info.Invoke(null, new object[] { value, options });}return value;}//获取枚举类型的子项数量,用于动态UI的创建private int GetEnumCount(System.Type enumType){return System.Enum.GetNames(enumType).GetLength(0);}//获取枚举类型的名称,结合反射用于动态增加搜索方式及UIprivate string GetEnumItemName(System.Type enumType,int itemIndex){return System.Enum.GetName(enumType,itemIndex);}//用于获取所有Hierarchy中的物体,包括被禁用的物体private List<GameObject> GetAllSceneObjectsWithInactive(){var allTransforms = Resources.FindObjectsOfTypeAll(typeof(Transform));var previousSelection = Selection.objects;Selection.objects = allTransforms.Cast<Transform>().Where(x => x != null ).Select(x => x.gameObject)//如果你只想获取所有在Hierarchy中被禁用的物体,反注释下面代码//.Where(x => x != null && !x.activeInHierarchy).Cast<UnityEngine.Object>().ToArray();var selectedTransforms = Selection.GetTransforms( SelectionMode.Editable | SelectionMode.ExcludePrefab);Selection.objects = previousSelection;return selectedTransforms.Select(tr =>tr.gameObject).ToList();} //利用反射调用新增的搜索方法private void InvokeMethodByName(System.Type type,string methodName,object[] value){type.GetMethod(methodName,BindingFlags.NonPublic | BindingFlags.Instance).Invoke(this,value);}//获取所有的Layerprivate List<string> GetAllLayers(){List<string> layers = new List<string>();for(int i = 0;i <= 31;i++){var layer = LayerMask.LayerToName(i);if(layer.Length > 0)layers.Add(layer);}return layers;}#endregion }
转载于:https://www.cnblogs.com/CodeSnippet/p/8036472.html
Unity查找功能编辑器扩展Searcher相关推荐
- Unity Editor Toolbar 编辑器扩展
http://www.cnblogs.com/zhaoqingqing/p/3812368.html 1.Apply to Prefab [把改动应用到Prefab] if (GUILayout.Bu ...
- 【Unity编辑器扩展实践】、查找所有引用该图片的预制体
上一篇Unity编辑器扩展实践二.通过代码查找所有预制中已经查到到所有的预制体了. 然后我们就可以用这些预制体做一些其他的操作了,比如查找该预制的资源引用.可以直接遍历预制,找到预制里面的所有Imag ...
- Unity编辑器扩展: 程序化打图集工具
开始前的声明:该案例中图集所使用图片资源均来源于网络,仅限于学习使用 一.前言 关于编辑器扩展相关的知识,在前面的两篇内容中做了详细的描述,链接地址: 第一篇 :Unity编辑器扩展 UI控件篇 第二 ...
- 【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)
工具效果: 第一步,把psd图层转换为可编辑的节点树,并自动解析UI类型.自动绑定UI子元素: 第二步, 点击"生成UIForm"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单 ...
- unity shader 编辑器扩展类 ShaderGUI
这应该unity5才出的新功能了,今天看文档时刚巧看到了,就来尝试了一下. 效果如图: shader 的编辑器扩展分为2种方法: 是通过UnityEditor下的ShaderGUI类来实现的,形式比较 ...
- Unity编辑器扩展之EditorWindow
Unity编辑器扩展之EditorWindow 继承这个类的编辑器脚本可以用来创建一个编辑器窗口,类似Inspector窗口 若要在这个类中添加一些控件,可以使用GUI和GUILayout控件,还可以 ...
- 【Unity编辑器扩展实践】、扩展Hierarchy菜单
扩展Hierarchy之后的效果: 我们调试战斗的时候,需要在Hierarchy界面选中对应的武将,然后操作快捷键控制武将.由于多个操作我觉得比较麻烦,就在网上查找了一下扩展Hierarchy菜单的方 ...
- Unity 编辑器扩展菜单
Unity 编辑器扩展菜单 目录 Unity 编辑器扩展菜单 一.MenuItem 特性 菜单栏扩展 1.创建多级菜单 2.创建可使用快捷键的菜单项 3.创建可被勾选的菜单项 4.检查菜单是否使用 5 ...
- Unity编辑器扩展-生成prefab的预览图并保存为图片
Project视图里的prefab文件都是一个蓝色的正方体,我想给它们加个预览图,暂时不知道怎么改Project视图的,但反正我想像NGUI那样有个专门的窗口存放一些常用的prefab,所以做成了如下 ...
最新文章
- Groovy里的setProperty和getProperty重载用法
- MySQL命令之mysqldump -- 数据库备份程序
- http 和 https_Golang设置https访问,以及http如何重定向到https
- 图像分块matlab程序,图像分块 matlab程序
- java面向对象接口实现_Java面向对象之接口
- LeetCode--283--移动0
- sql 查询的在northern最大的价值(LAT_N),小于137.2345 ,在小数点后4 位截断
- Sentaurus 入门之二视频教程合集
- Arduino MAX30102脉搏心率传感器使用教程
- MySQL笔记6:.frm和.myi和.myd文件详解
- Linux进阶之路-Ubuntu版
- 利用c语言switch函数制作一个简单的计算器 2021年2月7日
- 通过QQ邮箱的SMTP服务器发送QQ邮件至163邮箱提示“发送邮件失败”的解决方案(三种可能性,不妨一试)...
- python面试自我介绍_我的python面试简历
- springboot文件上传报错:Required request part ‘file‘ is not present
- Hbuildx的快捷键集合
- 第九章 java常用类
- 国际化复数形式的支持与pygettext的补丁
- vue 加载image图片不显示解决
- cadence allegro学习记录(四)
热门文章
- ArcGIS API for JavaScript 各个版本的SDK下载和发布 ,ArcGIS Runtime SDK for Android、ArcGIS Runtime SDK for Java等
- python并发编程之多进程理论知识
- java 年月跨度_判断两个日期的跨度是否超过一年(12个月)
- 学习笔记--用户管理
- 漏洞扫描技术实验(Nessus)
- Python百度指数可视化分析实战案例1
- 股票的基本概念:买点和卖点
- count 与 group by
- 当前行情下,真的还能“跳进”进大厂吗?
- U盘计算机打开文件夹变红,本地磁盘c盘变红的解决方法