我的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相关推荐

  1. Unity Editor Toolbar 编辑器扩展

    http://www.cnblogs.com/zhaoqingqing/p/3812368.html 1.Apply to Prefab [把改动应用到Prefab] if (GUILayout.Bu ...

  2. 【Unity编辑器扩展实践】、查找所有引用该图片的预制体

    上一篇Unity编辑器扩展实践二.通过代码查找所有预制中已经查到到所有的预制体了. 然后我们就可以用这些预制体做一些其他的操作了,比如查找该预制的资源引用.可以直接遍历预制,找到预制里面的所有Imag ...

  3. Unity编辑器扩展: 程序化打图集工具

    开始前的声明:该案例中图集所使用图片资源均来源于网络,仅限于学习使用 一.前言 关于编辑器扩展相关的知识,在前面的两篇内容中做了详细的描述,链接地址: 第一篇 :Unity编辑器扩展 UI控件篇 第二 ...

  4. 【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)

    工具效果: 第一步,把psd图层转换为可编辑的节点树,并自动解析UI类型.自动绑定UI子元素: 第二步, 点击"生成UIForm"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单 ...

  5. unity shader 编辑器扩展类 ShaderGUI

    这应该unity5才出的新功能了,今天看文档时刚巧看到了,就来尝试了一下. 效果如图: shader 的编辑器扩展分为2种方法: 是通过UnityEditor下的ShaderGUI类来实现的,形式比较 ...

  6. Unity编辑器扩展之EditorWindow

    Unity编辑器扩展之EditorWindow 继承这个类的编辑器脚本可以用来创建一个编辑器窗口,类似Inspector窗口 若要在这个类中添加一些控件,可以使用GUI和GUILayout控件,还可以 ...

  7. 【Unity编辑器扩展实践】、扩展Hierarchy菜单

    扩展Hierarchy之后的效果: 我们调试战斗的时候,需要在Hierarchy界面选中对应的武将,然后操作快捷键控制武将.由于多个操作我觉得比较麻烦,就在网上查找了一下扩展Hierarchy菜单的方 ...

  8. Unity 编辑器扩展菜单

    Unity 编辑器扩展菜单 目录 Unity 编辑器扩展菜单 一.MenuItem 特性 菜单栏扩展 1.创建多级菜单 2.创建可使用快捷键的菜单项 3.创建可被勾选的菜单项 4.检查菜单是否使用 5 ...

  9. Unity编辑器扩展-生成prefab的预览图并保存为图片

    Project视图里的prefab文件都是一个蓝色的正方体,我想给它们加个预览图,暂时不知道怎么改Project视图的,但反正我想像NGUI那样有个专门的窗口存放一些常用的prefab,所以做成了如下 ...

最新文章

  1. Groovy里的setProperty和getProperty重载用法
  2. MySQL命令之mysqldump -- 数据库备份程序
  3. http 和 https_Golang设置https访问,以及http如何重定向到https
  4. 图像分块matlab程序,图像分块 matlab程序
  5. java面向对象接口实现_Java面向对象之接口
  6. LeetCode--283--移动0
  7. sql 查询的在northern最大的价值(LAT_N),小于137.2345 ,在小数点后4 位截断
  8. Sentaurus 入门之二视频教程合集
  9. Arduino MAX30102脉搏心率传感器使用教程
  10. MySQL笔记6:.frm和.myi和.myd文件详解
  11. Linux进阶之路-Ubuntu版
  12. 利用c语言switch函数制作一个简单的计算器 2021年2月7日
  13. 通过QQ邮箱的SMTP服务器发送QQ邮件至163邮箱提示“发送邮件失败”的解决方案(三种可能性,不妨一试)...
  14. python面试自我介绍_我的python面试简历
  15. springboot文件上传报错:Required request part ‘file‘ is not present
  16. Hbuildx的快捷键集合
  17. 第九章 java常用类
  18. 国际化复数形式的支持与pygettext的补丁
  19. vue 加载image图片不显示解决
  20. cadence allegro学习记录(四)

热门文章

  1. ArcGIS API for JavaScript 各个版本的SDK下载和发布 ,ArcGIS Runtime SDK for Android、ArcGIS Runtime SDK for Java等
  2. python并发编程之多进程理论知识
  3. java 年月跨度_判断两个日期的跨度是否超过一年(12个月)
  4. 学习笔记--用户管理
  5. 漏洞扫描技术实验(Nessus)
  6. Python百度指数可视化分析实战案例1
  7. 股票的基本概念:买点和卖点
  8. count 与 group by
  9. 当前行情下,真的还能“跳进”进大厂吗?
  10. U盘计算机打开文件夹变红,本地磁盘c盘变红的解决方法