Unity3D开发之查找面板上某个脚本(包含Missing)
有时候我们须要知道某个脚本在场景上面哪里用到,或者那个脚本被删除了但又没有把相关游戏场景的关联东西删掉,那样我们就要一个脚本来查找一下了:
PS:以下两个脚本都要放到assets/Editor以下哦。。
查找missing的脚本:
using UnityEngine; using UnityEditor; public class FindMissingScriptsRecursively : EditorWindow { static int go_count = 0, components_count = 0, missing_count = 0; [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 = 0; components_count = 0; missing_count = 0; 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 = 0; 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 = 0; 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 = 0; Debug.Log("開始查找."); FindScript(root); } if(results.Count > 0){ 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); } } } }
相关的链接:
http://wiki.unity3d.com/index.php?title=FindMissingScripts
http://superherosk123.iteye.com/blog/1632627