背景:

有时候我们需要找出项目中所有的引用到某个脚本的地方(比如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”)

Unity-Find-Script-References 查找脚本的引用相关推荐

  1. unity双击打不开脚本_游戏对象和脚本 (创建一个时钟)

    该文章是一篇译文,附上原文链接 Game Objects and Scripts​catlikecoding.com 使用简单对象构建一个时钟 编写一个C#脚本 转动时钟的指针来显示时间 创建指针动画 ...

  2. python中的main函数可以被其他文件调用么_Python中在脚本中引用其他文件函数的实现方法...

    在导入文件的时候,Python只搜索当前脚本所在的目录,加载(entry-point)入口脚本运行目录和sys.path中包含的路径例如包的安装地址.所以如果要在当前脚本引用其他文件,除了将文件放在和 ...

  3. Python中在脚本中引用其他文件函数的方法

    在导入文件的时候,Python只搜索当前脚本所在的目录,加载(entry-point)入口脚本运行目录和sys.path中包含的路径例如包的安装地址.所以如果要在当前脚本引用其他文件,除了将文件放在和 ...

  4. Unity新建项目后打开脚本VS显示为杂项文件(项目文件夹下没有sln文件)的解决方法

    最近因为重装系统的缘故,让我这个虽然玩了几年unity 但还是很菜的菜鸡遇到了一个前所未见的问题:新建unity工程项目后所有c#脚本均显示为杂项文件:且因为没有解决方案文件,导致文件之间不能相互联系 ...

  5. Unity编译器中重编译脚本

    Unity编译器中重编译脚本(清除Unity项目缓存) 文件需要放置到Unity工程中的Editor目录下 文件名 CompilationWindow.cs public class Compilat ...

  6. C#开发Unity游戏教程之使用脚本变量

    C#开发Unity游戏教程之使用脚本变量 使用脚本变量 本章前面说了那么多关于变量的知识,那么在脚本中要如何编写关于变量的代码,有规章可循吗?答案是有的.本节会依次讲解变量的声明.初始化.赋值和运算. ...

  7. 深入比特币原理(四)——锁定脚本(locking script)与解锁脚本(unlocking script)

    通常比特币都是以虚拟货币的概念出现在大众眼前,实际上比特币是第一个真正的区块链"平台",利用它去中心化.不可篡改.可追溯等特点不光可以实现多种交易模式(如点对点交易.多重签名交易等 ...

  8. 英文文章单词自动查找脚本

    文章目录 1. 引言 2. 脚本介绍: 3. 使用前准备 4. 使用方法 5. 脚本下载 1. 引言 我们有时候会遇到一些自己比较感兴趣的英语书籍或者文章,阅读这些文章的过程中会遇到一些生词,但查找单 ...

  9. Unity实用小工具或脚本—以对象方式访问MySql数据库

    一.前言         以对象方式处理MySql数据库顾名思义就是可以将每个数据库表作为一个类,没一条数据作为一个对象来进行操作,大致思路和我上一篇文章类似,这里不再赘述.文章后有资源下载地址,所使 ...

最新文章

  1. python数据库pymysql_Python——数据库04 Python操作MySQL pymysql模块使用,python,04python,MySQLpymysql...
  2. COOKIE格式与读写相关
  3. python画直方图成绩分析-使用Python绘制直方图和正态分布曲线
  4. 跨链(5)“蚂蚁区块链”之预言机
  5. 开放中国农业-国际农民丰收节贸易会:谋定全球共同发展
  6. linux sh脚本 递增,Linux shell 脚本实现进度框
  7. SEO你所不知道的!!SEO资源人脉才是王道
  8. 前端学习(1430):ajax封装五
  9. Codeforces 815C. Karen and Supermarket【树形DP】
  10. Haproxy的安装与配置
  11. 解决css引用字体跨域问题
  12. php向浏览器输出,使PHP即时输出结果到浏览器
  13. SQL Server 2005 技术内幕之T-SQL查询——逻辑查询处理(上)
  14. webpack5学习与实战-(九)-区分开发和生产环境的配置
  15. DM7数据库ODBC的配置详解
  16. 讯飞输入法pad版x86_讯飞输入法Pad版软件下载_讯飞输入法Pad版app下载_讯飞输入法Pad版安卓下载_亲亲宝贝网...
  17. oppoa5降级教程_OPPO A5官方原厂固件rom刷机包_全量系统降级包回退包下载A.14版
  18. 《学习网站》计算机视觉领域的一些牛人博客,超有实力的研究机构等的网站链接
  19. absolute位置用法html,html/css中相对定位relative和绝对定位absolute的用法
  20. 如何通过AWS Route53注册域名

热门文章

  1. java web 树形管理_java web 后台树形菜单排序
  2. Python重现创业板指数行情
  3. 01.Python基础_菜单_快捷键_基本语法_变量_输入输出
  4. 计算机的硬盘和光盘数,磁盘与光盘介绍-计算机组成原理与汇编语言-电子发烧友网站...
  5. html dom对象常用事件,HTML Dom Event对象onkeydown事件
  6. 『设计模式』设计模式--模板方法模式
  7. linux-shell命令之mount【挂载命令】
  8. PyTorch1.0 教程 例子和书籍
  9. AngularStrap -- Popovers
  10. 机器学习实战(十四)利用SVD简化数据