1. 程式人生 > >Unity自定義編譯器窗口查找腳本

Unity自定義編譯器窗口查找腳本

item arc cti 大型項目 ans using add dsc nts

在中大型項目中腳本繁多,子物體繁多,想要找到自己的腳本都掛到哪裏,尤其是剛剛接手別人的項目,這是一件令人頭疼的事。下面貼出一個小功能方便大家使用。腳本不復雜,不過卻帶來方便

註:下面的兩個腳本需要放在Editor => Tools下

using UnityEditor;
using UnityEngine;
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 UnityEditor;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

/////////////////////////////////////////////////////////////////////////////  
//查找節點及所有子節點中,是否有指定的腳本組件  
/////////////////////////////////////////////////////////////////////////////  
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);
            }
        }
    }
}

Unity自定義編譯器窗口查找腳本