美文网首页
查找Unity场景中有哪些对象上挂载了指定的脚本

查找Unity场景中有哪些对象上挂载了指定的脚本

作者: 万恶的意外er | 来源:发表于2019-11-12 22:47 被阅读0次

    效果展示

    在项目中的脚本存放位置

    daima.png

    因为这是编辑器辅助工具脚本,不会再项目运行时访问。

    常规做法都是放在Assets/Scripts/Editor目录下。

    因为unity默认是不会把Editor目录下的文件打包到APK/IOS中。

    当把脚本放到项目中之后,会在软件导航栏多出现Tools一栏,如下图显示


    这是因为在脚本的方法前面中增加了下面这句话
    这里的Tools 就是上面那个图片中的Tools


    下面放出完整的代码

    using UnityEngine;
    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("Tools/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场景中有哪些对象上挂载了指定的脚本

          本文链接:https://www.haomeiwen.com/subject/uircictx.html