Unity-Find-Script-References 查找脚本的引用

背景:

有时候我们需要找出项目中所有的引用到某个脚本的地方(比如Prefabs/Scene GameObjects等)。当项目比较大时,手工寻找还是非常费时费力的事情。本文尝试通过插件自动搜索。

分析:

基本的思路是:首先筛选出项目中全部Prefab,加载每个Prefab并判断是否有挂载目标脚本,然后载入每个场景,判断场景中每个物体是否有挂载目标脚本,最后列出结果。

实现:

1,在右键菜单项中添加菜单:

新建一个类,命名为 FindScriptRef ,并继承自 EditorWindow 。添加如下方法:

[MenuItem(“Assets/Find All Reference”)]
public static void ShowWindow()
{
 //Show existing window instance. If one doesn’t exist, make one.
 EditorWindow.GetWindow(typeof(FindScriptRef));
}

这段代码会在菜单中添加一个名为“Find All Reference”的菜单项。选中菜单项会打开一个FindScriptRef窗口实例。当然此时窗口中没有任何内容。

2,窗口基本显示逻辑:

void OnGUI()
{
 if (Selection.activeObject == null)
 {
 GUILayout.Label(“select a script file from Project Window.”);
 return;
 }

//判断选中项是否为脚本
var name = Selection.activeObject.name;
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
var dict = System.IO.Path.GetDirectoryName(assembly.Location);
assembly = System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(dict, "Assembly-CSharp.dll"));
var selectType = assembly.GetType(name);
if (string.IsNullOrEmpty(name) || selectType == null)
{GUILayout.Label("select a script file from Project Window.");return;
}GUILayout.BeginVertical();
GUILayout.BeginHorizontal();//列出脚本名称和“Find”按钮
GUILayout.Label(name);
bool click = GUILayout.Button("Find");
GUILayout.EndHorizontal();
GUILayout.Space(10);//列出搜索结果
if (findResult != null && findResult.Count > 0)
{GUILayout.BeginScrollView(Vector2.zero, GUIStyle.none);foreach (string path in findResult){GUILayout.Label(path);}GUILayout.EndScrollView();
}if (click)
{Find(selectType);
}
GUILayout.EndVertical();

}

然后,实现Find方法,搜索指定Type的全部引用:

void Find(System.Type type){

//step 1:find ref in assets//filter all GameObject from assets(so-called 'Prefab')
var guids = AssetDatabase.FindAssets("t:GameObject");findResult = new List<string>();var tp = typeof(GameObject);foreach (var guid in guids)
{var path = AssetDatabase.GUIDToAssetPath(guid);//load Prefabvar obj = AssetDatabase.LoadAssetAtPath(path, tp) as GameObject;//check whether prefab contains script with type 'type'if (obj != null){var cmp = obj.GetComponent(type);if (cmp == null){cmp = obj.GetComponentInChildren(type);}if (cmp != null){findResult.Add(path);}}
}//step 2: find ref in scenes//save current scene
string curScene = EditorApplication.currentScene;
EditorApplication.SaveScene();//find all scenes from dataPath
string[] scenes = Directory.GetFiles(Application.dataPath, "*.unity", SearchOption.AllDirectories);//iterates all scenes 
foreach (var scene in scenes)
{EditorApplication.OpenScene(scene);//iterates all gameObjectsforeach (GameObject obj in FindObjectsOfType<GameObject>()){var cmp = obj.GetComponent(type);if (cmp == null){cmp = obj.GetComponentInChildren(type);}if (cmp != null){findResult.Add(scene.Substring(Application.dataPath.Length) + "Assets:" + obj.name);}}
}//reopen current scene
EditorApplication.OpenScene(curScene);
Debug.Log ("finish");

}

此时切换到Unity,在Project窗口选中一个scrpit,右键选择『Find All Reference』,在打开的窗口选择『Find』按钮,即可看到下面列出了所有引用了这个脚本的位置(如果项目过于庞大,可能需要等待一会儿)。

代码下载:[FindScriptRef.cs]({{ site.url }}/files/FindScriptRef.cs “FindScriptRef.cs”)



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

remove是什么意思计算机语言,remove是什么意思?remove是什么意思?

remove()是C语言中的函数&#xff0c;一般作用是删除数组、链表对象所有的元素。函数原型是intremove(char*filename)。函数功能remove()函数用于删除指定的文件&#xff0c;其原型如下&#xff1a;int remove(char *filename);函数声明2&#xff1a;templateinline bool remov…

Unity3D_NGUI_安卓APK安装包瘦身实践

减包瘦身是个精细活。本文整理了0907版本操作过程&#xff0c;以备日后参考。 经过一番折腾&#xff0c;各位攻城狮的努力&#xff0c;美术设计师的支持&#xff0c;策划爷的理解&#xff0c;UI资源&#xff08;图集、字体、单局外模型贴图&#xff09;从45.4MB减少到24.5MB。如…

太原理工大于丹计算机,于丹作客太原理工大 给4000理科生讲佛学

中新网太原5月17日电(贾子娴)17日&#xff0c;著名文化学者于丹走进太原理工大学清泽讲坛&#xff0c;为近4000名师生作了一场题为“阅读经典 感悟成长”的讲座&#xff0c;并引用佛道教中的若干经典来领悟、指导人生。于丹认为&#xff0c;在这纷繁复杂的中国社会中无论男女老…

Unity3D之Shader自定义编辑器功能拓展

一、前言最近在开发一个关卡类的游戏&#xff0c;在导入一些3D物体的时候&#xff0c;发现很多时候同一个3D物体需要渲染的方式不一样&#xff0c;比如这颗树要双面渲染&#xff08;Cull Off&#xff09;&#xff0c;但在很多情况下是可以剔除背面&#xff08;Cull Back&#x…

零基础怎么学好计算机函数,零基础要学会的15个常用函数

这些函数是最基本的&#xff0c;但应用面却非常广&#xff0c;学会这些基本函数可以让工作事半功倍。1、SUM加法是最基本的数学运算之一。函数SUM就是用来承担这个任务的。SUM的参数可以是单个数字、一组数字。因此SUM的加法运算功能十分强大。统计一个单元格区域&#xff1a;s…

理解依赖注入(IOC)

IOC:英文全称&#xff1a;Inversion of Control&#xff0c;中文名称&#xff1a;控制反转&#xff0c;它还有个名字叫依赖注入&#xff08;Dependency Injection&#xff09;。 作用&#xff1a;将各层的对象以松耦合的方式组织在一起&#xff0c;解耦&#xff0c;各层对象的调…

局域网win7计算机如何互访,局域网win7电脑的互访步骤

局域网win7电脑的互访步骤Windows7如何实现局域网内的互访?下面是局域网win7电脑互访的步骤&#xff0c;为大家提供参考。步骤一&#xff1a;同步工作组 不管使用的是什么版本的Windows操作系统&#xff0c;第一步&#xff0c;要保证联网的各计算机的工作组名称一致步骤二&…

服务器自动挂载硬盘,Linux硬盘分区及开机自动挂载

本文以CentOS 6.4为例&#xff0c;查看当前linux服务器分区&#xff1a;df -h查看当前linux服务器硬盘&#xff1a;fdisk -l/dev/sda 第一块硬盘/dev/sdb 第二块硬盘依此类推以/dev/sdb为新增硬盘为例&#xff0c;需要进行以下操作方可正常使用1、分区fdisk /dev/sdb依次输入n&…

GPU Pro2 - 1.Terrain and Ocean Rendering with Hardware Tessellation

最近时间多了起来&#xff0c;准备捡起扔下了的渲染部分的知识。想拜读下GPU Pro系列并且做个笔记&#xff0c;不知道自己能否坚持下来&#xff0c;但愿可以吧。自己能力也有限&#xff0c;写的东西也只是自己的理解&#xff0c;肯定有很多理解不到位甚至错误的地方&#xff0c…

更改微软更新服务器地址,更新服务 | Microsoft Docs

您现在访问的是微软AZURE全球版技术文档网站&#xff0c;若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站&#xff0c;请访问 https://docs.azure.cn.更新服务10/21/2020本文内容使用指定的更新说明更新 Service Fabric 服务。此 API 允许更新正在运行的 Service…

GPU Pro2 - 3.Procedural Content Generation on the GPU

GPU Pro2 - 3.Procedural Content Generation on the GPU 这篇文章着重介绍了基于Brownian 噪声和高度图在GPU中实时生成和渲染无限大地形系统。 Procedural content generation (PCG)程序化生成在许多游戏中已经有广泛应用&#xff0c;从简单的随机物体摆放&#xff0c;到全…

巨控 自建服务器,GRM云服务器的Web数据接口.PDF

GRM云服务器的Web数据接口.PDFGRM 云服务器的 Web 数据接口版本2.092019-06-281目录一&#xff0e;系统简介31.客户端的操作原理32.客户端登录的推荐作法43.历史数据的容量档次5二&#xff0e;客户端操作命令说明61.[登录] 62.[读变量] 63.[重复上次读] 74.[写变量] 75.[枚举变…

GPU Gems1 - 1 用物理模型进行高效的水模拟(Effective Water Simulation from Physical Models)

该读书笔记大多内容参照了大神浅墨的该篇文章https://zhuanlan.zhihu.com/p/35974789 本章介绍了一种在GPU中模拟和渲染大的水体的系统。它把基本网格的集合波动于动态发现贴图的生成结合起来。 1.1 目标和范围 这章里&#xff0c;我们将由计算简单正弦函数之和开始&#xf…

GPU Gems1 - 2 水刻蚀的渲染

2.1 引言 光线从弯曲的表面反射或折射&#xff0c;因此只聚焦在受光面上的某些区域&#xff0c;于是就产生了刻蚀现象。本文从美学角度出发&#xff0c;不以纯物理的方式计算&#xff0c;使其很容易在大多数图形硬件上实现&#xff0c;效果又十分逼真。 2.2 刻蚀的计算 如果想…

邮箱服务器ip地址白名单,申请SSL证书时如何设置IP地址白名单和邮箱白名单

8月3日消息 在申请SSL证书时&#xff0c;由于您的邮箱可能默认设置或自定义设置了拦截国外邮件&#xff0c;可能会导致您接收不到CA的邮件&#xff0c;给验证、收取证书带来了不便&#xff1b;如果服务器&#xff0c;防火墙也设置了拦截操作&#xff0c;那么即使您按CA要求完成…

求生2本地服务器怎么修改参数,《求生之路2》服务器指令及难度参数设置(难度篇)...

本文整理的都是一些有关难度的服务器参数命令,许多插件都会用到这些相关的指令实现一些功能,比如是购物插件中技能的实现,彩色坦克插件掉宝配置的实现等.安装了插件这些指令可以直接使用,可以根据自己对于难度的需要作一些调整,关于作弊.榴弹炮参数的一些指令,没有收录.服务器命…

GPU Gems1 - 3 Dawn Demo中的皮肤渲染(Skin in the Dawn Demo)

该篇文章参照浅墨的这篇文章&#xff1a;https://zhuanlan.zhihu.com/p/35974789 Dawn是由NVIDIA创建的&#xff0c;用来介绍GeForce FX产品线的演示程序&#xff0c;它说明如何使用可编程的着色技术创建出逼真的人类角色。 最初的Dawn Demo由NVIDIA于2002年发布&#xff0c;…

jest测试ajax,ajax – 如何使用Jest来测试React呈现的异步数据?

我正在使用React for render和Jest / Jasmine进行测试.我使用旧的Jest / Jasmine等待测试并运行,但现在这些已经在Jasmine 2中消失了,我不知道如何用新的asyncs替换.在我的代码中,React呈现了一个关于用户的小页面.该页面有一个AJAX调用来获取用户帖子.我想测试一下用户的帖子回…

GPU Gems1 - 5 改良的Perlin噪声的实现

Perlin 噪声 KenPerlin(1985a,2002)KenPerlin(1985a,2002) 定义的噪声函数是最常用的噪声函数&#xff0c;称为 Perlin 噪声。PerlinPerlin 噪声在全部 (x,y,z)(x,y,z) 整形顶点处的参数值都为 00&#xff0c;变化源自各顶点间的梯度向量&#xff0c;然后再进行平滑插值。 计算…

GPU Gems1 - 7 无数波动草叶的渲染

本文部分参照该文章https://zhuanlan.zhihu.com/p/35974789 1.引言 本章介绍了一种灵活的&#xff0c;广泛应用的草模拟。该方案渲染的草不仅生长得自然&#xff0c;也能够逼真地在风中舞动&#xff0c;而且性能很高。 2.概述 首先&#xff0c;需要意识到&#xff0c;对单个…