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 ...
随机推荐
- 基于用户的最近邻协同过滤算法(MovieLens数据集)
基于用户的最近邻算法(User-Based Neighbor Algorithms),是一种非概率性的协同过滤算法,也是推荐系统中最最古老,最著名的算法. 我们称那些兴趣相似的用户为邻居,如果用户 ...
- java后台对上传的图片进行压缩
java开发中经常遇到对图片的处理,JDK中也提供了对应的工具类,不过处理起来很麻烦,Thumbnailator是一个优秀的图片处理的开源Java类库,处理效果远比Java API的好,从API提供现 ...
- 【核心核心】5.Spring【DI】注解方式
使用注解的方式依赖注入不用提供set方法 1.普通类型的注解 @Value @Value(value="春天") private String name; 2.对象类型的注解 @A ...
- html的常用标签详解1
1.<!DOCTYPE html> 文档声明,不算是标签,但是它可是不能少.这玩意是干什么用的呢? 它是向浏览器自报家门的,即告诉浏览器的解析器应该以什么样的文档类型定义(DTD)来解析它 ...
- utils03_clone远程仓库
1.Bash here 克隆方式 复制要克隆远程仓库的SSH或者HTTPS 使用Bash here克隆文件 2.使用git同步
- 在 Angularjs 中$state.go 如何传递参数
在目标页面规定接受的参数: .state('app.AttendanceEditFixed', { url: '/AttendanceEditFixed', params: {'id': null,' ...
- android服务的bindService/startService
1,高版本android已经不允许只通过action来bindService/startService,可以通过: intent.setPackage("XXXX"); 来指定服务 ...
- Twitter Storm中Topology的状态
Twitter Storm中Topology的状态 状态转换如下,Topology 的持久化状态包括: active, inactive, killed, rebalancing 四个状态. 代码上看 ...
- LINUX设置SUID,SGID,Stick bit
前面介绍过SUID与SGID的功能,那么,如何打开文件使其成为具有SUID与SGID的权限呢?这就需要使用数字更改权限了.现在应该知道,使用数字 更改权限的方式为“3个数字”的组合,那么,如果在这3个 ...
- Leetcode441Arranging Coins排列硬币
你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币. 给定一个数字 n,找出可形成完整阶梯行的总行数. n 是一个非负整数,并且在32位有符号整型的范围内. 示例 ...