unity如何查找某个脚本挂在了哪些物体上
在开发中往往会遇到一个问题:不知道整个场景中究竟有哪些物体挂载了某一个脚本。如果挨个查找太麻烦了,下面有一种方法可以快速找到解决这个问题。
在unity的Window里有一项Editor tests runner 选择这个会出现一个窗口:如下图:
然后点击创建脚本会有脚本自动创建在project里的Editor下。之后我们要写两个脚本(如下图)

这两个脚本代码,一个是用来盛放要被找的那些物体另个是盛放你要来查找被物体挂载的脚本:
盛放物体的代码:
using UnityEngine;
using UnityEditor;
public class FindMissingScriptsRecursively : EditorWindow
{
static int go_count = , components_count = , missing_count = ; [MenuItem("Window/FindMissingScriptsRecursively")]
public static void ShowWindow()
{
EditorWindow.GetWindow(typeof(FindMissingScriptsRecursively));
} public void OnGUI()
{
if (GUILayout.Button("Find Missing Scripts in selected GameObjects"))
{
FindInSelected();
}
}
private static void FindInSelected()
{
GameObject[] go = Selection.gameObjects;
go_count = ;
components_count = ;
missing_count = ;
foreach (GameObject g in go)
{
FindInGO(g);
}
Debug.Log(string.Format("Searched {0} GameObjects, {1} components, found {2} missing", go_count, components_count, missing_count));
} private static void FindInGO(GameObject g)
{
go_count++;
Component[] components = g.GetComponents<Component>();
for (int i = ; i < components.Length; i++)
{
components_count++;
if (components[i] == null)
{
missing_count++;
string s = g.name;
Transform t = g.transform;
while (t.parent != null)
{
s = t.parent.name + "/" + s;
t = t.parent;
}
Debug.Log(s + " has an empty script attached in position: " + i, g);
}
}
// Now recurse through each child GO (if there are any):
foreach (Transform childT in g.transform)
{
//Debug.Log("Searching " + childT.name + " " );
FindInGO(childT.gameObject);
}
}
}
盛放脚本的代码:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor; /////////////////////////////////////////////////////////////////////////////
//查找节点及所有子节点中,是否有指定的脚本组件
/////////////////////////////////////////////////////////////////////////////
public class MonoFinder : EditorWindow
{
Transform root = null;
MonoScript scriptObj = null;
int loopCount = ; List<Transform> results = new List<Transform>(); [MenuItem("Level4/Finder/MonoFinder")]
static void Init()
{
EditorWindow.GetWindow(typeof(MonoFinder));
} void OnGUI()
{
GUILayout.Label("节点:");
root = (Transform)EditorGUILayout.ObjectField(root, typeof(Transform), true);
GUILayout.Label("脚本类型:");
scriptObj = (MonoScript)EditorGUILayout.ObjectField(scriptObj, typeof(MonoScript), true);
if (GUILayout.Button("Find"))
{
results.Clear();
loopCount = ;
Debug.Log("开始查找.");
FindScript(root);
}
if (results.Count > )
{
foreach (Transform t in results)
{
EditorGUILayout.ObjectField(t, typeof(Transform), false);
}
}
else
{
GUILayout.Label("无数据");
}
} void FindScript(Transform root)
{
if (root != null && scriptObj != null)
{
loopCount++;
Debug.Log(".." + loopCount + ":" + root.gameObject.name);
if (root.GetComponent(scriptObj.GetClass()) != null)
{
results.Add(root);
}
foreach (Transform t in root)
{
FindScript(t);
}
}
}
}
有了这两个脚本,会发现unity的菜单里会多出一个level4(如图)的选项,然后点击它,会出现一个弹窗。上面那个节点(如图)就是盛放物体的,下面那个脚本类型(如图)就是放脚本的。
例如下面的案例中,我要查找一个名字叫AsyncImageDownloader的脚本在panoramic这个物体里有多少被挂载了。直接把对应的东西拖进去,然后点击find就会发现在userhead_portrait这个子物体里有这个脚本。

这种方法可以找到所有父物体下的子物体中所有的挂载。它会遍历整个父物体中个的子物体;
从下图中可以看出在panoramic这个父物体中有575个子物体,它们都被查找了一遍。可见刚才查到只有userhead_portrait上挂载了刚才要找的脚本。

unity如何查找某个脚本挂在了哪些物体上的更多相关文章
- unity音量设置(同时设置到多个物体上)——引伸语言设置
在游戏中游戏设置是一个很重要的功能,但是比如语言设置和音量设置分散在很多个物体的组件上,如果每个对应的物体都放到一个链表里,会导致程序雍总难堪,使用事件调用是最好的方式 音量存储类 SoundMana ...
- Unity3D热更新之LuaFramework篇[07]--怎么让unity对象绑定Lua脚本
前言 在上一篇文章 Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的 中,我分析了由LuaBehaviour来实现lua脚本生命周期的方法. 但在实际使用中 ...
- Python:快速查找出被挂马的文件
网站被入侵,担心被挂马,因此就想自己写个脚本来查找那些被挂马的文件 思路 需要实现准备一份未受感染的源代码和一份可能受感染的源代码,然后运行以下脚本,就能找出到底哪些文件被挂马了. 其中,主要是根据比 ...
- Unity优化方向——优化Unity游戏中的脚本(译)
原文地址:https://unity3d.com/cn/learn/tutorials/topics/performance-optimization/optimizing-scripts-unity ...
- Unity 3D开发-C#脚本语言的一些基础用法
Unity 中C#语言的一些基础用法 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lerp -- 线 ...
- unity实现3D物体上的事件监听处理
想要在3D物体上实现全套事件监听处理: OnMouse系列 OnTrigger系列 OnPointer系列 OnDrag系列 1.在相机中添加Physics Raycaster组件 2.3D物体上 ...
- 只能从脚本中调用在类定义上有[ScriptService]属性的Web服务问题的解决方案
ajax调用webservice中的接口时, 会出现[只能从脚本中调用在类定义上有[ScriptService]属性的...]的异常. 这是因为, 在.net3.5中, 访问web服务, 要对web服 ...
- shell脚本批量执行命令----必需判断上一步执行结果--没有捷径
# 注意:shell脚本批量执行命令,不能只写一个函数,然后把所有命令复制进去,之前试过这样是不行的.必须要有一个判断命令执行成功与否的语句 # 简单的命令可以不加结果判断符号,但是遇到解压包.sed ...
- Unity3d中如何查找一个脚本被挂在那些预设上面?
用一个脚本函数可以获取到选择的脚本文件被哪些预设和场景引用 [MenuItem("Assets/Tool/GetReference")] static void GetRefere ...
随机推荐
- CAS去掉HTTPS认证
如何去掉HTTPS认证? 说明:默认情况下HTTP也是可以访问CAS SERVER的,但认证,登陆,退出等操作均没有任何的效果.所以必须作出下面的修改 1.进入WEB-INF\spring-confi ...
- np一些基本操作1
##生成一个一维数组import numpy as np;nb7 = np.arange(0,100,2);print(nb7)print("======================== ...
- utils02_使用github创建一个远程仓库
1.注册github账号 https://github.com/ 2.第一次登陆需要创建一个仓库 3.在本地生成密钥和公钥 ssh-keygen -t rsa 会在当前用户下生成2个文件就是公钥和密钥 ...
- ROCR包中ROC曲线计算是取大于cutoff还是大于等于cutoff
找到对应的代码如下 .compute.unnormalized.roc.curve function (predictions, labels) { pos.label <- levels(la ...
- SpringMVC配置顺序的问题
1:web.xml:web应用一经加载,先来找他 1):指明applicationContext的位置 2):引入spring监听,ContextLoaderListe ...
- 转:fork()子进程创建
源地址:http://blog.chinaunix.net/uid-23037385-id-2565472.html fork()子进程创建 在 UNIX 系统中,用户创建一个新进程的唯一方法就是调用 ...
- phpStrom编辑器 通过 git 提交代码到 gitlab
前提: 1.已经成功安装 git: 2.将 phpstrom 和 gitlab 连接起来.参考此文章 一.在 phpstrom 中打开需要推送的项目 二.将 ‘工作区’ 代码 添加到 ‘暂存区’ 三. ...
- TZOJ 2478 How many 0's?(数位DP)
描述 A Benedict monk No.16 writes down the decimal representations of all natural numbers between and ...
- beanstalkd 消息队列发邮件
放入消息 /** * 获取beanstalk实例 * * @staticvar resource|bool $beanstalk * @return resource */ function get_ ...
- js中定义变量之②var let const的区别
var 上一篇文章有讲过,是js定义变量的关键词. 但是在es6中,新添加了两个关键词,用于变量声明的关键词:let 和const 接下来就说一下var let 和const的区别: 首先说var 用 ...