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

你可能感兴趣的:(unity3d)