Unity自定义编译器窗口查找脚本

Posted MichaelJoker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity自定义编译器窗口查找脚本相关的知识,希望对你有一定的参考价值。

在中大型项目中脚本繁多,子物体繁多,想要找到自己的脚本都挂到哪里,尤其是刚刚接手别人的项目,这是一件令人头疼的事。下面贴出一个小功能方便大家使用。脚本不复杂,不过却带来方便

注:下面的两个脚本需要放在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自定义编译器窗口查找脚本的主要内容,如果未能解决你的问题,请参考以下文章

Unity扩展编辑器二

小白_Unity引擎_设置脚本默认打开方式/自定义界面布局保存

如何在 Toad for Oracle 中使用自定义代码片段?

Unity中timeline出现脚本错误怎么解决

Unity 手动编译 Reload脚本 减少等待时间

Unity 手动编译 Reload脚本 减少等待时间